/* * doboth - handle both I/O and alarms via SIGIO */ int doboth( int fd ) { int n; int sawalarm; int sawiosig; int omask; fd_set fds; struct timeval tvzero; sawalarm = 0; sawiosig = 0; FD_ZERO(&fds); for (;;) { omask = sigblock(BLOCKSIGMASK); if (wasalarmed) { /* alarmed? */ sawalarm = 1; wasalarmed = 0; } if (iosig) { sawiosig = 1; iosig = 0; } if (!sawalarm && !sawiosig) { /* * Nothing to do. Wait for something. */ sigpause(omask); if (wasalarmed) { /* alarmed? */ sawalarm = 1; wasalarmed = 0; } if (iosig) { sawiosig = 1; iosig = 0; } } (void)sigsetmask(omask); if (sawiosig) { do { tvzero.tv_sec = tvzero.tv_usec = 0; FD_SET(fd, &fds); n = select(fd+1, &fds, (fd_set *)0, (fd_set *)0, &tvzero); if (n > 0) doio(fd); } while (n > 0); if (n == -1) { (void) fprintf(stderr, "%s: select: ", progname); perror(""); exit(1); } sawiosig = 0; } if (sawalarm) { doalarm(fd); sawalarm = 0; } } }
/* * leave [[+]hhmm] * * Reminds you when you have to leave. * Leave prompts for input and goes away if you hit return. * It nags you like a mother hen. */ int main(int argc, char **argv) { u_int secs; int hours, minutes; char c, *cp = NULL; struct tm *t; time_t now; int plusnow, t_12_hour; char buf[50]; if (setlocale(LC_TIME, "") == NULL) warn("setlocale"); if (argc < 2) { #define MSG1 "When do you have to leave? " (void)write(1, MSG1, sizeof(MSG1) - 1); cp = fgets(buf, sizeof(buf), stdin); if (cp == NULL || *cp == '\n') exit(0); } else if (argc > 2) usage(); else cp = argv[1]; if (*cp == '+') { plusnow = 1; ++cp; } else plusnow = 0; for (hours = 0; (c = *cp) && c != '\n'; ++cp) { if (!isdigit(c)) usage(); hours = hours * 10 + (c - '0'); } minutes = hours % 100; hours /= 100; if (minutes < 0 || minutes > 59) usage(); if (plusnow) secs = hours * 60 * 60 + minutes * 60; else { (void)time(&now); t = localtime(&now); if (hours > 23) usage(); /* Convert tol to 12 hr time (0:00...11:59) */ if (hours > 11) hours -= 12; /* Convert tm to 12 hr time (0:00...11:59) */ if (t->tm_hour > 11) t_12_hour = t->tm_hour - 12; else t_12_hour = t->tm_hour; if (hours < t_12_hour || (hours == t_12_hour && minutes <= t->tm_min)) /* Leave time is in the past so we add 12 hrs */ hours += 12; secs = (hours - t_12_hour) * 60 * 60; secs += (minutes - t->tm_min) * 60; secs -= now % 60; /* truncate (now + secs) to min */ } doalarm(secs); exit(0); }
/* * leave [[+]hhmm] * * Reminds you when you have to leave. * Leave prompts for input and goes away if you hit return. * It nags you like a mother hen. */ int main(int argc, char *argv[]) { u_int secs; int hours, minutes; char c, *cp; struct tm *t; time_t now; int plusnow = 0, twentyfour; char buf[50]; setlinebuf(stdout); if (argc < 2) { (void)fputs("When do you have to leave? ", stdout); cp = fgets(buf, sizeof(buf), stdin); if (cp == NULL || *cp == '\n') exit(0); } else if (argc > 2) usage(); else cp = argv[1]; if (*cp == '+') { plusnow = 1; ++cp; } for (hours = 0; (c = *cp) && c != '\n'; ++cp) { if (!isdigit(c)) usage(); hours = hours * 10 + (c - '0'); } minutes = hours % 100; hours /= 100; /* determine 24 hours mode */ twentyfour = hours > 12; if (minutes < 0 || minutes > 59) usage(); if (plusnow) secs = (hours * HOUR) + (minutes * MINUTE); else { if (hours > 23) usage(); (void)time(&now); t = localtime(&now); while (t->tm_hour > hours || (t->tm_hour == hours && t->tm_min >= minutes)) { if (twentyfour) hours += 24; else hours += 12; } secs = (hours - t->tm_hour) * HOUR; secs += (minutes - t->tm_min) * MINUTE; } doalarm(secs); exit(0); }