1 # include <pwd.h> 2 # include "sendmail.h" 3 4 /* 5 ** CONF.C -- Sendmail Configuration Tables. 6 ** 7 ** Defines the configuration of this installation. 8 ** 9 ** Compilation Flags: 10 ** V6 -- running on a version 6 system. This determines 11 ** whether to define certain routines between 12 ** the two systems. If you are running a funny 13 ** system, e.g., V6 with long tty names, this 14 ** should be checked carefully. 15 ** 16 ** Configuration Variables: 17 ** HdrInfo -- a table describing well-known header fields. 18 ** Each entry has the field name and some flags, 19 ** which are described in sendmail.h. 20 ** StdTimezone -- name of local timezone in standard time 21 ** (V6 only). 22 ** DstTimezone -- name of local timezone in daylight savings 23 ** time (V6 only). 24 ** 25 ** Notes: 26 ** I have tried to put almost all the reasonable 27 ** configuration information into the configuration 28 ** file read at runtime. My intent is that anything 29 ** here is a function of the version of UNIX you 30 ** are running, or is really static -- for example 31 ** the headers are a superset of widely used 32 ** protocols. If you find yourself playing with 33 ** this file too much, you may be making a mistake! 34 */ 35 36 37 38 39 static char SccsId[] = "@(#)conf.c 3.31 09/20/81"; 40 41 42 # include <whoami.h> /* definitions of machine id's at berkeley */ 43 44 45 /* 46 ** Header info table 47 ** Final (null) entry contains the flags used for any other field. 48 ** 49 ** Not all of these are actually handled specially by sendmail 50 ** at this time. They are included as placeholders, to let 51 ** you know that "someday" I intend to have sendmail do 52 ** something with them. 53 */ 54 55 struct hdrinfo HdrInfo[] = 56 { 57 "date", H_CHECK, M_NEEDDATE, 58 "from", H_CHECK, M_NEEDFROM, 59 "original-from", 0, 0, 60 "sender", 0, 0, 61 "full-name", H_ACHECK, M_FULLNAME, 62 "to", H_ADDR, 0, 63 "cc", H_ADDR, 0, 64 "bcc", H_ADDR|H_ACHECK, 0, 65 "message-id", H_CHECK, M_MSGID, 66 "message", H_EOH, 0, 67 "text", H_EOH, 0, 68 "posted-date", 0, 0, 69 "return-receipt-to", 0, 0, 70 "received-date", H_CHECK, M_LOCAL, 71 "received-from", H_CHECK, M_LOCAL, 72 "precedence", 0, 0, 73 "via", H_FORCE, 0, 74 NULL, 0, 0, 75 }; 76 77 78 /* 79 ** ARPANET error message numbers. 80 */ 81 82 # ifdef NEWFTP 83 /* these are almost all unchecked */ 84 char Arpa_Info[] = "010"; /* arbitrary info: this is WRONG! */ 85 char Arpa_Enter[] = "354"; /* start mail input */ 86 char Arpa_Mmsg[] = "250"; /* mail successful (MAIL cmd) */ 87 char Arpa_Fmsg[] = "250"; /* mail successful (MLFL cmd) */ 88 char Arpa_Syserr[] = "450"; /* some (transient) system error */ 89 char Arpa_Usrerr[] = "550"; /* some (fatal) user error */ 90 # else NEWFTP 91 char Arpa_Info[] = "050"; /* arbitrary info */ 92 char Arpa_Enter[] = "350"; /* start mail input */ 93 char Arpa_Mmsg[] = "256"; /* mail successful (MAIL cmd) */ 94 char Arpa_Fmsg[] = "250"; /* mail successful (MLFL cmd) */ 95 char Arpa_Syserr[] = "455"; /* some (transient) system error */ 96 char Arpa_Usrerr[] = "450"; /* some (fatal) user error */ 97 # endif NEWFTP 98 99 100 101 102 103 /* 104 ** Location of system files/databases/etc. 105 */ 106 107 char *AliasFile = "/usr/lib/aliases"; /* alias file */ 108 char *ConfFile = "/usr/lib/sendmail.cf"; /* runtime configuration */ 109 char *StatFile = "/usr/eric/mailstats"; /* statistics summary */ 110 111 112 /* 113 ** Other configuration. 114 */ 115 116 int DefUid = 1; /* the uid to execute mailers as */ 117 int DefGid = 1; /* ditto for gid */ 118 119 120 121 /* 122 ** V6 system configuration. 123 */ 124 125 # ifdef V6 126 char *StdTimezone = "PST"; /* std time timezone */ 127 char *DstTimezone = "PDT"; /* daylight time timezone */ 128 # endif V6 129 130 # ifdef V6 131 /* 132 ** TTYNAME -- return name of terminal. 133 ** 134 ** Parameters: 135 ** fd -- file descriptor to check. 136 ** 137 ** Returns: 138 ** pointer to full path of tty. 139 ** NULL if no tty. 140 ** 141 ** Side Effects: 142 ** none. 143 */ 144 145 char * 146 ttyname(fd) 147 int fd; 148 { 149 register char tn; 150 static char pathn[] = "/dev/ttyx"; 151 152 /* compute the pathname of the controlling tty */ 153 if ((tn = ttyn(fd)) == NULL) 154 { 155 errno = 0; 156 return (NULL); 157 } 158 pathn[8] = tn; 159 return (pathn); 160 } 161 /* 162 ** FDOPEN -- Open a stdio file given an open file descriptor. 163 ** 164 ** This is included here because it is standard in v7, but we 165 ** need it in v6. 166 ** 167 ** Algorithm: 168 ** Open /dev/null to create a descriptor. 169 ** Close that descriptor. 170 ** Copy the existing fd into the descriptor. 171 ** 172 ** Parameters: 173 ** fd -- the open file descriptor. 174 ** type -- "r", "w", or whatever. 175 ** 176 ** Returns: 177 ** The file descriptor it creates. 178 ** 179 ** Side Effects: 180 ** none 181 ** 182 ** Called By: 183 ** deliver 184 ** 185 ** Notes: 186 ** The mode of fd must match "type". 187 */ 188 189 FILE * 190 fdopen(fd, type) 191 int fd; 192 char *type; 193 { 194 register FILE *f; 195 196 f = fopen("/dev/null", type); 197 (void) close(fileno(f)); 198 fileno(f) = fd; 199 return (f); 200 } 201 /* 202 ** INDEX -- Return pointer to character in string 203 ** 204 ** For V7 compatibility. 205 ** 206 ** Parameters: 207 ** s -- a string to scan. 208 ** c -- a character to look for. 209 ** 210 ** Returns: 211 ** If c is in s, returns the address of the first 212 ** instance of c in s. 213 ** NULL if c is not in s. 214 ** 215 ** Side Effects: 216 ** none. 217 */ 218 219 index(s, c) 220 register char *s; 221 register char c; 222 { 223 while (*s != '\0') 224 { 225 if (*s++ == c) 226 return (--s); 227 } 228 return (NULL); 229 } 230 /* 231 ** UMASK -- fake the umask system call. 232 ** 233 ** Since V6 always acts like the umask is zero, we will just 234 ** assume the same thing. 235 */ 236 237 /*ARGSUSED*/ 238 umask(nmask) 239 { 240 return (0); 241 } 242 243 244 /* 245 ** GETRUID -- get real user id. 246 */ 247 248 getruid() 249 { 250 return (getuid() & 0377); 251 } 252 253 254 /* 255 ** GETRGID -- get real group id. 256 */ 257 258 getrgid() 259 { 260 return (getgid() & 0377); 261 } 262 263 264 /* 265 ** GETEUID -- get effective user id. 266 */ 267 268 geteuid() 269 { 270 return ((getuid() >> 8) & 0377); 271 } 272 273 274 /* 275 ** GETEGID -- get effective group id. 276 */ 277 278 getegid() 279 { 280 return ((getgid() >> 8) & 0377); 281 } 282 283 # endif V6 284 285 # ifndef V6 286 287 /* 288 ** GETRUID -- get real user id (V7) 289 */ 290 291 getruid() 292 { 293 return (getuid()); 294 } 295 296 297 /* 298 ** GETRGID -- get real group id (V7). 299 */ 300 301 getrgid() 302 { 303 return (getgid()); 304 } 305 306 # endif V6 307 /* 308 ** TTYPATH -- Get the path of the user's tty 309 ** 310 ** Returns the pathname of the user's tty. Returns NULL if 311 ** the user is not logged in or if s/he has write permission 312 ** denied. 313 ** 314 ** Parameters: 315 ** none 316 ** 317 ** Returns: 318 ** pathname of the user's tty. 319 ** NULL if not logged in or write permission denied. 320 ** 321 ** Side Effects: 322 ** none. 323 ** 324 ** WARNING: 325 ** Return value is in a local buffer. 326 ** 327 ** Called By: 328 ** savemail 329 */ 330 331 # include <sys/stat.h> 332 333 char * 334 ttypath() 335 { 336 struct stat stbuf; 337 register char *pathn; 338 extern char *ttyname(); 339 extern char *getlogin(); 340 341 /* compute the pathname of the controlling tty */ 342 if ((pathn = ttyname(2)) == NULL && (pathn = ttyname(1)) == NULL && (pathn = ttyname(0)) == NULL) 343 { 344 errno = 0; 345 return (NULL); 346 } 347 348 /* see if we have write permission */ 349 if (stat(pathn, &stbuf) < 0 || !bitset(02, stbuf.st_mode)) 350 { 351 errno = 0; 352 return (NULL); 353 } 354 355 /* see if the user is logged in */ 356 if (getlogin() == NULL) 357 return (NULL); 358 359 /* looks good */ 360 return (pathn); 361 } 362 /* 363 ** CHECKCOMPAT -- check for From and To person compatible. 364 ** 365 ** This routine can be supplied on a per-installation basis 366 ** to determine whether a person is allowed to send a message. 367 ** This allows restriction of certain types of internet 368 ** forwarding or registration of users. 369 ** 370 ** If the hosts are found to be incompatible, an error 371 ** message should be given using "usrerr" and FALSE should 372 ** be returned. 373 ** 374 ** 'NoReturn' can be set to suppress the return-to-sender 375 ** function; this should be done on huge messages. 376 ** 377 ** Parameters: 378 ** to -- the person being sent to. 379 ** 380 ** Returns: 381 ** TRUE -- ok to send. 382 ** FALSE -- not ok. 383 ** 384 ** Side Effects: 385 ** none (unless you include the usrerr stuff) 386 */ 387 388 bool 389 checkcompat(to) 390 register ADDRESS *to; 391 { 392 if (to->q_mailer != MN_LOCAL && MsgSize > 100000) 393 { 394 usrerr("Message exceeds 100000 bytes"); 395 NoReturn++; 396 return (FALSE); 397 } 398 return (TRUE); 399 } 400