Path: utzoo!mnetor!uunet!husc6!cmcl2!nrl-cmf!ames!necntc!ima!haddock!karl From: karl@haddock.ISC.COM (Karl Heuer) Newsgroups: comp.lang.c Subject: utime (was: abs(), utimes()) Message-ID: <3389@haddock.ISC.COM> Date: 10 Apr 88 22:47:17 GMT References: <7794@alice.UUCP> <10068@tut.cis.ohio-state.edu> <7629@brl-smoke.ARPA> <10992@mimsy.UUCP> <10195@tut.cis.ohio-state.edu> Reply-To: karl@haddock.ima.isc.com (Karl Heuer) Organization: Interactive Systems, Boston Lines: 51 In article <10195@tut.cis.ohio-state.edu> lvc@tut.cis.ohio-state.edu (Lawrence V. Cipriani) writes: [the utime() system call expects as an argument a pointer to a structure whose contents are never declared in any header file] More precisely, depending on the system utime() expects a pointer to (a) the first of two time_t objects in an array, or (b) a struct containing two time_t objects, as declared in some header file like ; or (c) such a struct, which is never declared anywhere; or (d) the first of two timeval structures in an array. Note that (a)-(c) happen to be binary compatible on most systems, and (d) actually uses the name "utimes" rather than "utime", to avoid the incompatibility. I eventually got fed up with this, and wrote the following header "utime.h", which I now use exclusively. I hereby place it in the Public Domain. (Note: I don't use interface (d) because for consistency I need to use a time_t, not a timeval. I left the definitions in, anyway.) Karl W. Z. Heuer (ima!haddock!karl or karl@haddock.isc.com), The Walking Lint ---- cut here ---- /* * A consistent interface to different flavors of utime(). * utime_t is an array type suitable for passing to utime(); * utm_atime() and utm_mtime() are lmacros to access the fields. */ #if !defined(_H_UTIME) #define _H_UTIME #if defined(MSDOS) /* and others, no doubt? */ #include typedef struct utimbuf utime_t[1]; #define utm_atime(u) ((u)[0].actime) #define utm_mtime(u) ((u)[0].modtime) #else #if defined(USG) typedef struct { time_t _utm_a, _utm_m; } utime_t[1]; #define utm_atime(u) ((u)[0]._utm_a) #define utm_mtime(u) ((u)[0]._utm_m) #else #if 1 /* Current BSD & Research implementation */ typedef time_t utime_t[2]; #define utm_atime(u) ((u)[0]) #define utm_mtime(u) ((u)[1]) #else /* Possible future BSD implementation */ typedef struct timeval utime_t[2]; #define utm_atime(u) ((u)[0]) #define utm_mtime(u) ((u)[1]) #define utime utimes #endif #endif #endif #endif