make escape escape force escape
[unix-history] / usr / src / usr.sbin / sendmail / src / conf.c
CommitLineData
b3cbe40f
EA
1# include <stdio.h>
2# include <pwd.h>
96faada8 3# include "sendmail.h"
916b3375 4
b3cbe40f 5/*
96faada8 6** CONF.C -- Sendmail Configuration Tables.
b3cbe40f
EA
7**
8** Defines the configuration of this installation.
9**
cb590f52 10** Compilation Flags:
cb590f52
EA
11** V6 -- running on a version 6 system. This determines
12** whether to define certain routines between
13** the two systems. If you are running a funny
14** system, e.g., V6 with long tty names, this
15** should be checked carefully.
b3cbe40f 16**
cb590f52 17** Configuration Variables:
1a12c7d6
EA
18** HdrInfo -- a table describing well-known header fields.
19** Each entry has the field name and some flags,
20** which can be:
355a2a04
EA
21** - H_EOH -- this field is equivalent to a blank
22** line; i.e., it signifies end of header.
23** - H_DELETE -- delete this field.
24** There is also a field pointing to a pointer
25** that should be set to point to this header.
9c6d4c70
EA
26**
27** Notes:
28** I have tried to put almost all the reasonable
29** configuration information into the configuration
30** file read at runtime. My intent is that anything
31** here is a function of the version of UNIX you
32** are running, or is really static -- for example
33** the headers are a superset of widely used
34** protocols. If you find yourself playing with
35** this file too much, you may be making a mistake!
b3cbe40f
EA
36*/
37
38
39
40
9c6d4c70 41static char SccsId[] = "@(#)conf.c 3.16 %G%";
cb590f52
EA
42
43
cb590f52 44# include <whoami.h> /* definitions of machine id's at berkeley */
b3cbe40f 45
1a12c7d6
EA
46
47/*
48** Header info table
355a2a04 49** Final (null) entry contains the flags used for any other field.
1a12c7d6
EA
50*/
51
52struct hdrinfo HdrInfo[] =
53{
2f0c5bd8
EA
54 "date", H_CHECK, M_NEEDDATE,
55 "from", H_CHECK, M_NEEDFROM,
a9e0e597 56 "full-name", H_ACHECK, M_FULLNAME,
355a2a04
EA
57 "to", 0, NULL,
58 "cc", 0, NULL,
59 "subject", 0, NULL,
2f0c5bd8 60 "message-id", H_CHECK, M_MSGID,
355a2a04
EA
61 "message", H_EOH, NULL,
62 NULL, 0, NULL,
1a12c7d6 63};
b3cbe40f
EA
64\f
65# ifdef V6
66/*
67** TTYPATH -- Get the path of the user's tty -- Version 6 version.
68**
69** Returns the pathname of the user's tty. Returns NULL if
70** the user is not logged in or if s/he has write permission
71** denied.
72**
73** Parameters:
74** none
75**
76** Returns:
77** pathname of the user's tty.
78** NULL if not logged in or write permission denied.
79**
80** Side Effects:
81** none.
82**
83** WARNING:
84** Return value is in a local buffer.
85**
b3cbe40f
EA
86** Called By:
87** savemail
b3cbe40f
EA
88*/
89
90# include <sys/types.h>
91# include <sys/stat.h>
92
93char *
94ttypath()
95{
96 struct stat stbuf;
97 register int i;
98 static char pathn[] = "/dev/ttyx";
b3cbe40f
EA
99
100 /* compute the pathname of the controlling tty */
101 if ((i = ttyn(2)) == 'x' && (i = ttyn(1)) == 'x' && (i = ttyn(0)) == 'x')
102 {
103 errno = 0;
104 return (NULL);
105 }
106 pathn[8] = i;
107
108 /* see if we have write permission */
a530c75f 109 if (stat(pathn, &stbuf) < 0 || !bitset(02, stbuf.st_mode))
b3cbe40f
EA
110 {
111 errno = 0;
112 return (NULL);
113 }
114
115 /* see if the user is logged in */
116 if (getlogin() == NULL)
117 return (NULL);
118
119 /* looks good */
120 return (pathn);
121}
122\f/*
123** FDOPEN -- Open a stdio file given an open file descriptor.
124**
125** This is included here because it is standard in v7, but we
126** need it in v6.
127**
128** Algorithm:
129** Open /dev/null to create a descriptor.
130** Close that descriptor.
131** Copy the existing fd into the descriptor.
132**
133** Parameters:
134** fd -- the open file descriptor.
135** type -- "r", "w", or whatever.
136**
137** Returns:
138** The file descriptor it creates.
139**
140** Side Effects:
141** none
142**
b3cbe40f
EA
143** Called By:
144** deliver
145**
146** Notes:
147** The mode of fd must match "type".
148*/
149
150FILE *
151fdopen(fd, type)
152 int fd;
153 char *type;
154{
155 register FILE *f;
156
157 f = fopen("/dev/null", type);
29871fef 158 (void) close(fileno(f));
b3cbe40f
EA
159 fileno(f) = fd;
160 return (f);
161}
162\f/*
163** INDEX -- Return pointer to character in string
164**
165** For V7 compatibility.
166**
167** Parameters:
168** s -- a string to scan.
169** c -- a character to look for.
170**
171** Returns:
172** If c is in s, returns the address of the first
173** instance of c in s.
174** NULL if c is not in s.
175**
176** Side Effects:
177** none.
b3cbe40f
EA
178*/
179
180index(s, c)
181 register char *s;
182 register char c;
183{
184 while (*s != '\0')
185 {
186 if (*s++ == c)
187 return (--s);
188 }
189 return (NULL);
190}
191# endif V6
192\f
193# ifndef V6
194/*
195** TTYPATH -- Get the path of the user's tty -- Version 7 version.
196**
197** Returns the pathname of the user's tty. Returns NULL if
198** the user is not logged in or if s/he has write permission
199** denied.
200**
201** Parameters:
202** none
203**
204** Returns:
205** pathname of the user's tty.
206** NULL if not logged in or write permission denied.
207**
208** Side Effects:
209** none.
210**
211** WARNING:
212** Return value is in a local buffer.
213**
b3cbe40f
EA
214** Called By:
215** savemail
b3cbe40f
EA
216*/
217
218# include <sys/types.h>
219# include <sys/stat.h>
220
221char *
222ttypath()
223{
224 struct stat stbuf;
225 register char *pathn;
b3cbe40f 226 extern char *ttyname();
29871fef 227 extern char *getlogin();
b3cbe40f
EA
228
229 /* compute the pathname of the controlling tty */
230 if ((pathn = ttyname(2)) == NULL && (pathn = ttyname(1)) == NULL && (pathn = ttyname(0)) == NULL)
231 {
232 errno = 0;
233 return (NULL);
234 }
235
236 /* see if we have write permission */
a530c75f 237 if (stat(pathn, &stbuf) < 0 || !bitset(02, stbuf.st_mode))
b3cbe40f
EA
238 {
239 errno = 0;
240 return (NULL);
241 }
242
243 /* see if the user is logged in */
244 if (getlogin() == NULL)
245 return (NULL);
246
247 /* looks good */
248 return (pathn);
249}
250# endif V6
a530c75f
EA
251\f/*
252** CHECKCOMPAT -- check for From and To person compatible.
253**
254** This routine can be supplied on a per-installation basis
255** to determine whether a person is allowed to send a message.
256** This allows restriction of certain types of internet
257** forwarding or registration of users.
258**
259** If the hosts are found to be incompatible, an error
260** message should be given using "usrerr" and FALSE should
261** be returned.
262**
263** Parameters:
264** to -- the person being sent to.
265**
266** Returns:
267** TRUE -- ok to send.
268** FALSE -- not ok.
269**
270** Side Effects:
271** none (unless you include the usrerr stuff)
272*/
273
274bool
275checkcompat(to)
276 register ADDRESS *to;
277{
29871fef
EA
278# ifdef lint
279 ADDRESS *x = to;
280
281 to = x;
282# endif lint
283
a530c75f
EA
284 return (TRUE);
285}