[comp.lang.c] utime

karl@haddock.ISC.COM (Karl Heuer) (04/11/88)

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 <sys/utime.h>; 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 <sys/utime.h>
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