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

Diff for /src/usr.bin/msgs/Attic/msgs.c between version 1.28 and 1.29

version 1.28, 2003/10/04 21:55:12 version 1.29, 2004/10/02 04:14:39
Line 183 
Line 183 
         while (argc > 0) {          while (argc > 0) {
                 if (isdigit(argv[0][0])) {      /* starting message # */                  if (isdigit(argv[0][0])) {      /* starting message # */
                         rcfirst = atoi(argv[0]);                          rcfirst = atoi(argv[0]);
                 }                  } else if (isdigit(argv[0][1])) {       /* backward offset */
                 else if (isdigit(argv[0][1])) { /* backward offset */                          rcback = atoi(&(argv[0][1]));
                         rcback = atoi( &( argv[0][1] ) );                  } else {
                 }  
                 else {  
                         ptr = *argv;                          ptr = *argv;
                         while (*ptr) switch (*ptr++) {                          while (*ptr) {
                                   switch (*ptr++) {
                         case '-':                                  case '-':
                                 break;                                          break;
                                   case 'c':
                         case 'c':                                          if (uid != SUPERUSER && uid != DAEMON) {
                                 if (uid != SUPERUSER && uid != DAEMON) {                                                  fprintf(stderr, "Sorry\n");
                                         fprintf(stderr, "Sorry\n");                                                  exit(1);
                                           }
                                           clean = YES;
                                           break;
                                   case 'f':       /* silently */
                                           hush = YES;
                                           break;
                                   case 'h':       /* headers only */
                                           hdrs = YES;
                                           break;
                                   case 'l':       /* local msgs only */
                                           locomode = YES;
                                           break;
                                   case 'o':       /* option to save last message */
                                           lastcmd = YES;
                                           break;
                                   case 'p':       /* pipe thru 'more' during long msgs */
                                           use_pager = YES;
                                           break;
                                   case 'q':       /* query only */
                                           qopt = YES;
                                           break;
                                   case 'r':       /* restricted */
                                           restricted = YES;
                                           break;
                                   case 's':       /* sending TO msgs */
                                           send_msg = YES;
                                           break;
                                   default:
                                           fprintf(stderr,
                                               "usage: msgs [fhlopqr] [[-]number]\n"
                                               "       msgs [-s]\n"
                                               "       msgs [-c [-days]]\n");
                                         exit(1);                                          exit(1);
                                 }                                  }
                                 clean = YES;  
                                 break;  
   
                         case 'f':               /* silently */  
                                 hush = YES;  
                                 break;  
   
                         case 'h':               /* headers only */  
                                 hdrs = YES;  
                                 break;  
   
                         case 'l':               /* local msgs only */  
                                 locomode = YES;  
                                 break;  
   
                         case 'o':               /* option to save last message */  
                                 lastcmd = YES;  
                                 break;  
   
                         case 'p':               /* pipe thru 'more' during long msgs */  
                                 use_pager = YES;  
                                 break;  
   
                         case 'q':               /* query only */  
                                 qopt = YES;  
                                 break;  
   
                         case 'r':               /* restricted */  
                                 restricted = YES;  
                                 break;  
   
   
                         case 's':               /* sending TO msgs */  
                                 send_msg = YES;  
                                 break;  
   
                         default:  
                                 fprintf(stderr,  
                                         "usage: msgs [fhlopqr] [[-]number]\n"  
                                         "       msgs [-s]\n"  
                                         "       msgs [-c [-days]]\n");  
                                 exit(1);  
                         }                          }
                 }                  }
                 argc--, argv++;                  argc--, argv++;
Line 260 
Line 248 
                         }                          }
                         fprintf(bounds, "1 0\n");                          fprintf(bounds, "1 0\n");
                         rewind(bounds);                          rewind(bounds);
                 }                  } else {
                 else {  
                         perror(fname);                          perror(fname);
                         exit(1);                          exit(1);
                 }                  }
Line 301 
Line 288 
   
                         if (clean)                          if (clean)
                                 snprintf(inbuf, sizeof(inbuf), "%s/%s",                                  snprintf(inbuf, sizeof(inbuf), "%s/%s",
                                          _PATH_MSGS, cp);                                      _PATH_MSGS, cp);
   
                         while (isdigit(*cp))                          while (isdigit(*cp))
                                 i = i * 10 + *cp++ - '0';                                  i = i * 10 + *cp++ - '0';
Line 311 
Line 298 
                         if (clean) {                          if (clean) {
                                 if (stat(inbuf, &stbuf) != 0)                                  if (stat(inbuf, &stbuf) != 0)
                                         continue;                                          continue;
                                 if (stbuf.st_mtime < keep                                  if (stbuf.st_mtime < keep &&
                                     && stbuf.st_mode&S_IWRITE) {                                      stbuf.st_mode&S_IWRITE) {
                                         unlink(inbuf);                                          unlink(inbuf);
                                         continue;                                          continue;
                                 }                                  }
Line 330 
Line 317 
                         if (blast != 0) /* never lower the upper bound! */                          if (blast != 0) /* never lower the upper bound! */
                                 lastmsg = blast;                                  lastmsg = blast;
                         firstmsg = lastmsg + 1;                          firstmsg = lastmsg + 1;
                 }                  } else if (blast > lastmsg)
                 else if (blast > lastmsg)  
                         lastmsg = blast;                          lastmsg = blast;
   
                 if (!send_msg) {                  if (!send_msg) {
Line 375 
Line 361 
                 if (isatty(fileno(stdin))) {                  if (isatty(fileno(stdin))) {
                         ptr = getpwuid(uid)->pw_name;                          ptr = getpwuid(uid)->pw_name;
                         printf("Message %d:\nFrom %s %sSubject: ",                          printf("Message %d:\nFrom %s %sSubject: ",
                                 nextmsg, ptr, ctime(&t));                              nextmsg, ptr, ctime(&t));
                         fflush(stdout);                          fflush(stdout);
                         fgets(inbuf, sizeof inbuf, stdin);                          fgets(inbuf, sizeof inbuf, stdin);
                         putchar('\n');                          putchar('\n');
                         fflush(stdout);                          fflush(stdout);
                         fprintf(newmsg, "From %s %sSubject: %s\n",                          fprintf(newmsg, "From %s %sSubject: %s\n",
                                 ptr, ctime(&t), inbuf);                              ptr, ctime(&t), inbuf);
                         blankline = seensubj = YES;                          blankline = seensubj = YES;
                 }                  } else
                 else  
                         blankline = seensubj = NO;                          blankline = seensubj = NO;
                 for (;;) {                  for (;;) {
                         fgets(inbuf, sizeof inbuf, stdin);                          fgets(inbuf, sizeof inbuf, stdin);
                         if (feof(stdin) || ferror(stdin))                          if (feof(stdin) || ferror(stdin))
                                 break;                                  break;
                         blankline = (blankline || (inbuf[0] == '\n'));                          blankline = (blankline || (inbuf[0] == '\n'));
                         seensubj = (seensubj || (!blankline && (strncmp(inbuf, "Subj", 4) == 0)));                          seensubj = (seensubj ||
                               (!blankline && (strncmp(inbuf, "Subj", 4) == 0)));
                         fputs(inbuf, newmsg);                          fputs(inbuf, newmsg);
                 }                  }
 #ifdef OBJECT  #ifdef OBJECT
Line 426 
Line 412 
                 fclose(msgsrc);                  fclose(msgsrc);
                 if (nextmsg > lastmsg+1) {                  if (nextmsg > lastmsg+1) {
                         printf("Warning: bounds have been reset (%d, %d)\n",                          printf("Warning: bounds have been reset (%d, %d)\n",
                                 firstmsg, lastmsg);                              firstmsg, lastmsg);
                         truncate(fname, (off_t)0);                          truncate(fname, (off_t)0);
                         newrc = YES;                          newrc = YES;
                 }                  } else if (!rcfirst)
                 else if (!rcfirst)  
                         rcfirst = nextmsg - rcback;                          rcfirst = nextmsg - rcback;
         }          } else
         else  
                 newrc = YES;                  newrc = YES;
         msgsrc = fopen(fname, "r+");          msgsrc = fopen(fname, "r+");
         if (msgsrc == NULL)          if (msgsrc == NULL)
Line 445 
Line 429 
         if (rcfirst) {          if (rcfirst) {
                 if (rcfirst > lastmsg+1) {                  if (rcfirst > lastmsg+1) {
                         printf("Warning: the last message is number %d.\n",                          printf("Warning: the last message is number %d.\n",
                                 lastmsg);                              lastmsg);
                         rcfirst = nextmsg;                          rcfirst = nextmsg;
                 }                  }
                 if (rcfirst > firstmsg)                  if (rcfirst > firstmsg)
Line 453 
Line 437 
         }          }
         if (newrc) {          if (newrc) {
                 nextmsg = firstmsg;                  nextmsg = firstmsg;
                 fseek(msgsrc, 0L, 0);                  fseeko(msgsrc, (off_t)0, SEEK_SET);
                 fprintf(msgsrc, "%d\n", nextmsg);                  fprintf(msgsrc, "%d\n", nextmsg);
                 fflush(msgsrc);                  fflush(msgsrc);
         }          }
Line 521 
Line 505 
                 if (seensubj) {                  if (seensubj) {
                         printf("Subject: %s", subj);                          printf("Subject: %s", subj);
                         nlines++;                          nlines++;
                 }                  } else {
                 else {  
                         if (seenfrom) {                          if (seenfrom) {
                                 putchar('\n');                                  putchar('\n');
                                 nlines++;                                  nlines++;
                         }                          }
                         while (nlines < 6                          while (nlines < 6 &&
                             && fgets(inbuf, sizeof inbuf, newmsg)                              fgets(inbuf, sizeof inbuf, newmsg) &&
                             && inbuf[0] != '\n') {                              inbuf[0] != '\n') {
                                 fputs(inbuf, stdout);                                  fputs(inbuf, stdout);
                                 nlines++;                                  nlines++;
                         }                          }
Line 557 
Line 540 
 cmnd:  cmnd:
                 in = inbuf;                  in = inbuf;
                 switch (*in) {                  switch (*in) {
                         case 'x':                  case 'x':
                         case 'X':                  case 'X':
                                 exit(0);                          exit(0);
   
                         case 'q':                  case 'q':
                         case 'Q':                  case 'Q':
                                 quitit = YES;                          quitit = YES;
                                 printf("--Postponed--\n");                          printf("--Postponed--\n");
                                 exit(0);                          exit(0);
                                 /* intentional fall-thru */                          /* intentional fall-thru */
                         case 'n':                  case 'n':
                         case 'N':                  case 'N':
                                 if (msg >= nextmsg) sep = "Flushed";                          if (msg >= nextmsg)
                                 prevmsg = msg;                                  sep = "Flushed";
                           prevmsg = msg;
                           break;
   
                   case 'p':
                   case 'P':
                           use_pager = (*in++ == 'p');
                           /* intentional fallthru */
                   case '\n':
                   case 'y':
                   default:
                           if (*in == '-') {
                                   msg = prevmsg-1;
                                   sep = "replay";
                                 break;                                  break;
                           }
                           if (isdigit(*in)) {
                                   msg = next(in, sizeof inbuf);
                                   sep = in;
                                   break;
                           }
   
                         case 'p':                          prmesg(nlines + lct + (seensubj? 1 : 0));
                         case 'P':                          prevmsg = msg;
                                 use_pager = (*in++ == 'p');  
                                 /* intentional fallthru */  
                         case '\n':  
                         case 'y':  
                         default:  
                                 if (*in == '-') {  
                                         msg = prevmsg-1;  
                                         sep = "replay";  
                                         break;  
                                 }  
                                 if (isdigit(*in)) {  
                                         msg = next(in, sizeof inbuf);  
                                         sep = in;  
                                         break;  
                                 }  
   
                                 prmesg(nlines + lct + (seensubj? 1 : 0));  
                                 prevmsg = msg;  
   
                 }                  }
   
                 printf("--%s--\n", sep);                  printf("--%s--\n", sep);
                 sep = "-";                  sep = "-";
                 if (msg >= nextmsg) {                  if (msg >= nextmsg) {
                         nextmsg = msg + 1;                          nextmsg = msg + 1;
                         fseek(msgsrc, 0L, 0);                          fseeko(msgsrc, (off_t)0, SEEK_SET);
                         fprintf(msgsrc, "%d\n", nextmsg);                          fprintf(msgsrc, "%d\n", nextmsg);
                         fflush(msgsrc);                          fflush(msgsrc);
                 }                  }
Line 615 
Line 598 
          */           */
         if (--msg >= nextmsg) {          if (--msg >= nextmsg) {
                 nextmsg = msg + 1;                  nextmsg = msg + 1;
                 fseek(msgsrc, 0L, 0);                  fseeko(msgsrc, (off_t)0, SEEK_SET);
                 fprintf(msgsrc, "%d\n", nextmsg);                  fprintf(msgsrc, "%d\n", nextmsg);
                 fflush(msgsrc);                  fflush(msgsrc);
         }          }
Line 671 
Line 654 
                 pclose(outf);                  pclose(outf);
                 signal(SIGPIPE, SIG_DFL);                  signal(SIGPIPE, SIG_DFL);
                 signal(SIGQUIT, SIG_DFL);                  signal(SIGQUIT, SIG_DFL);
         }          } else {
         else {  
                 fflush(stdout);                  fflush(stdout);
         }          }
   
Line 680 
Line 662 
         tcdrain(fileno(stdout));          tcdrain(fileno(stdout));
 }  }
   
   /* ARGSUSED */
 void  void
 onintr(int unused)  onintr(int signo)
 {  {
           int save_errno = errno;
   
         signal(SIGINT, onintr);          signal(SIGINT, onintr);
         if (mailing)          if (mailing)
                 unlink(fname);                  unlink(fname);
         if (sending) {          if (sending) {
                 unlink(fname);                  unlink(fname);
                 puts("--Killed--");                  write(STDOUT_FILENO, "--Killed--\n", strlen("--Killed--\n"));
                 exit(1);                  _exit(1);
         }          }
         if (printing) {          if (printing) {
                 putchar('\n');                  write(STDOUT_FILENO, "\n", 1);
                 if (hdrs)                  if (hdrs)
                         exit(0);                          _exit(0);
                 sep = "Interrupt";                  sep = "Interrupt";
                 if (newmsg)                  if (newmsg)
                         fseek(newmsg, 0L, 2);                          fseeko(newmsg, (off_t)0, SEEK_END);
                 intrpflg = YES;                  intrpflg = YES;
         }          }
           errno = save_errno;
 }  }
   
 /*  /*
  * We have just gotten a susp.  Suspend and prepare to resume.   * We have just gotten a susp.  Suspend and prepare to resume.
  */   */
   /* ARGSUSED */
 void  void
 onsusp(int unused)  onsusp(int signo)
 {  {
           int save_errno = errno;
         sigset_t emptyset;          sigset_t emptyset;
   
         signal(SIGTSTP, SIG_DFL);          signal(SIGTSTP, SIG_DFL);
Line 715 
Line 703 
         sigprocmask(SIG_SETMASK, &emptyset, NULL);          sigprocmask(SIG_SETMASK, &emptyset, NULL);
         kill(0, SIGTSTP);          kill(0, SIGTSTP);
         signal(SIGTSTP, onsusp);          signal(SIGTSTP, onsusp);
           errno = save_errno;
   
         if (!mailing)          if (!mailing)
                 longjmp(tstpbuf, 1);                  longjmp(tstpbuf, 1);
 }  }
Line 722 
Line 712 
 int  int
 linecnt(FILE *f)  linecnt(FILE *f)
 {  {
         off_t oldpos = ftell(f);          off_t oldpos = ftello(f);
   
         int l = 0;          int l = 0;
         char lbuf[BUFSIZ];          char lbuf[BUFSIZ];
   
         while (fgets(lbuf, sizeof lbuf, f))          while (fgets(lbuf, sizeof lbuf, f))
                 l++;                  l++;
         clearerr(f);          clearerr(f);
         fseek(f, oldpos, 0);          fseeko(f, oldpos, SEEK_SET);
         return (l);          return (l);
 }  }
   
Line 771 
Line 762 
                         cmsg = msg;                          cmsg = msg;
                 snprintf(fname, sizeof(fname), "%s/%d", _PATH_MSGS, cmsg);                  snprintf(fname, sizeof(fname), "%s/%d", _PATH_MSGS, cmsg);
   
                 oldpos = ftell(newmsg);                  oldpos = ftello(newmsg);
   
                 cpfrom = fopen(fname, "r");                  cpfrom = fopen(fname, "r");
                 if (!cpfrom) {                  if (!cpfrom) {
Line 784 
Line 775 
                         in = nxtfld(inbuf);                          in = nxtfld(inbuf);
                         if (*in) {                          if (*in) {
                                 for (n=0;                                  for (n=0;
                                      in[n] > ' ' && n < sizeof fname - 1;                                      in[n] > ' ' && n < sizeof fname - 1;
                                      n++) {                                      n++) {
                                         fname[n] = in[n];                                          fname[n] = in[n];
                                 }                                  }
                                 fname[n] = NULL;                                  fname[n] = NULL;
Line 793 
Line 784 
                         else                          else
                                 strlcpy(fname, "Messages", sizeof fname);                                  strlcpy(fname, "Messages", sizeof fname);
                         fd = open(fname, O_RDWR|O_EXCL|O_CREAT|O_APPEND, 0666);                          fd = open(fname, O_RDWR|O_EXCL|O_CREAT|O_APPEND, 0666);
                 }                  } else {
                 else {  
                         strlcpy(fname, _PATH_TMPFILE, sizeof fname);                          strlcpy(fname, _PATH_TMPFILE, sizeof fname);
                         fd = mkstemp(fname);                          fd = mkstemp(fname);
                         if (fd != -1) {                          if (fd != -1) {
Line 807 
Line 797 
                                 close(fd);                                  close(fd);
                         perror(fname);                          perror(fname);
                         mailing = NO;                          mailing = NO;
                         fseek(newmsg, oldpos, 0);                          fseeko(newmsg, oldpos, SEEK_SET);
                         ask(prompt);                          ask(prompt);
                         return;                          return;
                 }                  }
Line 817 
Line 807 
   
                 fclose(cpfrom);                  fclose(cpfrom);
                 fclose(cpto);                  fclose(cpto);
                 fseek(newmsg, oldpos, 0);       /* reposition current message */                  fseeko(newmsg, oldpos, SEEK_SET);       /* reposition current message */
                 if (inch == 's')                  if (inch == 's')
                         printf("Message %d saved in \"%s\"\n", cmsg, fname);                          printf("Message %d saved in \"%s\"\n", cmsg, fname);
                 else {                  else {
Line 847 
Line 837 
                          * expected form starts with From                           * expected form starts with From
                          */                           */
                         seenfrom = YES;                          seenfrom = YES;
                         frompos = ftell(infile);                          frompos = ftello(infile);
                         ptr = from;                          ptr = from;
                         in = nxtfld(inbuf);                          in = nxtfld(inbuf);
                         if (*in) {                          if (*in) {
Line 865 
Line 855 
                                 date[0] = '\n';                                  date[0] = '\n';
                                 date[1] = NULL;                                  date[1] = NULL;
                         }                          }
                 }                  } else {
                 else {  
                         /*                          /*
                          * not the expected form                           * not the expected form
                          */                           */
                         fseek(infile, 0L, 0);                          fseeko(infile, (off_t)0, SEEK_SET);
                         return;                          return;
                 }                  }
         }          } else
         else  
                 /*                  /*
                  * empty file ?                   * empty file ?
                  */                   */
Line 883 
Line 871 
         /*          /*
          * look for Subject line until EOF or a blank line           * look for Subject line until EOF or a blank line
          */           */
         while (fgets(inbuf, sizeof inbuf, infile)          while (fgets(inbuf, sizeof inbuf, infile) &&
             && !(blankline = (inbuf[0] == '\n'))) {              !(blankline = (inbuf[0] == '\n'))) {
                 /*                  /*
                  * extract Subject line                   * extract Subject line
                  */                   */
                 if (!seensubj && strncmp(inbuf, "Subj", 4)==0) {                  if (!seensubj && strncmp(inbuf, "Subj", 4)==0) {
                         seensubj = YES;                          seensubj = YES;
                         frompos = ftell(infile);                          frompos = ftello(infile);
                         strncpy(subj, nxtfld(inbuf), sizeof subj);                          strncpy(subj, nxtfld(inbuf), sizeof subj);
                 }                  }
         }          }
Line 898 
Line 886 
                 /*                  /*
                  * ran into EOF                   * ran into EOF
                  */                   */
                 fseek(infile, frompos, 0);                  fseeko(infile, frompos, SEEK_SET);
   
         if (!seensubj)          if (!seensubj)
                 /*                  /*
Line 910 
Line 898 
 char *  char *
 nxtfld(char *s)  nxtfld(char *s)
 {  {
         if (*s) while (*s && *s > ' ') s++;     /* skip over this field */          if (*s)
         if (*s) while (*s && *s <= ' ') s++;    /* find start of next field */                  while (*s && *s > ' ')
                           s++;    /* skip over this field */
           if (*s)
                   while (*s && *s <= ' ')
                           s++;    /* find start of next field */
         return (s);          return (s);
 }  }

Legend:
Removed from v.1.28  
changed lines
  Added in v.1.29