|
|
1.1 root 1: #
2:
3: /*
4: * Mail -- a mail program
5: *
6: * Ingres 11/70. Unix version 6.0
7: *
8: * Local routines that are installation dependent.
9: * All fiddlers please note: if you make careful note of
10: * what you change here, I will incorporate your changes and
11: * you won't have to remake them each release.
12: */
13:
14: #include "rcv.h"
15: #include <errno.h>
16:
17: /*
18: * Locate the user's mailbox file (ie, the place where new, unread
19: * mail is queued). At Ingres, it's in /usr/spool/mail/loginname.
20: */
21:
22: findmail()
23: {
24: register char *cp;
25:
26: cp = copy("/usr/spool/mail/", mailname);
27: copy(myname, cp);
28: }
29:
30: /*
31: * Get rid of the queued mail.
32: */
33:
34: demail()
35: {
36: if (unlink(mailname) >= 0)
37: return;
38: close(creat(mailname, 0666));
39: alter(mailname);
40: }
41:
42: /*
43: * Get an environment variable. At present, we only support
44: * "SHELL" and "HOME". This routine makes use of the getpw
45: * routine in the neighboring getname.c stuff.
46: */
47:
48: char *
49: getenv(name)
50: char name[];
51: {
52: char pwline[LINESIZE];
53: static char val[30];
54: register char *cp, *dp;
55: register int cc;
56:
57: if (equal(name, "SHELL"))
58: cc = 6;
59: else if (equal(name, "HOME"))
60: cc = 5;
61: else
62: return(NOSTR);
63: if (getpwnam(myname, pwline) < 0)
64: return(NOSTR);
65: for (cp = pwline; *cp && cc > 0;)
66: if (*cp++ == ':')
67: cc--;
68: dp = cp;
69: while (*cp != ':' && *cp != '\0' && *cp != '\n')
70: cp++;
71: *cp = '\0';
72: if (*dp == '\0')
73: return(NOSTR);
74: copy(dp, val);
75: return(val);
76: }
77:
78: /*
79: * Discover user name. On Ingres, user names are rarely 1-1 with uids,
80: * so we look for this guy in the utmp file first, then try finding
81: * him in the passwd file on basis of uid if that fails.
82: */
83:
84: struct utmp {
85: char u_name[8]; /* User login name. */
86: char u_tty; /* typewriter character */
87: char u_cfill; /* Unused for now. */
88: long u_time; /* Login time */
89: short u_wfill; /* Unused also */
90: };
91:
92: username(uid, namebuf)
93: char namebuf[];
94: {
95: struct utmp ubuf;
96: register char *cp;
97: register int tty;
98: register FILE *fwho;
99:
100: tty = ttyn(0);
101: if (tty == 'x')
102: goto useuid;
103:
104: /*
105: * Dammit, I really do have to search the utmp file!
106: */
107:
108: if ((fwho = fopen("/etc/utmp", "r")) == NULL)
109: goto useuid;
110: while (fread(&ubuf, 1, sizeof ubuf, fwho) > 0)
111: if (ubuf.u_tty == tty) {
112: strncpy(namebuf, ubuf.u_name, 8);
113: namebuf[8] = 0;
114: cp = index(namebuf, ' ');
115: if (cp != NOSTR)
116: *cp = 0;
117: return(0);
118: }
119: fclose(fwho);
120:
121: useuid:
122: return(getname(uid, namebuf));
123: }
124:
125: /*
126: * Unix routine to do an "fopen" on file descriptor
127: * The mode has to be repeated because you can't query its
128: * status
129: */
130:
131: FILE *
132: fdopen(fd, mode)
133: register char *mode;
134: {
135: extern int errno;
136: register FILE *iop;
137: extern FILE *_lastbuf;
138:
139: for (iop = _iob; iop->_flag&(_IOREAD|_IOWRT); iop++)
140: if (iop >= _lastbuf)
141: return(NULL);
142: iop->_cnt = 0;
143: iop->_file = fd;
144: if (*mode != 'r') {
145: iop->_flag |= _IOWRT;
146: if (*mode == 'a')
147: lseek(fd, 0L, 2);
148: } else
149: iop->_flag |= _IOREAD;
150: return(iop);
151: }
152:
153: /*
154: * Copy s2 to s1, truncating or null-padding to always copy n bytes
155: * return s1
156: */
157:
158: char *
159: strncpy(s1, s2, n)
160: register char *s1, *s2;
161: {
162: register i;
163: register char *os1;
164:
165: os1 = s1;
166: for (i = 0; i < n; i++)
167: if ((*s1++ = *s2++) == '\0') {
168: while (++i < n)
169: *s1++ = '\0';
170: return(os1);
171: }
172: return(os1);
173: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.