Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/external/bsd/cron/dist use utimensat(2) and correct and cent...



details:   https://anonhg.NetBSD.org/src/rev/96d921caa3dd
branches:  trunk
changeset: 782462:96d921caa3dd
user:      christos <christos%NetBSD.org@localhost>
date:      Sat Nov 03 15:39:23 2012 +0000

description:
use utimensat(2) and correct and centralize file times handling.

diffstat:

 external/bsd/cron/dist/config.h  |   4 +-
 external/bsd/cron/dist/crontab.c |  78 ++++++++++++++++++++++++++++-----------
 2 files changed, 59 insertions(+), 23 deletions(-)

diffs (162 lines):

diff -r 8d223c5ac643 -r 96d921caa3dd external/bsd/cron/dist/config.h
--- a/external/bsd/cron/dist/config.h   Sat Nov 03 15:07:40 2012 +0000
+++ b/external/bsd/cron/dist/config.h   Sat Nov 03 15:39:23 2012 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: config.h,v 1.3 2010/05/07 20:43:27 christos Exp $      */
+/*     $NetBSD: config.h,v 1.4 2012/11/03 15:39:23 christos Exp $      */
 
 /* Copyright 1988,1990,1993,1994 by Paul Vixie
  * All rights reserved
@@ -93,6 +93,8 @@
 #define HAVE_TM_GMTOFF         /*-*/
 #define HAVE_FCHOWN            /*-*/
 #define HAVE_UTIMES            /*-*/
+#define HAVE_UTIMENSAT
+#define _INCOMPLETE_XOPEN_C063
 
                        /* if your OS supports a BSD-style login.conf file */
 /* #define LOGIN_CAP                   */
diff -r 8d223c5ac643 -r 96d921caa3dd external/bsd/cron/dist/crontab.c
--- a/external/bsd/cron/dist/crontab.c  Sat Nov 03 15:07:40 2012 +0000
+++ b/external/bsd/cron/dist/crontab.c  Sat Nov 03 15:39:23 2012 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: crontab.c,v 1.5 2012/03/04 18:38:31 tron Exp $ */
+/*     $NetBSD: crontab.c,v 1.6 2012/11/03 15:39:23 christos Exp $     */
 
 /* Copyright 1988,1990,1993,1994 by Paul Vixie
  * All rights reserved
@@ -25,7 +25,7 @@
 #if 0
 static char rcsid[] = "Id: crontab.c,v 1.12 2004/01/23 18:56:42 vixie Exp";
 #else
-__RCSID("$NetBSD: crontab.c,v 1.5 2012/03/04 18:38:31 tron Exp $");
+__RCSID("$NetBSD: crontab.c,v 1.6 2012/11/03 15:39:23 christos Exp $");
 #endif
 #endif
 
@@ -138,6 +138,48 @@
 }
 
 static void
+get_time(const struct stat *st, struct timespec *ts)
+{
+       ts[0].tv_sec = st->st_atime;
+       ts[0].tv_nsec = st->st_atimensec;
+       ts[1].tv_sec = st->st_mtime;
+       ts[1].tv_nsec = st->st_mtimensec;
+}
+
+static int
+change_time(const char *name, const struct timespec *ts)
+{
+#if defined(HAVE_UTIMENSAT)
+       return utimensat(AT_FDCWD, name, ts, 0);
+#elif defined(HAVE_UTIMES)
+       struct timeval tv[2];
+       TIMESPEC_TO_TIMEVAL(&tv[0], &ts[0]);
+       TIMESPEC_TO_TIMEVAL(&tv[1], &ts[1]);
+       return utimes(name, tvs);
+#else
+       struct utimebuf ut;
+       ut.actime = tv[0].tv_sec;
+       ut.modtime = tv[1].tv_sec;
+       return utime(name, &ut);
+#endif
+}
+
+static int
+compare_time(const struct stat *st, const struct timespec *ts2)
+{
+       struct timespec ts1[2];
+       get_time(st, ts1);
+       
+       return ts1[1].tv_sec == ts2[1].tv_sec
+#if defined(HAVE_UTIMENSAT)
+           && ts1[1].tv_nsec == ts2[1].tv_nsec
+#elif defined(HAVE_UTIMES)
+           && ts1[1].tv_nsec / 1000 = ts2[1].tv_nsec / 1000
+#endif
+       ;
+}
+
+static void
 parse_args(int argc, char *argv[]) {
        int argch;
 
@@ -322,10 +364,9 @@
        int ch, t, x;
        sig_t oint, oabrt, oquit, ohup;
        struct stat statbuf;
-       struct utimbuf utimebuf;
-       long mtimensec;
        WAIT_T waiter;
        PID_T pid, xpid;
+       struct timespec ts[2];
 
        log_it(RealUser, Pid, "BEGIN EDIT", User);
        if (!glue_strings(n, sizeof n, SPOOL_DIR, User, '/')) {
@@ -345,9 +386,7 @@
                warn("cannot stat crontab file");
                goto fatal;
        }
-       utimebuf.actime = statbuf.st_atime;
-       utimebuf.modtime = statbuf.st_mtime;
-       mtimensec = statbuf.st_mtimensec;
+       get_time(&statbuf, ts);
 
        /* Turn off signals. */
        ohup = signal(SIGHUP, SIG_IGN);
@@ -390,7 +429,8 @@
        if (fflush(NewCrontab) < OK) {
                err(ERROR_EXIT, "cannot flush output for `%s'", Filename);
        }
-       (void)utime(Filename, &utimebuf);
+       if (change_time(Filename, ts) == -1)
+               err(ERROR_EXIT, "cannot set time info for `%s'", Filename);
  again:
        rewind(NewCrontab);
        if (ferror(NewCrontab)) {
@@ -473,8 +513,7 @@
                warn("cannot stat `%s'", Filename);
                goto fatal;
        }
-       if (utimebuf.modtime == statbuf.st_mtime &&
-           mtimensec == statbuf.st_mtimensec) {
+       if (compare_time(&statbuf, ts)) {
                warnx("no changes made to crontab");
                goto remove;
        }
@@ -599,7 +638,7 @@
         */
        (void)fprintf(tmp, "# DO NOT EDIT THIS FILE - edit the master and reinstall.\n");
        (void)fprintf(tmp, "# (%s installed on %-24.24s)\n", Filename, ctime(&now));
-       (void)fprintf(tmp, "# (Cron version %s -- %s)\n", CRON_VERSION, "$NetBSD: crontab.c,v 1.5 2012/03/04 18:38:31 tron Exp $");
+       (void)fprintf(tmp, "# (Cron version %s -- %s)\n", CRON_VERSION, "$NetBSD: crontab.c,v 1.6 2012/11/03 15:39:23 christos Exp $");
 
        /* copy the crontab to the tmp
         */
@@ -717,18 +756,13 @@
 
 static void
 poke_daemon(void) {
-#ifdef HAVE_UTIMES
-       struct timeval tvs[2];
-       struct timezone tz;
+       struct timespec ts[2];
+       (void) clock_gettime(CLOCK_REALTIME, ts);
+       ts[1] = ts[0];
+       if (change_time(SPOOL_DIR, ts) == -1)
+               warn("can't update times on spooldir %s", SPOOL_DIR);
+}
 
-       (void) gettimeofday(&tvs[0], &tz);
-       tvs[1] = tvs[0];
-       if (utimes(SPOOL_DIR, tvs) < OK)
-#else
-       if (utime(SPOOL_DIR, NULL) < OK)
-#endif /* HAVE_UTIMES */
-               warn("can't update mtime on spooldir %s", SPOOL_DIR);
-}
 /* int allowed(const char *username, const char *allow_file, const char *deny_file)
  *     returns TRUE if (allow_file exists and user is listed)
  *     or (deny_file exists and user is NOT listed).



Home | Main Index | Thread Index | Old Index