1 static char *sccsid = "@(#)leave.c 4.1 (Berkeley) 10/01/80"; 2 #include <stdio.h> 3 /* 4 * leave [hhmm] 5 * 6 * Reminds you when you have to leave. 7 * Leave prompts for input and goes away if you hit return. 8 * It nags you like a mother hen. 9 */ 10 char origlogin[20], thislogin[20]; 11 char *getlogin(); 12 char *whenleave; 13 char *ctime(); 14 char buff[100]; 15 16 main(argc,argv) 17 char **argv; 18 { 19 long when, tod, now, diff, hours, minutes; 20 int *nv; 21 int atoi(); 22 int *localtime(); 23 24 if (argc < 2) { 25 printf("When do you have to leave? "); 26 fflush(stdout); 27 buff[read(0,buff,sizeof buff)] = 0; 28 } else { 29 strcpy(buff,argv[1]); 30 } 31 32 if (buff[0] == '\n') 33 exit(0); 34 if (buff[0] == '+') { 35 diff = atoi(buff+1); 36 doalarm(diff); 37 } 38 if (buff[0] < '0' || buff[0] > '9') { 39 printf("usage: %s [hhmm]\n",argv[0]); 40 exit(1); 41 } 42 strcpy(origlogin,getlogin()); 43 44 tod = atoi(buff); 45 hours = tod / 100; 46 if (hours > 12) 47 hours -= 12; 48 if (hours == 12) 49 hours = 0; 50 minutes = tod % 100; 51 52 if (hours < 0 || hours > 12 || minutes < 0 || minutes > 59) { 53 printf("usage: %s [hhmm]\n",argv[0]); 54 exit(1); 55 } 56 57 setexit(); /* refigure time if killed */ 58 time(&now); 59 nv = localtime(&now); 60 when = 60*hours+minutes; 61 if (nv[2] > 12) nv[2] -= 12; /* do am/pm bit */ 62 now = 60*nv[2] + nv[1]; 63 diff = when - now; 64 while (diff < 0) 65 diff += 12*60; 66 if (diff > 11*60) printf("That time has already passed!\n"); 67 doalarm(diff); 68 exit(0); 69 } 70 71 72 doalarm(nmins) 73 long nmins; 74 { 75 char *msg1, *msg2, *msg3, *msg4; 76 register int i; 77 int slp1, slp2, slp3, slp4; 78 int seconds, gseconds; 79 long daytime; 80 81 seconds = 60 * nmins; 82 if (seconds <= 0) 83 seconds = 1; 84 gseconds = seconds; 85 86 msg1 = "You have to leave in 5 minutes"; 87 if (seconds <= 60*5) { 88 slp1 = 0; 89 } else { 90 slp1 = seconds - 60*5; 91 seconds = 60*5; 92 } 93 94 msg2 = "Just one more minute!"; 95 if (seconds <= 60) { 96 slp2 = 0; 97 } else { 98 slp2 = seconds - 60; 99 seconds = 60; 100 } 101 102 msg3 = "Time to leave!"; 103 slp3 = seconds; 104 105 msg4 = "You're going to be late!"; 106 slp4 = 60; 107 108 time(&daytime); 109 daytime += gseconds; 110 whenleave = ctime(&daytime); 111 printf("Alarm set for %s\n",whenleave); 112 if (fork()) 113 exit(0); 114 signal(2,1); 115 signal(3,1); 116 signal(15,1); 117 118 if (slp1) 119 bother(slp1,msg1); 120 if (slp2) 121 bother(slp2,msg2); 122 bother(slp3,msg3); 123 for (;;) { 124 bother(slp4,msg4); 125 } 126 } 127 128 bother(slp,msg) 129 int slp; 130 char *msg; 131 { 132 133 delay(slp); 134 printf("\7\7\7"); 135 printf("%s\n",msg); 136 } 137 138 /* 139 * delay is like sleep but does it in 100 sec pieces and 140 * knows what zero means. 141 */ 142 delay(secs) int secs; { 143 int n; 144 145 while(secs>0) { 146 n = 100; 147 secs = secs - 100; 148 if (secs < 0) { 149 n = n + secs; 150 } 151 if (n > 0) 152 sleep(n); 153 strcpy(thislogin,getlogin()); 154 if (strcmp(origlogin, thislogin)) 155 exit(0); 156 } 157 } 158 159 #ifdef V6 160 char *getlogin() { 161 #include <utmp.h> 162 163 static struct utmp ubuf; 164 int ufd; 165 166 ufd = open("/etc/utmp",0); 167 seek(ufd, ttyn(0)*sizeof(ubuf), 0); 168 read(ufd, &ubuf, sizeof(ubuf)); 169 ubuf.ut_name[sizeof(ubuf.ut_name)] = 0; 170 return(&ubuf.ut_name); 171 } 172 #endif 173