|
|
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: else
110: while (end-- > 0 && (c = getc(ifp))!=EOF)
111: putc(c, ofp);
112: fflush(ofp);
113: if (ferror(ofp))
114: return (1);
115: return (0);
116: }
117:
118: #if XMAIL
119:
120: char helpmessage[] = "\
121: \
122: mail -- computer mail\n\
123: xmail -- secret computer mail\n\
124: Usage: mail [ options ] [ user ... ]\n\
125: or: xmail [ options ] user [ ... ]\n\
126: Options:\n\
127: -f file Print mail from 'file' instead of the default\n\
128: -p Print mail non-interactively\n\
129: -q Exit on interrupt, leaving mail unchanged\n\
130: -r Print mail in reverse order, latest first\n\
131: -v Verbose commentary on alias expansion\n\
132: If 'user' is present, send each a mail message read from standard input.\n\
133: If 'xmail' is the command, use xencode to encrypt the mail messages.\n\
134: Mail message ends with EOF of a line containing only '.'. Otherwise, read\n\
135: and print the invoking user's mailbox.\n\
136: \
137: ";
138:
139: #else
140:
141: char helpmessage[] = "\
142: \
143: mail -- computer mail\n\
144: Usage: mail [ options ] [ user ... ]\n\
145: Options:\n\
146: -f file Print mail from 'file' instead of the default\n\
147: -p Print mail non-interactively\n\
148: -q Exit on interrupt, leaving mail unchanged\n\
149: -r Print mail in reverse order, latest first\n\
150: -v Verbose commentary on alias expansion\n\
151: If 'user' is present, send each a mail message read from standard input.\n\
152: Mail message ends with EOF of a line containing only '.'. Otherwise, read\n\
153: and print the invoking user's mailbox.\n\
154: \
155: ";
156: #endif
157:
158: usage()
159: {
160: mmsg(helpmessage);
161: rmexit(1);
162: }
163:
164: #define LOGFILE "/usr/spool/uucp/.Log/mail/lmail"
165:
166: static char *logfile = LOGFILE;
167: static FILE *logfp = NULL;
168:
169: logopen()
170: {
171: time_t t;
172:
173: /* Try to open the log file. If this fails, no big deal; we
174: just won't log anything. */
175: time(&t);
176: if ( (logfp=fopen(logfile, "a")) == NULL ) {
177: #if 0
178: fprintf(stderr, "Can't open Log File: \"%s\"", logfile);
179: #endif
180: } /* If open of logfile failed. */
181: logdump("------------------\n");
182: logdump(ctime(&t));
183: }
184:
185: logclose()
186: {
187: if ( logfp != NULL )
188: fclose(logfp);
189: }
190:
191: logdump(x)
192: {
193: if ( logfp != NULL )
194: fprintf(logfp, "%r", &x);
195: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.