1: static char sccsid[] = "@(#)v6mail.c	4.4	(Berkeley)	1/9/83";
   2: 
   3: /*
   4:  * Version 6 Cory mail--
   5:  *	a clean and simple mail program
   6:  *	machine and version independent
   7:  *		Eric Schmidt
   8:  *	must run as setuid root to chown the destination mailbox
   9:  *	if NOTROOT defined, doesn't need to run as root
  10:  *
  11:  *	DON'T CHANGE THIS CODE
  12:  *		bitch to "csvax:schmidt" instead
  13:  */
  14: 
  15: /*
  16:  * mail command usage
  17:  *	mail [-yn]
  18:  *		prints your mail
  19:  *	mail people
  20:  *		sends standard input to people
  21:  *
  22:  *	mail -r fromaddr people
  23:  *		sends mail from the network
  24:  *
  25:  *	mail -d people
  26:  *		don't call sendmail, send mail directly
  27:  *	mail msgs
  28:  *		send to "msgs"
  29:  *	mail filename
  30:  *		mail to filename instead of user (must be at least one /)
  31:  *	mail -D
  32:  *		delete the invokers mailbox (more efficient than
  33:  *			mail -n >/dev/null)
  34:  */
  35: 
  36: /*
  37:  *	bugs:
  38:  *		Ingres 11/70 multiple names/uid?
  39:  *	additions:
  40:  *		Save? type 'x' - doesn't unlink the mail file
  41:  */
  42: /*
  43:  * BIFF is an immediate notification flag using the IPC stuff
  44:  */
  45: # include "local.h"
  46: # include <stdio.h>
  47: # include "mach.h"
  48: 
  49: # ifdef RAND
  50: 
  51: /* for all machines at RAND */
  52: # define MAILMODE 0644
  53: 
  54: # endif RAND
  55: 
  56: # ifdef NOSC
  57: 
  58: /* for all machines at NOSC */
  59: # define MAILMODE 0644
  60: 
  61: # endif NOSC
  62: 
  63: # ifdef BERKELEY
  64: /* for Berkeley */
  65: /* for each machine */
  66: /* lump the CC machines into one */
  67: # ifdef CCV7
  68: # define MAILMODE 0600
  69: # define MSGSCMD "/usr/ucb/bin/msgs"
  70: # endif
  71: 
  72: # ifdef CCV6
  73: # define MSGSCMD "/usr/bin/eecs/msgs"
  74: # define MAILMODE 0600
  75: # endif
  76: 
  77: # ifdef ING70
  78: # define MAILMODE 0666
  79: # define MSGSCMD "/usr/bin/msgs"
  80: # define NOTROOT
  81: # endif
  82: 
  83: # ifdef INGVAX
  84: # define MAILMODE 0644
  85: # define MSGSCMD "/usr/ucb/msgs"
  86: # endif
  87: 
  88: /*
  89: # ifdef VIRUS
  90: # define MAILMODE 0644
  91: # define MSGSCMD "/usr/bin/msgs"
  92: # endif
  93: */
  94: 
  95: # ifdef UCBVAX
  96: # define MAILMODE 0644
  97: # define MSGSCMD "/usr/ucb/msgs"
  98: # define BIFF
  99: # endif
 100: 
 101: # ifdef IMAGE
 102: # define MAILMODE 0644
 103: # define MSGSCMD "/usr/bin/msgs"
 104: # endif
 105: 
 106: # ifdef KIM
 107: # define MAILMODE 0644
 108: # define MSGSCMD "/usr/ucb/msgs"
 109: # endif
 110: 
 111: # ifdef ESVAX
 112: # define MAILMODE 0644
 113: # define MSGSCMD "/usr/ucb/msgs"
 114: # endif
 115: 
 116: # ifdef Q
 117: # define MAILMODE 0600
 118: # define MSGSCMD "/usr/bin/eecs/msgs"
 119: # endif
 120: 
 121: # ifdef ARPAVAX
 122: # define MAILMODE 0644
 123: # define MSGSCMD "/usr/ucb/msgs"
 124: # define BIFF
 125: # endif
 126: 
 127: # ifdef SRC
 128: # define MAILMODE 0600
 129: # define MSGSCMD "/usr/bin/msgs"
 130: # endif
 131: 
 132: # ifdef MATHSTAT
 133: # define MAILMODE 0600
 134: # define MSGSCMD "/usr/bin/msgs"
 135: # endif
 136: 
 137: # ifdef CSVAX
 138: # define MAILMODE 0644
 139: # define MSGSCMD "/usr/ucb/msgs"
 140: # define BIFF
 141: # endif
 142: 
 143: # ifdef ONYX
 144: # define MAILMODE 0644
 145: # define MSGSCMD "/usr/ucb/bin/msgs"
 146: # endif
 147: 
 148: # ifdef CORY
 149: # define MAILMODE 0600
 150: # define MSGSCMD "/usr/bin/eecs/msgs"
 151: # endif
 152: 
 153: # ifdef EECS40
 154: # define MAILMODE 0644
 155: # define MSGSCMD "/usr/bin/msgs"
 156: # endif
 157: /* end of berkeley defsn */
 158: 
 159: # endif
 160: /* end of per-machine ifdefs */
 161: 
 162: # ifdef USRMAIL
 163: # define MAILDIR "/usr/mail"
 164: # else
 165: # define MAILDIR "/usr/spool/mail"
 166: # endif
 167: 
 168: char    lettmp[]  = "/tmp/MaXXXXX"; /* keep letter before sending it */
 169: char    preptmp[] = "/tmp/mbXXXXX"; /* if prepending msg, use this file */
 170: int chew;               /* if true, strip extra from lines */
 171: int dflag;              /* if true, don't call sendmail */
 172: char    shopcnt[30] = "0";      /* hop count parameter for rmt mail */
 173: int errs;               /* no of errs in sending */
 174: char    deleteonly;         /* if true, just delete mailbox */
 175: char    remname[50];            /* if non-empty, from line extra */
 176: 
 177: char _sobuf[BUFSIZ];
 178: main(argc, argv)
 179: char **argv;
 180: {
 181:     register int myuid;
 182:     int delexit();
 183:     char namebuf[128], *sn = NULL, logindir[60];
 184:     struct passwd *pwd;
 185: 
 186:     setbuf(stdout,_sobuf);
 187:     mktemp(lettmp);
 188:     mktemp(preptmp);
 189:     unlink(lettmp);
 190:     unlink(preptmp);
 191:     myuid = getuid();
 192:     logindir[0] = 0;
 193:     sn = getlogin();
 194:     if(sn == NULL || *sn == 0 || *sn == ' '){
 195:         pwd = getpwuid(myuid);      /* will read passwd file */
 196:         if(pwd != NULL){
 197:             sn = pwd->pw_name;
 198:             strcpy(logindir,pwd->pw_dir);
 199:         }
 200:         if(sn == NULL){
 201:             fprintf(stderr,"Who are you?\n");
 202:             delexit(EX_OSFILE);
 203:         }
 204:     }
 205:     strcpy(namebuf,sn);
 206:     if (argc < 2)
 207:         goto hitit;
 208:     for (argc--, argv++; argc > 0 && argv[0][0] == '-'; argc--, argv++)
 209:     switch(argv[0][1]) {
 210:         case 'y':
 211:         case 'n':
 212:             argc++, argv--;
 213: hitit:
 214:             printmail(argc, argv, namebuf,logindir);
 215:             delexit(EX_OK);
 216: 
 217:         case 'r':   /* one-arg -r--   -r addr */
 218:             if (argc < 2)
 219:                 continue;
 220:             /* ignore -r if not network or root */
 221:             if (strcmp("network", namebuf) == 0 || myuid == 0 ||
 222:                 strcmp("uucp", namebuf) == 0 || index(argv[1], '!') != NULL) {
 223:                 strcpy(namebuf,argv[1]);
 224:                 chew++;     /* eat From lines */
 225:             }
 226:             else strcpy(remname, argv[1]);
 227:             argc--, argv++;
 228:             continue;
 229:         case 'h':   /* hop count - used by network */
 230:             if(argc < 2) continue;
 231:             strcpy(shopcnt,argv[1]);
 232:             argc--, argv++;
 233:             continue;
 234:         case 'd':   /* really deliver this message */
 235:             dflag++;
 236:             continue;
 237:         case 'D':   /* only delete the invokers mailbox */
 238:             deleteonly++;
 239:             goto hitit;     /* delete mail box, thats all */
 240:     }
 241:     /* if we are already ignoring signals, catch sigint */
 242:     if(signal(SIGINT,SIG_IGN) != SIG_IGN)
 243:         signal(SIGINT, delexit);
 244:     argc++, argv--;
 245:     bulkmail(argc, argv, namebuf);
 246:     delexit(EX_OK);
 247: }
 248: 
 249: printmail(argc, argv, name, logindir)
 250: char **argv;
 251: char *name, *logindir;
 252: {
 253:     register int c;
 254:     FILE *fdin;
 255:     char sfnmail[60], mbox[120];
 256:     struct stat statbuf;
 257: 
 258: # ifdef OLDMAIL
 259:     if(logindir[0] == 0){
 260:         pwd = getpwuid(getuid());
 261:         if(pwd == NULL){
 262:             fprintf(stderr,"Can't get directory\n");
 263:             exit(EX_OSFILE);
 264:         }
 265:         strcpy(logindir, pwd->pw_dir);
 266:     }
 267:     sprintf(sfnmail,"%s/.mail",logindir);
 268: # else
 269:     sprintf(sfnmail,"%s/%s",MAILDIR,name);
 270: # endif
 271:     if(deleteonly){
 272:         remove(sfnmail);
 273:         return;
 274:     }
 275:     if (stat(sfnmail, &statbuf)>=0 && statbuf.st_nlink==1 &&
 276:         getsize(&statbuf) > 0L && (fdin = fopen(sfnmail, "r")) != NULL){
 277:         getput(fdin, stdout);
 278:         fclose(fdin);
 279:         fflush(stdout);
 280:         c = 'y';
 281:         if (argc<2) {
 282:             if(isatty(0)){
 283:                 printf("Save(y-n) ?");
 284:                 fflush(stdout);
 285:                 c = getchar();
 286:             }
 287:         } else
 288:             c = argv[1][1];
 289:         if (!any(c, "xyn"))
 290:             delexit(EX_OK);
 291:         if (c == 'y') {
 292:             sprintf(mbox,"%s/mbox",logindir);
 293:             if (accesss(mbox)) {
 294:                 printf("Saved mail in 'mbox'\n");
 295:                 if(insert(sfnmail, mbox, getuid(),getgid()))
 296:                     remove(sfnmail);
 297:             }
 298:             else printf("In wrong directory\n");
 299:         }
 300:         else if(c != 'x') remove(sfnmail);
 301:     } else
 302:         printf("No mail.\n");
 303: }
 304: 
 305: bulkmail(argc, argv, from)
 306: char **argv, *from;
 307: {
 308:     extern int errno;
 309:     char linebuf[BUFSIZ];
 310:     char *getdate();
 311:     FILE *fdout;
 312: 
 313: # ifdef SENDMAIL
 314:     /*
 315: 	**  Ship off to sendmail if appropriate (and possible)
 316: 	*/
 317: 
 318:     if (!dflag)
 319:     {
 320:         argv[0] = "-sendmail";
 321:         argv[argc] = 0;
 322:         execv("/usr/lib/sendmail", argv);
 323:         /* oops...  better just deliver it. */
 324:         fprintf(stderr, "Not using sendmail\n");
 325:         errno = 0;
 326:         argv[argc] = (char *)-1;
 327:     }
 328: # endif
 329: 
 330:     fdout = fopen(lettmp, "w");
 331:     if (fdout == NULL) {
 332:         perror(lettmp);
 333:         delexit(EX_OSFILE);
 334:     }
 335:     /*
 336: 	 * If delivering mail from the network via mail -r,
 337: 	 * Strip the leading line and throw it away, as long
 338: 	 * as it begins with "From ..." (and preserve the date if poss.)
 339: 	 */
 340:     if (chew) {
 341:         fgets(linebuf,BUFSIZ,stdin);
 342:         if(strncmp(linebuf,"From ",5) != 0){
 343:             fline(fdout,NULL,from);
 344:             fprintf(fdout,"%s", linebuf);
 345:         }
 346:         else fline(fdout,getdate(linebuf),from);
 347:     }
 348:     else fline(fdout,NULL,from);
 349:     if(remname[0]) fprintf(fdout,"(from %s)\n",remname);
 350: 
 351:     /* on the image machine, promt with subj */
 352:     if(getput(stdin,fdout) == 0)
 353:         delexit(EX_OSERR);
 354:     putc('\n',fdout);
 355:     fclose(fdout);
 356:     while (--argc > 0)
 357:         sendto(*++argv,from);
 358:     delexit(errs);
 359: }
 360: /* print from line, with date date, if date = NULL, compute it */
 361: fline(fdout,date,from)
 362: FILE *fdout;
 363: char *date;
 364: char *from;
 365: {
 366:     int tbuf[2];
 367: 
 368:     if(date == NULL){
 369:         time(tbuf);
 370:         date = ctime(tbuf);
 371:     }
 372:     fprintf(fdout,"From %s  %s", from, date);
 373: }
 374: /* look over linebuf and return ptr to date, NULL if error */
 375: char *getdate(linebuf)
 376: char *linebuf;
 377: {
 378:     register char *s;
 379:     s = linebuf;
 380:     while(*s){
 381:         if(strncmp(s," Sun ",5) == 0
 382:         || strncmp(s," Mon ",5) == 0
 383:         || strncmp(s," Tue ",5) == 0
 384:         || strncmp(s," Wed ",5) == 0
 385:         || strncmp(s," Thu ",5) == 0
 386:         || strncmp(s," Fri ",5) == 0
 387:         || strncmp(s," Sat ",5) == 0)
 388:             return(++s);
 389:         s++;
 390:     }
 391:     return(NULL);
 392: }
 393: 
 394: sendto(person, fromaddr)
 395: char *person;
 396: char *fromaddr;
 397: {
 398:     static int saved = 0;
 399:     register int hisuid, hisgid;
 400:     char sfnmail[60], logindir[60];
 401:     struct passwd *pwd;
 402: 
 403:     stripmach(&person);
 404:     if(person[0] == ':')person++;
 405:     /* sendmail provides these services */
 406:     if(any(':',person)
 407: # ifdef MSGSCMD
 408:         || strcmp(person,"msgs") == 0
 409: # endif
 410:         ){
 411:         int pid;
 412:         int pidchild;
 413: 
 414:         while((pid = fork()) == -1)sleep(2);
 415:         if (pid < 0) {
 416:             perror("fork");
 417:             goto assback;
 418:         }
 419:         if (pid == 0) {
 420:             fclose(stdin);
 421:             freopen(lettmp,"r",stdin);
 422:             setuid(getuid());   /* insure no security hole*/
 423:             if (strcmp(person,"msgs") != 0) {
 424:                 /*
 425: 				sendberkmail will add the machine, e.g.
 426: 				CSVAX:schmidt, if the -f flag is not set
 427: 				*/
 428:                 execl("/usr/net/bin/sendberkmail",
 429:                 "sendberkmail", "-t",person,"-h",shopcnt,
 430:                 chew ? "-f" : 0,fromaddr,0);
 431:                 perror("/usr/net/bin/sendberkmail");
 432:             }
 433: # ifdef MSGSCMD
 434:             else {
 435:                 execl(MSGSCMD, "msgs", "-s", 0);
 436:                 perror(MSGSCMD);
 437:             }
 438: # endif
 439:             exit(EX_UNAVAILABLE);
 440:         }
 441:         for (;;) {
 442:             register int rcode = wait(&pidchild);
 443:             if (rcode == -1)
 444:                 goto assback;
 445:             if (rcode == pid)
 446:                 break;
 447:         }
 448:         if ((pidchild & 0377) != 0 || (pidchild >> 8) != 0)
 449:             goto assback;
 450:         return;
 451:     }
 452: 
 453:     if(!any('/',person)){
 454:     /* if name has no / in it, we assume it is a user's name */
 455: # ifdef HPASSWD
 456:         hisuid = uidfromsn(person);
 457: # else
 458:         pwd = getpwnam(person);
 459:         if(pwd != NULL){
 460:             hisuid = guid(pwd->pw_uid,pwd->pw_gid);
 461:             hisgid = pwd->pw_gid;
 462:             strcpy(logindir,pwd->pw_dir);
 463:         }
 464:         else hisuid = -1;
 465: # endif
 466:         if(hisuid == -1){
 467:     assback:
 468:             fflush(stdout);
 469:             fprintf(stderr,"Can't send to %s.\n", person);
 470:             errs++;
 471:             if (isatty(0) && saved==0) {
 472:                 saved++;
 473:                 if (accesss("dead.letter")) {
 474:                     printf("Letter saved in 'dead.letter'\n");
 475:                     insert(lettmp, "dead.letter",
 476:                         getuid(),getgid());
 477:                 } else
 478:                     printf("In wrong directory\n");
 479:             }
 480:             return;
 481:         }
 482: # ifdef OLDMAIL
 483:         sprintf(sfnmail,"%s/.mail",logindir);
 484: # else
 485:         sprintf(sfnmail,"%s/%s",MAILDIR,person);
 486: # endif
 487:         lock(sfnmail);
 488:         insert(lettmp, sfnmail, hisuid, hisgid);
 489:         unlock();
 490:         }
 491:     else {      /* it has / in it, "person" is a file */
 492:         if(accesss(person)){
 493:             lock(person);
 494:             insert(lettmp, person, -1, -1);
 495:             unlock();
 496:         }
 497:         else
 498:             fprintf(stderr,"Can't access %s\n",person);
 499:     }
 500: }
 501: 
 502: /* return 1 if success, 0 otherwise */
 503: insert(from, to, uid, gid)
 504: char *from, *to;
 505: {
 506: # ifdef V6
 507:     return(prepend(from,to,uid, gid));
 508: # else
 509:     return(append(from,to,uid, gid));
 510: # endif
 511: }
 512: 
 513: #ifdef BIFF
 514: #include <sys/socket.h>
 515: #include <netinet/in.h>
 516: #include <netdb.h>
 517: #endif
 518: 
 519: /* return 1 if success, 0 otherwise */
 520: append(from,to,uid, gid)
 521: char *from, *to;
 522: {
 523:     register FILE *fdin, *fdout;
 524:     int ret;
 525:     struct stat statbuf;
 526: #ifdef BIFF
 527:     char *cp, buf[100], *rindex();
 528:     int s;
 529:     struct hostent *hp;
 530:     struct sockaddr_in sin;
 531:     struct servent *sp;
 532: #endif
 533:     if (stat(to, &statbuf) >= 0 && (statbuf.st_mode&S_IFDIR) != 0) {
 534:         fprintf(stderr, "Exotic destination %s\n", to);
 535:         errs++;
 536:         return(0);
 537:     }
 538:     if ((fdout = fopen(to, "a")) == NULL) {
 539:         perror(to);
 540:         errs++;
 541:         return(0);
 542:     }
 543: # ifndef NOTROOT
 544:     if(uid != -1)mchown(to, uid, gid);
 545: # endif
 546:     if(uid != -1)chmod(to, MAILMODE);
 547:     if ((fdin = fopen(from, "r")) == NULL) {
 548:         perror(from);
 549:         return(0);
 550:     }
 551: #ifdef BIFF
 552:     { s = socket(AF_INET, SOCK_STREAM, 0, 0);
 553:       cp = rindex(to, '/');
 554:       if (cp)
 555:         sprintf(buf, "%s@%d\n", cp+1, ftell(fdout));
 556:     }
 557: #endif
 558:     ret = getput(fdin,fdout);
 559:     fclose(fdin);
 560:     fclose(fdout);
 561: #ifdef BIFF
 562:     if (cp && s >= 0) {
 563:         hp = gethostbyname("localhost");
 564:         sp = getservent("biff", "udp");
 565:         if (hp && sp) {
 566:             bcopy(hp->h_addr, &sin.sin_addr, hp->h_length);
 567:             sin.sin_family = hp->h_addrtype;
 568:             sin.sin_port = sp->s_port;
 569:             (void) sendto(s, buf, strlen(buf) + 1, 0,
 570:                 &sin, sizeof (sin));
 571:         }
 572:         close(s);
 573:     }
 574: #endif
 575:     return(ret);
 576: }
 577: 
 578: /* return 1 if success, 0 otherwise */
 579: prepend(from, to, uid, gid)
 580: char *from, *to;
 581: {
 582:     register int (*sig)();
 583:     struct stat statbuf;
 584:     FILE *fdout, *fdin;
 585:     int ret;
 586: 
 587:     if (stat(to, &statbuf) >= 0 && (statbuf.st_mode&S_IFDIR) != 0) {
 588:         fprintf(stderr, "Exotic destination %s\n", to);
 589:         goto badexit;
 590:     }
 591:     unlink(preptmp);
 592:     if ((fdout = fopen(preptmp, "w")) == NULL) {
 593:         perror("mail");
 594:         goto badexit;
 595:     }
 596:     chmod(preptmp, MAILMODE);
 597:     if ((fdin = fopen(from, "r")) == NULL) {
 598:         perror("mail");
 599:         goto badexit;
 600:     }
 601:     if(getput(fdin,fdout) == 0){
 602:         perror("file i/o");
 603:         goto badexit;
 604:     }
 605:     fclose(fdin);
 606:     fdin = fopen(to, "r");
 607:     /* ignore error since may not exist */
 608:     if(fdin != NULL && getput(fdin,fdout) == 0){
 609:         perror("file i/o");
 610:         goto badexit;
 611:     }
 612:     if(fdin != NULL)fclose(fdin);
 613:     fclose(fdout);
 614:     sig = signal(SIGINT, SIG_IGN);
 615:     remove(to);
 616:     if ((fdout = fopen(to, "w")) == NULL) {
 617:         perror(to);
 618:         unlink(preptmp);
 619:         signal(SIGINT, sig);
 620:         goto badexit;
 621:     }
 622: # ifdef NOTROOT
 623:     if(uid != -1)chmod(to,0666);
 624: # else
 625:     if(uid != -1)mchown(to, uid, gid);
 626: # endif
 627:     if(stat(to, &statbuf) < 0 || statbuf.st_nlink != 1) {
 628:         fclose(fdout);
 629:         signal(SIGINT, sig);
 630:         goto badexit;
 631:     }
 632:     if ((fdin = fopen(preptmp, "r"))  == NULL) {
 633:         perror("mail");
 634:         signal(SIGINT, sig);
 635:         goto badexit;
 636:     }
 637:     ret = getput(fdin,fdout);
 638:     fclose(fdout);
 639:     fclose(fdin);
 640:     signal(SIGINT, sig);
 641:     return(ret);
 642: badexit:
 643:     unlink(preptmp);
 644:     errs++;
 645:     return(0);
 646: }
 647: 
 648: delexit(ex)
 649: {
 650:     unlink(lettmp);
 651:     unlink(preptmp);
 652:     exit(ex);
 653: }
 654: 
 655: /* return 1 if ok, 0 otherwise */
 656: getput(fdin, fdout)
 657: register FILE *fdin, *fdout;
 658: {
 659:     extern int errno;
 660:     register int c;
 661: 
 662:     while((c = getc(fdin)) != EOF) {
 663:         errno = 0;
 664:         putc(c,fdout);
 665:         if(errno) {
 666:             perror("mail");
 667:             return(0);
 668:         }
 669:     }
 670:     return(1);
 671: }
 672: 
 673: accesss(s1)
 674: register char *s1;
 675: {
 676:     struct stat statbuf;
 677:         if(stat(s1,&statbuf)<0 || access(s1,2) == 0)
 678:         return(1);
 679:     return(0);
 680: }
 681: 
 682: any(c, str)
 683:     register char *str, c;
 684: {
 685:     register char *f;
 686: 
 687:     f = str;
 688:     while (*f)
 689:         if (c == *f++)
 690:             return(1);
 691:     return(0);
 692: }
 693: char    locktmp[30];                /* Usable lock temporary */
 694: char    curlock[50];                /* Last used name of lock */
 695: int locked;                 /* To note that we locked it */
 696: 
 697: /*
 698:  * Lock the specified mail file by setting the file mailfile.lock.
 699:  * We must, of course, be careful to unlink the lock file by a call
 700:  * to unlock before we stop.  The algorithm used here is to see if
 701:  * the lock exists, and if it does, to check its modify time.  If it
 702:  * is older than 30 seconds, we assume error and set our own file.
 703:  * Otherwise, we wait for 5 seconds and try again.
 704:  */
 705: 
 706: lock(file)
 707: char *file;
 708: {
 709:     register int f;
 710:     struct stat statbuf;
 711:     long curtime;
 712: /*
 713:    if using OLDMAIL, and NOTROOT, cann't lock since can't necessarily
 714:    write on user's login directory
 715: */
 716: # ifdef OLDMAIL
 717:     return;
 718: # endif
 719: 
 720:     if (file == NULL) {
 721:         printf("Locked = %d\n", locked);
 722:         return(0);
 723:     }
 724:     if (locked)
 725:         return(0);
 726:     sprintf(curlock,"%s%s",file,".lock");
 727:     sprintf(locktmp,"%s/tmXXXXXX",MAILDIR);
 728:     mktemp(locktmp);
 729:     unlink(locktmp);
 730:     for (;;) {
 731:         f = lock1(locktmp, curlock);
 732:         if (f == 0) {
 733:             locked = 1;
 734:             return(0);
 735:         }
 736:         if (stat(curlock, &statbuf) < 0)
 737:             return(0);
 738:         time(&curtime);
 739:         if (curtime < statbuf.st_mtime + 30) {
 740:             sleep(5);
 741:             continue;
 742:         }
 743:         unlink(curlock);
 744:     }
 745: }
 746: 
 747: /*
 748:  * Remove the mail lock, and note that we no longer
 749:  * have it locked.
 750:  */
 751: 
 752: unlock()
 753: {
 754: 
 755:     if (locked)
 756:         unlink(curlock);
 757:     locked = 0;
 758: }
 759: 
 760: /*
 761:  * Attempt to set the lock by creating the temporary file,
 762:  * then doing a link/unlink.  If it fails, return -1 else 0
 763:  */
 764: 
 765: lock1(tempfile, name)
 766:     char tempfile[], name[];
 767: {
 768:     int fno;
 769: 
 770:     fno = creat(tempfile, 0400);
 771:     if (fno < 0)
 772:         return(-1);
 773:     close(fno);
 774:     if (link(tempfile, name) < 0) {
 775:         unlink(tempfile);
 776:         return(-1);
 777:     }
 778:     unlink(tempfile);
 779:     return(0);
 780: }
 781: 
 782: /*
 783: 	stripfx(prefix string, pointer to string)
 784: 
 785: 	takes a ptr to string and compares it to prefix string.
 786: 	may be called multiple times
 787: 	returns ":username"
 788: */
 789: stripfx(pfx, name)
 790:     register char *pfx;
 791:     register char **name;
 792: {
 793:     register char *cp = *name;
 794: 
 795:     while (*pfx && (*cp == *pfx || *cp == toupper(*pfx)))
 796:         cp++, pfx++;
 797:     if (*cp != ':' || *pfx != 0)
 798:         return;
 799:     *name = cp;
 800: }
 801: stripmach(pperson)
 802: register char **pperson;
 803: {
 804: # ifdef RAND
 805: /* for machines at RAND */
 806: # ifdef GRAPHICS
 807:     stripfx("g",pperson);
 808:     stripfx("graphics",pperson);
 809: # endif
 810: # ifdef TP
 811:     stripfx("t",pperson);
 812:     stripfx("tp",pperson);
 813: # endif
 814: # ifdef VAX
 815:     stripfx("v",pperson);
 816:     stripfx("vax",pperson);
 817: # endif
 818: /* end of defns for Rand */
 819: # endif
 820: 
 821: # ifdef NOSC
 822: /* for machines at NOSC */
 823: # ifdef ATTS
 824:     stripfx("a",pperson);
 825:     stripfx("atts",pperson);
 826: # endif
 827: # ifdef CCMM
 828:     stripfx("c",pperson);
 829:     stripfx("ccmm",pperson);
 830: # endif
 831: # ifdef MSSF
 832:     stripfx("m",pperson);
 833:     stripfx("mssf",pperson);
 834: # endif
 835: /* end of defns for NOSC */
 836: # endif
 837: 
 838: # ifdef BERKELEY
 839: 
 840: /* for Berkeley */
 841: # ifdef A
 842:     stripfx("a",pperson);
 843: # endif
 844: # ifdef B
 845:     stripfx("b",pperson);
 846: # endif
 847: # ifdef C
 848:     stripfx("c",pperson);
 849: # endif
 850: # ifdef D
 851:     stripfx("d",pperson);
 852: # endif
 853: # ifdef E
 854:     stripfx("e",pperson);
 855: # endif
 856: # ifdef ING70
 857:     stripfx("i",pperson);
 858:     stripfx("ing70",pperson);
 859:     stripfx("ingres",pperson);
 860: # endif
 861: # ifdef INGVAX
 862:     stripfx("j",pperson);
 863:     stripfx("ingvax",pperson);
 864: # endif
 865: # ifdef VIRUS
 866:     stripfx("k",pperson);
 867:     stripfx("virus",pperson);
 868: # endif
 869: # ifdef IMAGE
 870:     stripfx("m",pperson);
 871:     stripfx("image",pperson);
 872: # endif
 873: # ifdef KIM
 874:     stripfx("n",pperson);
 875:     stripfx("kim",pperson);
 876: # endif
 877: # ifdef ESVAX
 878:     stripfx("o",pperson);
 879:     stripfx("esvax",pperson);
 880: # endif
 881: # ifdef Q
 882:     stripfx("q",pperson);
 883: # endif
 884: # ifdef ARPAVAX
 885:     stripfx("r",pperson);
 886:     stripfx("arpavax",pperson);
 887: # endif
 888: # ifdef SRC
 889:     stripfx("s",pperson);
 890:     stripfx("src",pperson);
 891: # endif
 892: # ifdef MATHSTAT
 893:     stripfx("t",pperson);
 894:     stripfx("mathstat",pperson);
 895: # endif
 896: # ifdef CSVAX
 897:     stripfx("v",pperson);
 898:     stripfx("vax",pperson);
 899:     stripfx("csvax",pperson);
 900: # endif
 901: # ifdef CORY
 902:     stripfx("y",pperson);
 903:     stripfx("cory",pperson);
 904: # endif
 905: # ifdef EECS40
 906:     stripfx("z",pperson);
 907:     stripfx("eecs40",pperson);
 908: # endif
 909: /* end of berkeley defns */
 910: # endif
 911: }
 912: /*
 913:    this removes the mail file sfn by either truncating it, as required
 914:    on OLDMAIL systems, or unlinking it. If the unlink fails, we truncate it.
 915: */
 916: remove(sfn)
 917: char *sfn;
 918: {
 919:     int i;
 920: # ifdef OLDMAIL
 921:     i = creat(sfn,0666);
 922:     if(i >= 0)close(i);
 923: # else
 924:     if(unlink(sfn) < 0){
 925:         i = creat(sfn,MAILMODE);
 926:         if(i >= 0)close(i);
 927:     }
 928: # endif
 929: }

Defined functions

accesss defined in line 673; used 3 times
any defined in line 682; used 3 times
append defined in line 520; used 1 times
bulkmail defined in line 305; used 1 times
delexit defined in line 648; used 9 times
fline defined in line 361; used 3 times
getdate defined in line 375; used 2 times
getput defined in line 656; used 6 times
insert defined in line 503; used 4 times
lock defined in line 706; used 2 times
lock1 defined in line 765; used 1 times
main defined in line 178; never used
prepend defined in line 579; used 1 times
printmail defined in line 249; used 1 times
remove defined in line 916; used 4 times
sendto defined in line 394; used 2 times
stripfx defined in line 789; used 44 times
stripmach defined in line 801; used 1 times
unlock defined in line 752; used 2 times

Defined variables

_sobuf defined in line 177; used 1 times
chew defined in line 170; used 3 times
curlock defined in line 694; used 5 times
deleteonly defined in line 174; used 2 times
dflag defined in line 171; used 2 times
errs defined in line 173; used 5 times
lettmp defined in line 168; used 9 times
locked defined in line 695; used 5 times
locktmp defined in line 693; used 4 times
preptmp defined in line 169; used 9 times
remname defined in line 175; used 3 times
sccsid defined in line 1; never used
shopcnt defined in line 172; used 2 times

Defined macros

BIFF defined in line 140; used 4 times
MAILDIR defined in line 165; used 3 times
MAILMODE defined in line 154; used 3 times
MSGSCMD defined in line 155; used 4 times
NOTROOT defined in line 80; used 2 times
Last modified: 1983-01-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 2950
Valid CSS Valid XHTML 1.0 Strict