示例#1
0
/*
 * 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;
		}
	}
}
示例#2
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);
}
示例#3
0
文件: leave.c 项目: memagit/obase
/*
 * 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);
}