[BACK]Return to io.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / calendar

Diff for /src/usr.bin/calendar/io.c between version 1.10 and 1.27

version 1.10, 2000/12/07 19:36:37 version 1.27, 2004/12/10 15:00:27
Line 12 
Line 12 
  * 2. Redistributions in binary form must reproduce the above copyright   * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the   *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.   *    documentation and/or other materials provided with the distribution.
  * 3. All advertising materials mentioning features or use of this software   * 3. Neither the name of the University nor the names of its contributors
  *    must display the following acknowledgement:  
  *      This product includes software developed by the University of  
  *      California, Berkeley and its contributors.  
  * 4. Neither the name of the University nor the names of its contributors  
  *    may be used to endorse or promote products derived from this software   *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.   *    without specific prior written permission.
  *   *
Line 53 
Line 49 
 #include <sys/types.h>  #include <sys/types.h>
 #include <sys/uio.h>  #include <sys/uio.h>
 #include <sys/wait.h>  #include <sys/wait.h>
 #include <sys/file.h>  
   
 #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>
Line 70 
Line 66 
 #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},
Line 85 
Line 77 
 };  };
   
   
 int     openf(char *path);  
   
 void  void
 cal()  cal(void)
 {  {
         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;
           size_t nlen;
   
         events = NULL;          events = NULL;
         cur_evt = NULL;          cur_evt = NULL;
Line 116 
Line 107 
                 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;
                   } else if (strncmp(buf, "CALENDAR=", 9) == 0) {
                           char *ep;
   
                           if (buf[9] == '\0')
                                   calendar = 0;
                           else if (!strcasecmp(buf + 9, "julian")) {
                                   calendar = JULIAN;
                                   errno = 0;
                                   julian = strtoul(buf + 14, &ep, 10);
                                   if (buf[0] == '\0' || *ep != '\0')
                                           julian = 13;
                                   if ((errno == ERANGE && julian == ULONG_MAX) ||
                                       julian > 14)
                                           errx(1, "Julian calendar offset is too large");
                           } else if (!strcasecmp(buf + 9, "gregorian"))
                                   calendar = GREGORIAN;
                           else if (!strcasecmp(buf + 9, "lunar"))
                                   calendar = LUNAR;
                   } else if (bodun_maybe && strncmp(buf, "BODUN=", 6) == 0) {
                           bodun++;
                           if (prefix)
                                   free(prefix);
                           if ((prefix = strdup(buf + 6)) == NULL)
                                   err(1, NULL);
                           continue;
                 }                  }
                 /* User defined names for special events */                  /* User defined names for special events */
                 if ((p = strchr(buf, '='))) {                  if ((p = strchr(buf, '='))) {
Line 127 
Line 153 
                                 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;
                         }                          }
Line 136 
Line 162 
                         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;
Line 154 
Line 180 
                                 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,
Line 164 
Line 190 
                                         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);
                                                   int len = l1 + l2 + 2;
                                                   if ((cur_evt->ldesc =
                                                       malloc(len)) == NULL)
                                                           err(1, NULL);
                                                   snprintf(cur_evt->ldesc, len,
                                                       "\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;
                                 }                                  }
Line 177 
Line 213 
                         }                          }
                 }                  }
                 else if (printing) {                  else if (printing) {
                         if ((ev1->ldesc = realloc(ev1->ldesc,                          nlen = strlen(ev1->ldesc) + strlen(buf) + 2;
                             (2 + strlen(ev1->ldesc) + strlen(buf)))) == NULL)                          if ((ev1->ldesc = realloc(ev1->ldesc, nlen)) == NULL)
                                 errx(1, "cannot allocate memory");                                  err(1, NULL);
                         strcat(ev1->ldesc, "\n");                          snprintf(ev1->ldesc, nlen, "%s\n%s", ev1->ldesc, buf);
                         strcat(ev1->ldesc, buf);  
                 }                  }
         }          }
         tmp = events;          tmp = events;
Line 293 
Line 328 
         return (val);          return (val);
 }  }
   
 char path[MAXPATHLEN];  
   
 int  FILE *
 openf(path)  opencal(void)
         char *path;  
 {  {
           int pdes[2], fdin;
         struct stat st;          struct stat st;
         int fd;  
   
         fd = open(path, O_RDONLY|O_NONBLOCK);  
         if (fd == -1)  
                 return (-1);  
         if (fstat(fd, &st) == -1) {  
                 close(fd);  
                 return (-1);  
         }  
         if ((st.st_mode & S_IFMT) != S_IFREG) {  
                 close (fd);  
                 return (-1);  
         }  
   
         fcntl(fd, F_SETFD, fcntl(fd, F_GETFD, 0) &~ O_NONBLOCK);  
         return (fd);  
 }  
   
 FILE *  
 opencal()  
 {  
         int fd, pdes[2];  
         int fdin;  
         struct stat sbuf;  
   
         /* open up calendar file as stdin */          /* open up calendar file as stdin */
         if ((fdin = openf(calendarFile)) == -1) {          if ((fdin = open(calendarFile, O_RDONLY)) == -1 ||
                 if (doall) {              fstat(fdin, &st) == -1 || !S_ISREG(st.st_mode)) {
                         if (chdir(calendarHome) != 0)                  if (!doall) {
                                 return (NULL);  
                         if (stat(calendarNoMail, &sbuf) == 0)  
                                 return (NULL);  
                         if ((fdin = openf(calendarFile)) == -1)  
                                 return (NULL);  
                 } else {  
                         char *home = getenv("HOME");                          char *home = getenv("HOME");
                         if (home == NULL || *home == '\0')                          if (home == NULL || *home == '\0')
                                 errx(1, "cannot get home directory");                                  errx(1, "cannot get home directory");
                         if (!(chdir(home) == 0 &&                          if (!(chdir(home) == 0 &&
                             chdir(calendarHome) == 0 &&                              chdir(calendarHome) == 0 &&
                             (fdin = openf(calendarFile)) != -1))                              (fdin = open(calendarFile, O_RDONLY)) != -1))
                                 errx(1, "no calendar file: ``%s'' or ``~/%s/%s",                                  errx(1, "no calendar file: ``%s'' or ``~/%s/%s''",
                                     calendarFile, calendarHome, calendarFile);                                      calendarFile, calendarHome, calendarFile);
                 }                  }
         }          }
   
         if (pipe(pdes) < 0)          if (pipe(pdes) < 0)
                 return (NULL);                  return (NULL);
         switch (vfork()) {          switch (vfork()) {
Line 360 
Line 365 
                         (void)close(pdes[1]);                          (void)close(pdes[1]);
                 }                  }
                 (void)close(pdes[0]);                  (void)close(pdes[0]);
                 (void)setuid(geteuid());                  /*
                 (void)setgid(getegid());                   * Set stderr to /dev/null.  Necessary so that cron does not
                 execl(_PATH_CPP, "cpp", "-P", "-I.", _PATH_INCLUDE, NULL);                   * 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", "-traditional", "-P", "-I.",
                       _PATH_INCLUDE, (char *)NULL);
                 warn(_PATH_CPP);                  warn(_PATH_CPP);
                 _exit(1);                  _exit(1);
         }          }
Line 376 
Line 392 
                 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
Line 410 
Line 423 
                         (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\"", NULL);                      "\"Reminder Service\"", (char *)NULL);
                 warn(_PATH_SENDMAIL);                  warn(_PATH_SENDMAIL);
                 _exit(1);                  _exit(1);
         }          }
Line 427 
Line 438 
                 (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)
                 ;                  ;
 }  }

Legend:
Removed from v.1.10  
changed lines
  Added in v.1.27