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