home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume3 / utc < prev    next >
Text File  |  1989-02-03  |  3KB  |  123 lines

  1. Path: xanth!mcnc!rutgers!ucsd!ames!necntc!ncoast!allbery
  2. From: mike@whutt.UUCP (BALDWIN)
  3. Newsgroups: comp.sources.misc
  4. Subject: v03i079: N.B.S. Time Service program
  5. Summary: I've got (a small) one
  6. Keywords: naval observatory
  7. Message-ID: <3506@whutt.UUCP>
  8. Date: 12 Jul 88 14:48:27 GMT
  9. Sender: allbery@ncoast.UUCP
  10. Reply-To: mike@whutt.UUCP (BALDWIN)
  11. Distribution: na
  12. Organization: AT&T Bell Laboratories
  13. Lines: 107
  14. Approved: allbery@ncoast.UUCP
  15.  
  16. Posting-number: Volume 3, Issue 79
  17. Submitted-by: "BALDWIN" <mike@whutt.UUCP>
  18. Archive-name: utc
  19.  
  20. I've been running such a program, which I wrote, at home for over six
  21. months now.  It's written in C, and runs under System V (or any UNIX
  22. system with an stime(2) system call).  It consists of a single program
  23. called "utc" (universal time coordinated).  When invoked with options,
  24. it reads the Naval clock and does one or both of these things:
  25.  
  26.     -s    sets the time via stime(2)
  27.     -p    prints the time via ctime(3C)
  28.  
  29. If it can't read the time from the standard input, it exits non-zero.
  30. When invoked without options, it prints the time in Naval clock format
  31. for about a minute.  Thus, it can be installed as a login shell to provide
  32. time service for your other systems without having them all call DC.
  33. As a test, "utc | utc -p" should print the current time.  You can pipe
  34. cu right into it, so set up a crontab entry to execute
  35.  
  36.     cu 1-201-653-0351 | utc -s
  37.  
  38. You may have to fix your cu to die properly when it receives a SIGPIPE.
  39. I have my crontab entry run once a day, but it only calls DC if the
  40. time hasn't been set in over a week.  A simple shell file accomplishes
  41. this:
  42.  
  43.     LAST=/etc/.lastutc
  44.     [ -z "`find $LAST -mtime -7 -print`" ] &&
  45.     cu 1-202-653-0351 | utc -s && >$LAST
  46.  
  47. ---8<--------8<---------- cut here for utc.c ------------8<--------------8<---
  48. echo x - utc.c
  49. sed 's/^X//' << \EOF > utc.c
  50. X/*
  51. X * The Naval Observatory clock (+1 202 653 0351) prints this every second:
  52. X *
  53. X *    *
  54. X *    jjjjj ddd hhmmss UTC
  55. X *
  56. X * jjjjj    Julian date modulo 2400000
  57. X * ddd        days since beginning of year
  58. X * hhmmss    time of day in Universal Time Coordinated
  59. X */
  60. X
  61. X#include <stdio.h>
  62. X#include <time.h>
  63. X#include <sys/types.h>
  64. X
  65. X#define    EPOCH        40587            /* UNIX starts JD 2440587, */
  66. X#define    leap(y, m)    ((y+m-1 - 70%m) / m)    /* also known as 1/1/70 */
  67. X#define    TONE        '*'
  68. X#define    TIME        "\n%05ld %03d %02d%02d%02d UTC"
  69. X
  70. Xmain(argc, argv)
  71. Xint    argc;
  72. Xchar    *argv[];
  73. X{
  74. X    int    setflg = 0, prtflg = 0;
  75. X    int    y, d, h, m, s;
  76. X    long    j;
  77. X    time_t    now;
  78. X    int    c;
  79. X
  80. X    while ((c = getopt(argc, argv, "sp")) != EOF)
  81. X        switch (c) {
  82. X        case 's': setflg++; break;
  83. X        case 'p': prtflg++; break;
  84. X        default:
  85. X            fprintf(stderr, "usage: %s [-s] [-p]\n", argv[0]);
  86. X            return 1;
  87. X        }
  88. X    if (setflg || prtflg) {
  89. X        while ((c = getchar()) != TONE)
  90. X            if (c == EOF)
  91. X                return 1;
  92. X        if (scanf(TIME, &j, &d, &h, &m, &s) != 5)
  93. X            return 1;
  94. X        now = (((j - EPOCH) * 24 + h) * 60 + m) * 60 + s;
  95. X        if (setflg && stime(&now) == -1)
  96. X            perror(argv[0]);
  97. X        if (prtflg)
  98. X            fputs(ctime(&now), stdout);
  99. X    } else {
  100. X        for (c = 0; c < 60; c++) {
  101. X            time(&now);
  102. X            s = (now % 60);
  103. X            m = (now /= 60) % 60;
  104. X            h = (now /= 60) % 24;
  105. X            d = (now /= 24) % 365;
  106. X            j = now + EPOCH;
  107. X            y = (now /= 365);
  108. X            d += 1 - leap(y, 4) + leap(y, 100) - leap(y, 400);
  109. X            putchar(TONE);
  110. X            printf(TIME, j, d, h, m, s);
  111. X            putchar('\n');
  112. X            fflush(stdout);
  113. X            sleep(1);
  114. X        }
  115. X    }
  116. X    return 0;
  117. X}
  118. EOF
  119. exit 0
  120. -- 
  121. Michael Scott Baldwin        research!mike    attmail!mike    mike@att.arpa
  122. AT&T Bell Laboratories        +1 201 386 3052
  123.