version 1.6, 1998/12/13 07:31:08 |
version 1.19, 2001/11/19 19:02:13 |
|
|
#include <ctype.h> |
#include <ctype.h> |
#include <err.h> |
#include <err.h> |
#include <errno.h> |
#include <errno.h> |
|
#include <fcntl.h> |
#include <locale.h> |
#include <locale.h> |
#include <pwd.h> |
#include <pwd.h> |
#include <stdio.h> |
#include <stdio.h> |
|
|
#include "calendar.h" |
#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[] = { |
struct iovec header[] = { |
{"From: ", 6}, |
{"From: ", 6}, |
{NULL, 0}, |
{NULL, 0}, |
|
|
void |
void |
cal() |
cal() |
{ |
{ |
register int printing; |
int printing; |
register char *p; |
char *p; |
FILE *fp; |
FILE *fp; |
int ch, l, i; |
int ch, l, i, bodun = 0, bodun_maybe = 0; |
int var; |
int var; |
char buf[2048 + 1]; |
char buf[2048 + 1], *prefix = NULL; |
struct event *events, *cur_evt, *ev1, *tmp; |
struct event *events, *cur_evt, *ev1, *tmp; |
struct match *m; |
struct match *m; |
|
|
|
|
*p = '\0'; |
*p = '\0'; |
else |
else |
while ((ch = getchar()) != '\n' && ch != EOF); |
while ((ch = getchar()) != '\n' && ch != EOF); |
for (l = strlen(buf); |
for (l = strlen(buf); l > 0 && isspace(buf[l - 1]); l--) |
l > 0 && isspace(buf[l - 1]); |
|
l--) |
|
; |
; |
buf[l] = '\0'; |
buf[l] = '\0'; |
if (buf[0] == '\0') |
if (buf[0] == '\0') |
|
|
if (strncmp(buf, "LANG=", 5) == 0) { |
if (strncmp(buf, "LANG=", 5) == 0) { |
(void) setlocale(LC_ALL, buf + 5); |
(void) setlocale(LC_ALL, buf + 5); |
setnnames(); |
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; |
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 */ |
/* User defined names for special events */ |
if ((p = strchr(buf, '='))) { |
if ((p = strchr(buf, '='))) { |
for (i = 0; i < NUMEV; i++) { |
for (i = 0; i < NUMEV; i++) { |
|
|
if (spev[i].uname != NULL) |
if (spev[i].uname != NULL) |
free(spev[i].uname); |
free(spev[i].uname); |
if ((spev[i].uname = strdup(p)) == NULL) |
if ((spev[i].uname = strdup(p)) == NULL) |
errx(1, "cannot allocate memory"); |
err(1, NULL); |
spev[i].ulen = strlen(p); |
spev[i].ulen = strlen(p); |
i = NUMEV + 1; |
i = NUMEV + 1; |
} |
} |
|
|
continue; |
continue; |
} |
} |
if (buf[0] != '\t') { |
if (buf[0] != '\t') { |
printing = (m = isnow(buf)) ? 1 : 0; |
printing = (m = isnow(buf, bodun)) ? 1 : 0; |
if ((p = strchr(buf, '\t')) == NULL) { |
if ((p = strchr(buf, '\t')) == NULL) { |
printing = 0; |
printing = 0; |
continue; |
continue; |
|
|
while (m) { |
while (m) { |
cur_evt = (struct event *) malloc(sizeof(struct event)); |
cur_evt = (struct event *) malloc(sizeof(struct event)); |
if (cur_evt == NULL) |
if (cur_evt == NULL) |
errx(1, "cannot allocate memory"); |
err(1, NULL); |
|
|
cur_evt->when = m->when; |
cur_evt->when = m->when; |
snprintf(cur_evt->print_date, |
snprintf(cur_evt->print_date, |
|
|
cur_evt->desc = ev1->desc; |
cur_evt->desc = ev1->desc; |
cur_evt->ldesc = NULL; |
cur_evt->ldesc = NULL; |
} else { |
} else { |
if ((cur_evt->ldesc = strdup(p)) == NULL) |
if (m->bodun && prefix) { |
errx(1, "cannot allocate memory"); |
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); |
cur_evt->desc = &(cur_evt->ldesc); |
ev1 = cur_evt; |
ev1 = cur_evt; |
} |
} |
|
|
else if (printing) { |
else if (printing) { |
if ((ev1->ldesc = realloc(ev1->ldesc, |
if ((ev1->ldesc = realloc(ev1->ldesc, |
(2 + strlen(ev1->ldesc) + strlen(buf)))) == NULL) |
(2 + strlen(ev1->ldesc) + strlen(buf)))) == NULL) |
errx(1, "cannot allocate memory"); |
err(1, NULL); |
strcat(ev1->ldesc, "\n"); |
strcat(ev1->ldesc, "\n"); |
strcat(ev1->ldesc, buf); |
strcat(ev1->ldesc, buf); |
} |
} |
|
|
int val, var, i; |
int val, var, i; |
char *start, savech; |
char *start, savech; |
|
|
for (; !isdigit(*p) && !isalpha(*p) && *p != '*'; ++p) |
for (; !isdigit(*p) && !isalpha(*p) && *p != '*' && *p != '\t'; ++p) |
; |
; |
if (*p == '*') { /* `*' is every month */ |
if (*p == '*') { /* `*' is every month */ |
*flags |= F_ISMONTH; |
*flags |= F_ISMONTH; |
|
|
return (0); |
return (0); |
} |
} |
} |
} |
for (*p = savech; !isdigit(*p) && !isalpha(*p) && *p != '*'; ++p) |
for (*p = savech; !isdigit(*p) && !isalpha(*p) && *p != '*' && *p != '\t'; ++p) |
; |
; |
*endp = p; |
*endp = p; |
return (val); |
return (val); |
} |
} |
|
|
char path[MAXPATHLEN]; |
|
|
|
FILE * |
FILE * |
opencal() |
opencal() |
{ |
{ |
int fd, pdes[2]; |
int pdes[2]; |
struct stat sbuf; |
int fdin; |
|
|
/* open up calendar file as stdin */ |
/* open up calendar file as stdin */ |
if (!freopen(calendarFile, "r", stdin)) { |
if ((fdin = open(calendarFile, O_RDONLY)) == -1) { |
if (doall) { |
if (!doall) { |
if (chdir(calendarHome) != 0) |
char *home = getenv("HOME"); |
return (NULL); |
if (home == NULL || *home == '\0') |
if (stat(calendarNoMail, &sbuf) == 0) |
errx(1, "cannot get home directory"); |
return (NULL); |
if (!(chdir(home) == 0 && |
if (!freopen(calendarFile, "r", stdin)) |
chdir(calendarHome) == 0 && |
return (NULL); |
(fdin = open(calendarFile, O_RDONLY)) != -1)) |
} else { |
errx(1, "no calendar file: ``%s'' or ``~/%s/%s''", |
chdir(getenv("HOME")); |
|
if (!(chdir(calendarHome) == 0 && |
|
freopen(calendarFile, "r", stdin))) |
|
errx(1, "no calendar file: ``%s'' or ``~/%s/%s", |
|
calendarFile, calendarHome, calendarFile); |
calendarFile, calendarHome, calendarFile); |
} |
} |
} |
} |
|
|
(void)close(pdes[1]); |
(void)close(pdes[1]); |
return (NULL); |
return (NULL); |
case 0: |
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) { |
if (pdes[1] != STDOUT_FILENO) { |
(void)dup2(pdes[1], STDOUT_FILENO); |
(void)dup2(pdes[1], STDOUT_FILENO); |
(void)close(pdes[1]); |
(void)close(pdes[1]); |
} |
} |
(void)close(pdes[0]); |
(void)close(pdes[0]); |
(void)setuid(geteuid()); |
/* Set stderr to /dev/null. Necessary so that cron does not |
(void)setgid(getegid()); |
* wait for cpp to finish if it's running calendar -a. |
execl(_PATH_CPP, "cpp", "-P", "-I.", _PATH_INCLUDE, NULL); |
*/ |
|
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); |
warn(_PATH_CPP); |
_exit(1); |
_exit(1); |
} |
} |
|
|
return (stdout); |
return (stdout); |
|
|
/* set output to a temporary file, so if no output don't send mail */ |
/* set output to a temporary file, so if no output don't send mail */ |
(void)snprintf(path, sizeof(path), "%s/_calXXXXXX", _PATH_TMP); |
return(tmpfile()); |
if ((fd = mkstemp(path)) < 0) |
|
return (NULL); |
|
return (fdopen(fd, "w+")); |
|
} |
} |
|
|
void |
void |
|
|
(void)close(pdes[0]); |
(void)close(pdes[0]); |
} |
} |
(void)close(pdes[1]); |
(void)close(pdes[1]); |
(void)setuid(geteuid()); |
|
(void)setgid(getegid()); |
|
execl(_PATH_SENDMAIL, "sendmail", "-i", "-t", "-F", |
execl(_PATH_SENDMAIL, "sendmail", "-i", "-t", "-F", |
"\"Reminder Service\"", "-f", "root", NULL); |
"\"Reminder Service\"", (char *)NULL); |
warn(_PATH_SENDMAIL); |
warn(_PATH_SENDMAIL); |
_exit(1); |
_exit(1); |
} |
} |
|
|
(void)write(pdes[1], buf, nread); |
(void)write(pdes[1], buf, nread); |
(void)close(pdes[1]); |
(void)close(pdes[1]); |
done: (void)fclose(fp); |
done: (void)fclose(fp); |
(void)unlink(path); |
while (wait(&status) >= 0) |
while (wait(&status) >= 0); |
; |
} |
} |
|
|
|
|