=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/calendar/io.c,v retrieving revision 1.8 retrieving revision 1.19 diff -u -r1.8 -r1.19 --- src/usr.bin/calendar/io.c 1999/11/25 03:46:47 1.8 +++ src/usr.bin/calendar/io.c 2001/11/19 19:02:13 1.19 @@ -1,4 +1,4 @@ -/* $OpenBSD: io.c,v 1.8 1999/11/25 03:46:47 pjanzen Exp $ */ +/* $OpenBSD: io.c,v 1.19 2001/11/19 19:02:13 mpech Exp $ */ /* * Copyright (c) 1989, 1993, 1994 @@ -43,7 +43,7 @@ #if 0 static const char sccsid[] = "@(#)calendar.c 8.3 (Berkeley) 3/25/94"; #else -static char rcsid[] = "$OpenBSD: io.c,v 1.8 1999/11/25 03:46:47 pjanzen Exp $"; +static char rcsid[] = "$OpenBSD: io.c,v 1.19 2001/11/19 19:02:13 mpech Exp $"; #endif #endif /* not lint */ @@ -57,6 +57,7 @@ #include #include #include +#include #include #include #include @@ -69,10 +70,6 @@ #include "calendar.h" -char *calendarFile = "calendar"; /* default calendar file */ -char *calendarHome = ".calendar"; /* HOME */ -char *calendarNoMail = "nomail"; /* don't sent mail if this file exist */ - struct iovec header[] = { {"From: ", 6}, {NULL, 0}, @@ -87,12 +84,12 @@ void cal() { - register int printing; - register char *p; + int printing; + char *p; FILE *fp; - int ch, l, i; + int ch, l, i, bodun = 0, bodun_maybe = 0; int var; - char buf[2048 + 1]; + char buf[2048 + 1], *prefix = NULL; struct event *events, *cur_evt, *ev1, *tmp; struct match *m; @@ -105,9 +102,7 @@ *p = '\0'; else while ((ch = getchar()) != '\n' && ch != EOF); - for (l = strlen(buf); - l > 0 && isspace(buf[l - 1]); - l--) + for (l = strlen(buf); l > 0 && isspace(buf[l - 1]); l--) ; buf[l] = '\0'; if (buf[0] == '\0') @@ -115,8 +110,25 @@ if (strncmp(buf, "LANG=", 5) == 0) { (void) setlocale(LC_ALL, buf + 5); setnnames(); + if (!strcmp(buf + 5, "ru_RU.KOI8-R") || + !strcmp(buf + 5, "uk_UA.KOI8-U") || + !strcmp(buf + 5, "by_BY.KOI8-B")) { + bodun_maybe++; + bodun = 0; + if (prefix) + free(prefix); + prefix = NULL; + } else + bodun_maybe = 0; continue; } + if (bodun_maybe && strncmp(buf, "BODUN=", 6) == 0) { + bodun++; + if (prefix) + free(prefix); + if ((prefix = strdup(buf + 6)) == NULL) + err(1, NULL); + } /* User defined names for special events */ if ((p = strchr(buf, '='))) { for (i = 0; i < NUMEV; i++) { @@ -126,7 +138,7 @@ if (spev[i].uname != NULL) free(spev[i].uname); if ((spev[i].uname = strdup(p)) == NULL) - errx(1, "cannot allocate memory"); + err(1, NULL); spev[i].ulen = strlen(p); i = NUMEV + 1; } @@ -135,7 +147,7 @@ continue; } if (buf[0] != '\t') { - printing = (m = isnow(buf)) ? 1 : 0; + printing = (m = isnow(buf, bodun)) ? 1 : 0; if ((p = strchr(buf, '\t')) == NULL) { printing = 0; continue; @@ -153,7 +165,7 @@ while (m) { cur_evt = (struct event *) malloc(sizeof(struct event)); if (cur_evt == NULL) - errx(1, "cannot allocate memory"); + err(1, NULL); cur_evt->when = m->when; snprintf(cur_evt->print_date, @@ -163,8 +175,17 @@ cur_evt->desc = ev1->desc; cur_evt->ldesc = NULL; } else { - if ((cur_evt->ldesc = strdup(p)) == NULL) - errx(1, "cannot allocate memory"); + if (m->bodun && prefix) { + int l1 = strlen(prefix); + int l2 = strlen(p); + if ((cur_evt->ldesc = + malloc(l1 + l2)) == NULL) + err(1, "malloc"); + sprintf(cur_evt->ldesc, + "\t%s %s", prefix, p + 1); + } else if ((cur_evt->ldesc = + strdup(p)) == NULL) + err(1, NULL); cur_evt->desc = &(cur_evt->ldesc); ev1 = cur_evt; } @@ -178,7 +199,7 @@ else if (printing) { if ((ev1->ldesc = realloc(ev1->ldesc, (2 + strlen(ev1->ldesc) + strlen(buf)))) == NULL) - errx(1, "cannot allocate memory"); + err(1, NULL); strcat(ev1->ldesc, "\n"); strcat(ev1->ldesc, buf); } @@ -292,28 +313,23 @@ return (val); } -char path[MAXPATHLEN]; FILE * opencal() { - int fd, pdes[2]; - struct stat sbuf; + int pdes[2]; + int fdin; /* open up calendar file as stdin */ - if (!freopen(calendarFile, "r", stdin)) { - if (doall) { - if (chdir(calendarHome) != 0) - return (NULL); - if (stat(calendarNoMail, &sbuf) == 0) - return (NULL); - if (!freopen(calendarFile, "r", stdin)) - return (NULL); - } else { - chdir(getenv("HOME")); - if (!(chdir(calendarHome) == 0 && - freopen(calendarFile, "r", stdin))) - errx(1, "no calendar file: ``%s'' or ``~/%s/%s", + if ((fdin = open(calendarFile, O_RDONLY)) == -1) { + if (!doall) { + char *home = getenv("HOME"); + if (home == NULL || *home == '\0') + errx(1, "cannot get home directory"); + if (!(chdir(home) == 0 && + chdir(calendarHome) == 0 && + (fdin = open(calendarFile, O_RDONLY)) != -1)) + errx(1, "no calendar file: ``%s'' or ``~/%s/%s''", calendarFile, calendarHome, calendarFile); } } @@ -325,15 +341,25 @@ (void)close(pdes[1]); return (NULL); case 0: - /* child -- stdin already setup, set stdout to pipe input */ + dup2(fdin, STDIN_FILENO); + /* child -- set stdout to pipe input */ if (pdes[1] != STDOUT_FILENO) { (void)dup2(pdes[1], STDOUT_FILENO); (void)close(pdes[1]); } (void)close(pdes[0]); - (void)setuid(geteuid()); - (void)setgid(getegid()); - execl(_PATH_CPP, "cpp", "-P", "-I.", _PATH_INCLUDE, NULL); + /* Set stderr to /dev/null. Necessary so that cron does not + * wait for cpp to finish if it's running calendar -a. + */ + if (doall) { + int fderr; + fderr = open(_PATH_DEVNULL, O_WRONLY, 0); + if (fderr == -1) + _exit(0); + (void)dup2(fderr, STDERR_FILENO); + (void)close(fderr); + } + execl(_PATH_CPP, "cpp", "-P", "-I.", _PATH_INCLUDE, (char *)NULL); warn(_PATH_CPP); _exit(1); } @@ -347,10 +373,7 @@ return (stdout); /* set output to a temporary file, so if no output don't send mail */ - (void)snprintf(path, sizeof(path), "%s/_calXXXXXX", _PATH_TMP); - if ((fd = mkstemp(path)) < 0) - return (NULL); - return (fdopen(fd, "w+")); + return(tmpfile()); } void @@ -381,10 +404,8 @@ (void)close(pdes[0]); } (void)close(pdes[1]); - (void)setuid(geteuid()); - (void)setgid(getegid()); execl(_PATH_SENDMAIL, "sendmail", "-i", "-t", "-F", - "\"Reminder Service\"", NULL); + "\"Reminder Service\"", (char *)NULL); warn(_PATH_SENDMAIL); _exit(1); } @@ -398,8 +419,8 @@ (void)write(pdes[1], buf, nread); (void)close(pdes[1]); done: (void)fclose(fp); - (void)unlink(path); - while (wait(&status) >= 0); + while (wait(&status) >= 0) + ; }