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 - The new cron keeps time internally ...



details:   https://anonhg.NetBSD.org/src/rev/655460f88306
branches:  trunk
changeset: 754988:655460f88306
user:      christos <christos%NetBSD.org@localhost>
date:      Tue May 18 21:49:51 2010 +0000

description:
- The new cron keeps time internally as localtime. Revert to previous behavior
  of keeping UTC, and handle timezones the way we handled them before (CRON_TZ).
  The old behavior can be selected with defining CRON_LOCALTIME.
- Provide functions to pretty-print crontab entries.

diffstat:

 external/bsd/cron/dist/cron.c |  119 ++++++++++++++++++++++++++++++++++++++---
 1 files changed, 110 insertions(+), 9 deletions(-)

diffs (197 lines):

diff -r ffda469b943c -r 655460f88306 external/bsd/cron/dist/cron.c
--- a/external/bsd/cron/dist/cron.c     Tue May 18 21:47:43 2010 +0000
+++ b/external/bsd/cron/dist/cron.c     Tue May 18 21:49:51 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cron.c,v 1.5 2010/05/07 17:12:00 christos Exp $        */
+/*     $NetBSD: cron.c,v 1.6 2010/05/18 21:49:51 christos Exp $        */
 
 /* Copyright 1988,1990,1993,1994 by Paul Vixie
  * All rights reserved
@@ -25,7 +25,7 @@
 #if 0
 static char rcsid[] = "Id: cron.c,v 1.12 2004/01/23 18:56:42 vixie Exp";
 #else
-__RCSID("$NetBSD: cron.c,v 1.5 2010/05/07 17:12:00 christos Exp $");
+__RCSID("$NetBSD: cron.c,v 1.6 2010/05/18 21:49:51 christos Exp $");
 #endif
 #endif
 
@@ -264,14 +264,97 @@
        (void) job_runqueue();
 }
 
+static const char *
+bitprint(const bitstr_t *b, size_t l)
+{
+       size_t i, set, clear;
+       static char result[1024];
+       char tmp[1024];
+
+       result[0] = '\0';
+       for (i = 0;;) {
+               for (; i < l; i++)
+                       if (bit_test(b, i))
+                               break;
+               if (i == l)
+                       return result;
+               set = i;
+               for (; i < l; i++)
+                       if (!bit_test(b, i))
+                               break;
+               clear = i;
+               if (set == 0 && clear == l) {
+                       snprintf(result, sizeof(result), "*");
+                       return result;
+               }
+               if (clear == l || set == clear - 1)
+                       snprintf(tmp, sizeof(tmp), ",%zu", set);
+               else
+                       snprintf(tmp, sizeof(tmp), ",%zu-%zu", set, clear - 1);
+               if (result[0] == '\0')
+                       strlcpy(result, tmp + 1, sizeof(result));
+               else
+                       strlcat(result, tmp, sizeof(result));
+       }
+}
+
+static const char *
+flagsprint(int flags)
+{
+       static char result[1024];
+
+       result[0] = '\0';
+       if (flags & MIN_STAR)
+               strlcat(result, ",min", sizeof(result));
+       if (flags & HR_STAR)
+               strlcat(result, ",hr", sizeof(result));
+       if (flags & DOM_STAR)
+               strlcat(result, ",dom", sizeof(result));
+       if (flags & DOW_STAR)
+               strlcat(result, ",dow", sizeof(result));
+       if (flags & WHEN_REBOOT)
+               strlcat(result, ",reboot", sizeof(result));
+       if (flags & DONT_LOG)
+               strlcat(result, ",nolog", sizeof(result));
+
+       return result + (result[0] == ',');
+}
+
+static void
+printone(char *res, size_t len, const char *b)
+{
+       int comma = strchr(b, ',') != NULL;
+       if (comma)
+               strlcat(res, "[", len);
+       strlcat(res, b, len);
+       strlcat(res, "]," + (comma ? 0 : 1), len);
+}
+
+static const char *
+tick(const entry *e)
+{
+       static char result[1024];
+
+       result[0] = '\0';
+       printone(result, sizeof(result), bitprint(e->minute, MINUTE_COUNT));
+       printone(result, sizeof(result), bitprint(e->hour, HOUR_COUNT));
+       printone(result, sizeof(result), bitprint(e->dom, DOM_COUNT));
+       printone(result, sizeof(result), bitprint(e->month, MONTH_COUNT));
+       printone(result, sizeof(result), bitprint(e->dow, DOW_COUNT));
+       strlcat(result, "flags=", sizeof(result));
+       strlcat(result, flagsprint(e->flags), sizeof(result));
+       return result;
+}
+
 static void
 find_jobs(time_t vtime, cron_db *db, int doWild, int doNonWild) {
-       time_t virtualSecond  = vtime * SECONDS_PER_MINUTE;
-       struct tm *tm = gmtime(&virtualSecond);
+       time_t virtualSecond = vtime * SECONDS_PER_MINUTE;
+       struct tm *tm;
        int minute, hour, dom, month, dow;
        user *u;
        entry *e;
-       char            *orig_tz, *job_tz;
+#ifndef CRON_LOCALTIME
+       char *orig_tz, *job_tz;
 
 #define maketime(tz1, tz2) do { \
        char *t = tz1; \
@@ -281,6 +364,7 @@
                setenv("TZ", (tz2), 1); \
        else \
                unsetenv("TZ"); \
+       tzset(); \
        tm = localtime(&virtualSecond); \
        minute = tm->tm_min -FIRST_MINUTE; \
        hour = tm->tm_hour -FIRST_HOUR; \
@@ -291,6 +375,9 @@
 
        orig_tz = getenv("TZ");
        maketime(NULL, orig_tz);
+#else
+       tm = gmtime(&virtualSecond);
+#endif
 
        Debug(DSCH, ("[%ld] tick(%d,%d,%d,%d,%d) %s %s\n",
                     (long)getpid(), minute, hour, dom, month, dow,
@@ -304,11 +391,19 @@
         */
        for (u = db->head; u != NULL; u = u->next) {
                for (e = u->crontab; e != NULL; e = e->next) {
-                       Debug(DSCH|DEXT, ("user [%s:%ld:%ld:...] cmd=\"%s\"\n",
-                           e->pwd->pw_name, (long)e->pwd->pw_uid,
-                           (long)e->pwd->pw_gid, e->cmd));
+#ifndef CRON_LOCALTIME
                        job_tz = env_get("CRON_TZ", e->envp);
                        maketime(job_tz, orig_tz);
+#else
+#define job_tz "N/A"
+#define orig_tz "N/A"
+#endif
+                       Debug(DSCH|DEXT, ("user [%s:%ld:%ld:...] "
+                           "[jobtz=%s, origtz=%s] "
+                           "tick(%s), cmd=\"%s\"\n",
+                           e->pwd->pw_name, (long)e->pwd->pw_uid,
+                           (long)e->pwd->pw_gid, job_tz, orig_tz,
+                           tick(e), e->cmd));
                        if (bit_test(e->minute, minute) &&
                            bit_test(e->hour, hour) &&
                            bit_test(e->month, month) &&
@@ -324,10 +419,12 @@
                        }
                }
        }
+#ifndef CRON_LOCALTIME
        if (orig_tz != NULL)
                setenv("TZ", orig_tz, 1);
        else
                unsetenv("TZ");
+#endif
 }
 
 /*
@@ -337,11 +434,12 @@
  */
 static void
 set_time(int initialize) {
+
+#ifdef CRON_LOCALTIME
        struct tm tm;
        static int isdst;
 
        StartTime = time(NULL);
-
        /* We adjust the time to GMT so we can catch DST changes. */
        tm = *localtime(&StartTime);
        if (initialize || tm.tm_isdst != isdst) {
@@ -350,6 +448,9 @@
                Debug(DSCH, ("[%ld] GMToff=%ld\n",
                    (long)getpid(), (long)GMToff));
        }
+#else
+       StartTime = time(NULL);
+#endif
        clockTime = (StartTime + GMToff) / (time_t)SECONDS_PER_MINUTE;
 }
 



Home | Main Index | Thread Index | Old Index