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: }