1 static char sccsid[] = "@(#)v6mail.c 4.4 (Berkeley) 01/09/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 } 930