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