|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <sys/stat.h> ! 3: #include <access.h> ! 4: #include "mail.h" ! 5: #include <time.h> ! 6: #include <sys/types.h> ! 7: ! 8: char *parent(); ! 9: char keyname[64]; /* Destination public key file name */ ! 10: ! 11: /* ! 12: * Miscellaneous Routines ! 13: */ ! 14: ! 15: char * ! 16: dupstr(str) ! 17: { ! 18: return( strcpy(myalloc(strlen(str)+1), str) ); ! 19: } ! 20: ! 21: char * ! 22: myalloc(size) ! 23: unsigned int size; ! 24: { ! 25: register char *cp; ! 26: extern char *malloc(); ! 27: ! 28: if ( (cp=malloc(size)) == NULL ) ! 29: merr("Out of memory"); ! 30: return(cp); ! 31: } ! 32: ! 33: fatal(x) ! 34: { ! 35: fprintf(stderr, "Fatal Error: %r\n", &x); ! 36: fflush(stderr); ! 37: rmexit(1); ! 38: } ! 39: ! 40: /* ! 41: * Check access on a file. ! 42: */ ! 43: maccess(name) ! 44: char *name; ! 45: { ! 46: struct stat sb; ! 47: ! 48: if (stat(name, &sb) < 0) { ! 49: if (access(parent(name), ACREAT) < 0) ! 50: return (-1); ! 51: } else if (access(name, AWRITE) < 0) ! 52: return (-1); ! 53: return (0); ! 54: } ! 55: ! 56: /* ! 57: * Check enrollment for xmail. ! 58: */ ! 59: xaccess(name) char *name; ! 60: { ! 61: struct stat sb; ! 62: sprintf(keyname, "%s%s", PUBKEYDIR, name); ! 63: return stat(keyname, &sb) >= 0; ! 64: } ! 65: /* ! 66: * Find the parent directory for access permissions. ! 67: */ ! 68: char * ! 69: parent(name) ! 70: char *name; ! 71: { ! 72: register char *cp, *xp; ! 73: static char p[256]; ! 74: ! 75: xp = rindex(name, '/'); ! 76: if (xp == NULL) ! 77: return ("."); ! 78: if (xp == name) ! 79: return ("/"); ! 80: if (xp - name >= 256) ! 81: return (""); ! 82: cp = p; ! 83: while (name < xp) ! 84: *cp++ = *name++; ! 85: *cp = 0; ! 86: return (p); ! 87: } ! 88: ! 89: /* ! 90: * Copy from the file stream `ifp' (starting at ! 91: * position `start' and ending at `end' or EOF) ! 92: * to the file stream `ofp' which is assumed ! 93: * to be already correctly positioned. ! 94: * Returns non-zero on errors. ! 95: * intstop == 1 means stop on interrupt ! 96: * intstop == 0 means ignore interrupt ! 97: */ ! 98: mcopy(ifp, ofp, start, end, intstop) ! 99: register FILE *ifp, *ofp; ! 100: fsize_t start, end; ! 101: { ! 102: register int c; ! 103: ! 104: fseek(ifp, start, 0); ! 105: end -= start; ! 106: if (intstop) ! 107: while (!intcheck() && end-- > 0 && (c = getc(ifp))!=EOF){ ! 108: putc(c, ofp); ! 109: fflush(ofp); ! 110: } ! 111: else ! 112: while (end-- > 0 && (c = getc(ifp))!=EOF){ ! 113: putc(c, ofp); ! 114: fflush(ofp); ! 115: } ! 116: ! 117: if (ferror(ofp)) ! 118: return (1); ! 119: return (0); ! 120: } ! 121: ! 122: #if XMAIL ! 123: ! 124: char helpmessage[] = "\ ! 125: \ ! 126: mail -- computer mail\n\ ! 127: xmail -- secret computer mail\n\ ! 128: Usage: mail [ options ] [ user ... ]\n\ ! 129: or: xmail [ options ] user [ ... ]\n\ ! 130: Options:\n\ ! 131: -f file Print mail from 'file' instead of the default\n\ ! 132: -p Print mail non-interactively\n\ ! 133: -q Exit on interrupt, leaving mail unchanged\n\ ! 134: -r Print mail in reverse order, latest first\n\ ! 135: -v Verbose commentary on alias expansion\n\ ! 136: If 'user' is present, send each a mail message read from standard input.\n\ ! 137: If 'xmail' is the command, use xencode to encrypt the mail messages.\n\ ! 138: Mail message ends with EOF of a line containing only '.'. Otherwise, read\n\ ! 139: and print the invoking user's mailbox.\n\ ! 140: \ ! 141: "; ! 142: ! 143: #else ! 144: ! 145: char helpmessage[] = "\ ! 146: \ ! 147: mail -- computer mail\n\ ! 148: Usage: mail [ options ] [ user ... ]\n\ ! 149: Options:\n\ ! 150: -f file Print mail from 'file' instead of the default\n\ ! 151: -p Print mail non-interactively\n\ ! 152: -q Exit on interrupt, leaving mail unchanged\n\ ! 153: -r Print mail in reverse order, latest first\n\ ! 154: -v Verbose commentary on alias expansion\n\ ! 155: If 'user' is present, send each a mail message read from standard input.\n\ ! 156: Mail message ends with EOF of a line containing only '.'. Otherwise, read\n\ ! 157: and print the invoking user's mailbox.\n\ ! 158: \ ! 159: "; ! 160: #endif ! 161: ! 162: usage() ! 163: { ! 164: mmsg(helpmessage); ! 165: rmexit(1); ! 166: } ! 167: ! 168: #define LOGFILE "/usr/spool/uucp/.Log/mail/lmail" ! 169: ! 170: static char *logfile = LOGFILE; ! 171: static FILE *logfp = NULL; ! 172: ! 173: logopen() ! 174: { ! 175: time_t t; ! 176: ! 177: /* Try to open the log file. If this fails, no big deal; we ! 178: just won't log anything. */ ! 179: time(&t); ! 180: if ( (logfp=fopen(logfile, "a")) == NULL ) { ! 181: #if 0 ! 182: fprintf(stderr, "Can't open Log File: \"%s\"", logfile); ! 183: #endif ! 184: } /* If open of logfile failed. */ ! 185: logdump("------------------\n"); ! 186: logdump(ctime(&t)); ! 187: } ! 188: ! 189: logclose() ! 190: { ! 191: if ( logfp != NULL ) ! 192: fclose(logfp); ! 193: } ! 194: ! 195: logdump(x) ! 196: { ! 197: if ( logfp != NULL ){ ! 198: fprintf(logfp, "%r", &x); ! 199: fflush(logfp); ! 200: } ! 201: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.