home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / usr.bin / leave / leave.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-17  |  4.4 KB  |  164 lines

  1. /*
  2.  * Copyright (c) 1980, 1988 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by the University of
  16.  *    California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  */
  33.  
  34. #ifndef lint
  35. char copyright[] =
  36. "@(#) Copyright (c) 1980, 1988 Regents of the University of California.\n\
  37.  All rights reserved.\n";
  38. #endif /* not lint */
  39.  
  40. #ifndef lint
  41. static char sccsid[] = "@(#)leave.c    5.6 (Berkeley) 3/1/91";
  42. #endif /* not lint */
  43.  
  44. #include <sys/param.h>
  45. #include <sys/time.h>
  46. #include <stdio.h>
  47. #include <ctype.h>
  48.  
  49. /*
  50.  * leave [[+]hhmm]
  51.  *
  52.  * Reminds you when you have to leave.
  53.  * Leave prompts for input and goes away if you hit return.
  54.  * It nags you like a mother hen.
  55.  */
  56. main(argc, argv)
  57.     int argc;
  58.     char **argv;
  59. {
  60.     register u_int secs;
  61.     register int hours, minutes;
  62.     register char c, *cp;
  63.     struct tm *t, *localtime();
  64.     time_t now, time();
  65.     int plusnow;
  66.     char buf[50];
  67.  
  68.     if (argc < 2) {
  69. #define    MSG1    "When do you have to leave? "
  70.         (void)write(1, MSG1, sizeof(MSG1) - 1);
  71.         cp = fgets(buf, sizeof(buf), stdin);
  72.         if (*cp == '\n')
  73.             exit(0);
  74.     } else
  75.         cp = argv[1];
  76.  
  77.     if (*cp == '+') {
  78.         plusnow = 1;
  79.         ++cp;
  80.     } else {
  81.         plusnow = 0;
  82.         (void)time(&now);
  83.         t = localtime(&now);
  84.     }
  85.  
  86.     for (hours = 0; (c = *cp) && c != '\n'; ++cp) {
  87.         if (!isdigit(c))
  88.             usage();
  89.         hours = hours * 10 + (c - '0');
  90.     }
  91.     minutes = hours % 100;
  92.     hours /= 100;
  93.  
  94.     if (minutes < 0 || minutes > 59)
  95.         usage();
  96.     if (plusnow)
  97.         secs = hours * 60 * 60 + minutes * 60;
  98.     else {
  99.         if (hours > 23 || t->tm_hour > hours ||
  100.             t->tm_hour == hours && minutes <= t->tm_min)
  101.             usage();
  102.         secs = (hours - t->tm_hour) * 60 * 60;
  103.         secs += (minutes - t->tm_min) * 60;
  104.     }
  105.     doalarm(secs);
  106.     exit(0);
  107. }
  108.  
  109. doalarm(secs)
  110.     u_int secs;
  111. {
  112.     register int bother;
  113.     time_t daytime, time();
  114.     int pid;
  115.     char *ctime();
  116.  
  117.     if (pid = fork()) {
  118.         (void)time(&daytime);
  119.         daytime += secs;
  120.         printf("Alarm set for %.16s. (pid %d)\n",
  121.             ctime(&daytime), pid);
  122.         exit(0);
  123.     }
  124.     sleep((u_int)2);        /* let parent print set message */
  125.  
  126.     /*
  127.      * if write fails, we've lost the terminal through someone else
  128.      * causing a vhangup by logging in.
  129.      */
  130. #define    FIVEMIN    (5 * 60)
  131. #define    MSG2    "\07\07You have to leave in 5 minutes.\n"
  132.     if (secs >= FIVEMIN) {
  133.         sleep(secs - FIVEMIN);
  134.         if (write(1, MSG2, sizeof(MSG2) - 1) != sizeof(MSG2) - 1)
  135.             exit(0);
  136.         secs = FIVEMIN;
  137.     }
  138.  
  139. #define    ONEMIN    (60)
  140. #define    MSG3    "\07\07Just one more minute!\n"
  141.     if (secs >= ONEMIN) {
  142.         sleep(secs - ONEMIN);
  143.         if (write(1, MSG3, sizeof(MSG3) - 1) != sizeof(MSG3) - 1)
  144.             exit(0);
  145.     }
  146.  
  147. #define    MSG4    "\07\07Time to leave!\n"
  148.     for (bother = 10; bother--;) {
  149.         sleep((u_int)ONEMIN);
  150.         if (write(1, MSG4, sizeof(MSG4) - 1) != sizeof(MSG4) - 1)
  151.             exit(0);
  152.     }
  153.  
  154. #define    MSG5    "\07\07That was the last time I'll tell you.  Bye.\n"
  155.     (void)write(1, MSG5, sizeof(MSG5) - 1);
  156.     exit(0);
  157. }
  158.  
  159. usage()
  160. {
  161.     fprintf(stderr, "usage: leave [[+]hhmm]\n");
  162.     exit(1);
  163. }
  164.