|
|
1.1 ! root 1: # include <pwd.h> ! 2: # include <sys/ioctl.h> ! 3: # include "sendmail.h" ! 4: ! 5: /* ! 6: ** CONF.C -- Sendmail Configuration Tables. ! 7: ** ! 8: ** Defines the configuration of this installation. ! 9: ** ! 10: ** Compilation Flags: ! 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. ! 16: ** VMUNIX -- running on a Berkeley UNIX system. ! 17: ** ! 18: ** Configuration Variables: ! 19: ** HdrInfo -- a table describing well-known header fields. ! 20: ** Each entry has the field name and some flags, ! 21: ** which are described in sendmail.h. ! 22: ** ! 23: ** Notes: ! 24: ** I have tried to put almost all the reasonable ! 25: ** configuration information into the configuration ! 26: ** file read at runtime. My intent is that anything ! 27: ** here is a function of the version of UNIX you ! 28: ** are running, or is really static -- for example ! 29: ** the headers are a superset of widely used ! 30: ** protocols. If you find yourself playing with ! 31: ** this file too much, you may be making a mistake! ! 32: */ ! 33: ! 34: ! 35: ! 36: ! 37: SCCSID(@(#)conf.c 4.4 8/28/83); ! 38: ! 39: ! 40: ! 41: /* ! 42: ** Header info table ! 43: ** Final (null) entry contains the flags used for any other field. ! 44: ** ! 45: ** Not all of these are actually handled specially by sendmail ! 46: ** at this time. They are included as placeholders, to let ! 47: ** you know that "someday" I intend to have sendmail do ! 48: ** something with them. ! 49: */ ! 50: ! 51: struct hdrinfo HdrInfo[] = ! 52: { ! 53: /* originator fields, most to least significant */ ! 54: "resent-sender", H_FROM|H_RESENT, ! 55: "resent-from", H_FROM|H_RESENT, ! 56: "sender", H_FROM, ! 57: "from", H_FROM, ! 58: "full-name", H_ACHECK, ! 59: "return-receipt-to", H_FROM, ! 60: "errors-to", H_FROM, ! 61: /* destination fields */ ! 62: "to", H_RCPT, ! 63: "resent-to", H_RCPT|H_RESENT, ! 64: "cc", H_RCPT, ! 65: "resent-cc", H_RCPT|H_RESENT, ! 66: "bcc", H_RCPT|H_ACHECK, ! 67: "resent-bcc", H_RCPT|H_ACHECK|H_RESENT, ! 68: /* message identification and control */ ! 69: "message-id", 0, ! 70: "resent-message-id", H_RESENT, ! 71: "message", H_EOH, ! 72: "text", H_EOH, ! 73: /* date fields */ ! 74: "date", 0, ! 75: "resent-date", H_RESENT, ! 76: /* trace fields */ ! 77: "received", H_TRACE|H_FORCE, ! 78: "via", H_TRACE|H_FORCE, ! 79: "mail-from", H_TRACE|H_FORCE, ! 80: ! 81: NULL, 0, ! 82: }; ! 83: ! 84: ! 85: /* ! 86: ** ARPANET error message numbers. ! 87: */ ! 88: ! 89: char Arpa_Info[] = "050"; /* arbitrary info */ ! 90: char Arpa_TSyserr[] = "451"; /* some (transient) system error */ ! 91: char Arpa_PSyserr[] = "554"; /* some (permanent) system error */ ! 92: char Arpa_Usrerr[] = "554"; /* some (fatal) user error */ ! 93: ! 94: ! 95: ! 96: /* ! 97: ** Location of system files/databases/etc. ! 98: */ ! 99: ! 100: char *ConfFile = "/usr/lib/sendmail.cf"; /* runtime configuration */ ! 101: char *FreezeFile = "/usr/lib/sendmail.fc"; /* frozen version of above */ ! 102: ! 103: ! 104: ! 105: /* ! 106: ** Some other configuration.... ! 107: */ ! 108: ! 109: char SpaceSub = '.'; /* character to replace <lwsp> in addrs */ ! 110: int QueueLA = 8; /* load avg > QueueLA -> just queue */ ! 111: int RefuseLA = 12; /* load avg > RefuseLA -> refuse connections */ ! 112: ! 113: # ifdef V6 ! 114: /* ! 115: ** TTYNAME -- return name of terminal. ! 116: ** ! 117: ** Parameters: ! 118: ** fd -- file descriptor to check. ! 119: ** ! 120: ** Returns: ! 121: ** pointer to full path of tty. ! 122: ** NULL if no tty. ! 123: ** ! 124: ** Side Effects: ! 125: ** none. ! 126: */ ! 127: ! 128: char * ! 129: ttyname(fd) ! 130: int fd; ! 131: { ! 132: register char tn; ! 133: static char pathn[] = "/dev/ttyx"; ! 134: ! 135: /* compute the pathname of the controlling tty */ ! 136: if ((tn = ttyn(fd)) == NULL) ! 137: { ! 138: errno = 0; ! 139: return (NULL); ! 140: } ! 141: pathn[8] = tn; ! 142: return (pathn); ! 143: } ! 144: /* ! 145: ** FDOPEN -- Open a stdio file given an open file descriptor. ! 146: ** ! 147: ** This is included here because it is standard in v7, but we ! 148: ** need it in v6. ! 149: ** ! 150: ** Algorithm: ! 151: ** Open /dev/null to create a descriptor. ! 152: ** Close that descriptor. ! 153: ** Copy the existing fd into the descriptor. ! 154: ** ! 155: ** Parameters: ! 156: ** fd -- the open file descriptor. ! 157: ** type -- "r", "w", or whatever. ! 158: ** ! 159: ** Returns: ! 160: ** The file descriptor it creates. ! 161: ** ! 162: ** Side Effects: ! 163: ** none ! 164: ** ! 165: ** Called By: ! 166: ** deliver ! 167: ** ! 168: ** Notes: ! 169: ** The mode of fd must match "type". ! 170: */ ! 171: ! 172: FILE * ! 173: fdopen(fd, type) ! 174: int fd; ! 175: char *type; ! 176: { ! 177: register FILE *f; ! 178: ! 179: f = fopen("/dev/null", type); ! 180: (void) close(fileno(f)); ! 181: fileno(f) = fd; ! 182: return (f); ! 183: } ! 184: /* ! 185: ** INDEX -- Return pointer to character in string ! 186: ** ! 187: ** For V7 compatibility. ! 188: ** ! 189: ** Parameters: ! 190: ** s -- a string to scan. ! 191: ** c -- a character to look for. ! 192: ** ! 193: ** Returns: ! 194: ** If c is in s, returns the address of the first ! 195: ** instance of c in s. ! 196: ** NULL if c is not in s. ! 197: ** ! 198: ** Side Effects: ! 199: ** none. ! 200: */ ! 201: ! 202: char * ! 203: index(s, c) ! 204: register char *s; ! 205: register char c; ! 206: { ! 207: while (*s != '\0') ! 208: { ! 209: if (*s++ == c) ! 210: return (--s); ! 211: } ! 212: return (NULL); ! 213: } ! 214: /* ! 215: ** UMASK -- fake the umask system call. ! 216: ** ! 217: ** Since V6 always acts like the umask is zero, we will just ! 218: ** assume the same thing. ! 219: */ ! 220: ! 221: /*ARGSUSED*/ ! 222: umask(nmask) ! 223: { ! 224: return (0); ! 225: } ! 226: ! 227: ! 228: /* ! 229: ** GETRUID -- get real user id. ! 230: */ ! 231: ! 232: getruid() ! 233: { ! 234: return (getuid() & 0377); ! 235: } ! 236: ! 237: ! 238: /* ! 239: ** GETRGID -- get real group id. ! 240: */ ! 241: ! 242: getrgid() ! 243: { ! 244: return (getgid() & 0377); ! 245: } ! 246: ! 247: ! 248: /* ! 249: ** GETEUID -- get effective user id. ! 250: */ ! 251: ! 252: geteuid() ! 253: { ! 254: return ((getuid() >> 8) & 0377); ! 255: } ! 256: ! 257: ! 258: /* ! 259: ** GETEGID -- get effective group id. ! 260: */ ! 261: ! 262: getegid() ! 263: { ! 264: return ((getgid() >> 8) & 0377); ! 265: } ! 266: ! 267: # endif V6 ! 268: ! 269: # ifndef V6 ! 270: ! 271: /* ! 272: ** GETRUID -- get real user id (V7) ! 273: */ ! 274: ! 275: getruid() ! 276: { ! 277: if (OpMode == MD_DAEMON) ! 278: return (RealUid); ! 279: else ! 280: return (getuid()); ! 281: } ! 282: ! 283: ! 284: /* ! 285: ** GETRGID -- get real group id (V7). ! 286: */ ! 287: ! 288: getrgid() ! 289: { ! 290: if (OpMode == MD_DAEMON) ! 291: return (RealGid); ! 292: else ! 293: return (getgid()); ! 294: } ! 295: ! 296: # endif V6 ! 297: /* ! 298: ** USERNAME -- return the user id of the logged in user. ! 299: ** ! 300: ** Parameters: ! 301: ** none. ! 302: ** ! 303: ** Returns: ! 304: ** The login name of the logged in user. ! 305: ** ! 306: ** Side Effects: ! 307: ** none. ! 308: ** ! 309: ** Notes: ! 310: ** The return value is statically allocated. ! 311: */ ! 312: ! 313: char * ! 314: username() ! 315: { ! 316: extern char *getlogin(); ! 317: ! 318: return (getlogin()); ! 319: } ! 320: /* ! 321: ** TTYPATH -- Get the path of the user's tty ! 322: ** ! 323: ** Returns the pathname of the user's tty. Returns NULL if ! 324: ** the user is not logged in or if s/he has write permission ! 325: ** denied. ! 326: ** ! 327: ** Parameters: ! 328: ** none ! 329: ** ! 330: ** Returns: ! 331: ** pathname of the user's tty. ! 332: ** NULL if not logged in or write permission denied. ! 333: ** ! 334: ** Side Effects: ! 335: ** none. ! 336: ** ! 337: ** WARNING: ! 338: ** Return value is in a local buffer. ! 339: ** ! 340: ** Called By: ! 341: ** savemail ! 342: */ ! 343: ! 344: # include <sys/stat.h> ! 345: ! 346: char * ! 347: ttypath() ! 348: { ! 349: struct stat stbuf; ! 350: register char *pathn; ! 351: extern char *ttyname(); ! 352: extern char *getlogin(); ! 353: ! 354: /* compute the pathname of the controlling tty */ ! 355: if ((pathn = ttyname(2)) == NULL && (pathn = ttyname(1)) == NULL && ! 356: (pathn = ttyname(0)) == NULL) ! 357: { ! 358: errno = 0; ! 359: return (NULL); ! 360: } ! 361: ! 362: /* see if we have write permission */ ! 363: if (stat(pathn, &stbuf) < 0 || !bitset(02, stbuf.st_mode)) ! 364: { ! 365: errno = 0; ! 366: return (NULL); ! 367: } ! 368: ! 369: /* see if the user is logged in */ ! 370: if (getlogin() == NULL) ! 371: return (NULL); ! 372: ! 373: /* looks good */ ! 374: return (pathn); ! 375: } ! 376: /* ! 377: ** CHECKCOMPAT -- check for From and To person compatible. ! 378: ** ! 379: ** This routine can be supplied on a per-installation basis ! 380: ** to determine whether a person is allowed to send a message. ! 381: ** This allows restriction of certain types of internet ! 382: ** forwarding or registration of users. ! 383: ** ! 384: ** If the hosts are found to be incompatible, an error ! 385: ** message should be given using "usrerr" and FALSE should ! 386: ** be returned. ! 387: ** ! 388: ** 'NoReturn' can be set to suppress the return-to-sender ! 389: ** function; this should be done on huge messages. ! 390: ** ! 391: ** Parameters: ! 392: ** to -- the person being sent to. ! 393: ** ! 394: ** Returns: ! 395: ** TRUE -- ok to send. ! 396: ** FALSE -- not ok. ! 397: ** ! 398: ** Side Effects: ! 399: ** none (unless you include the usrerr stuff) ! 400: */ ! 401: ! 402: bool ! 403: checkcompat(to) ! 404: register ADDRESS *to; ! 405: { ! 406: # ifdef lint ! 407: if (to == NULL) ! 408: to++; ! 409: # endif lint ! 410: # ifdef EXAMPLE_CODE ! 411: /* this code is intended as an example only */ ! 412: register STAB *s; ! 413: ! 414: s = stab("arpa", ST_MAILER, ST_FIND); ! 415: if (s != NULL && CurEnv->e_from.q_mailer != LocalMailer && ! 416: to->q_mailer == s->s_mailer) ! 417: { ! 418: usrerr("No ARPA mail through this machine: see your system administration"); ! 419: /* NoReturn = TRUE; to supress return copy */ ! 420: return (FALSE); ! 421: } ! 422: # endif EXAMPLE_CODE ! 423: return (TRUE); ! 424: } ! 425: /* ! 426: ** HOLDSIGS -- arrange to hold all signals ! 427: ** ! 428: ** Parameters: ! 429: ** none. ! 430: ** ! 431: ** Returns: ! 432: ** none. ! 433: ** ! 434: ** Side Effects: ! 435: ** Arranges that signals are held. ! 436: */ ! 437: ! 438: holdsigs() ! 439: { ! 440: } ! 441: /* ! 442: ** RLSESIGS -- arrange to release all signals ! 443: ** ! 444: ** This undoes the effect of holdsigs. ! 445: ** ! 446: ** Parameters: ! 447: ** none. ! 448: ** ! 449: ** Returns: ! 450: ** none. ! 451: ** ! 452: ** Side Effects: ! 453: ** Arranges that signals are released. ! 454: */ ! 455: ! 456: rlsesigs() ! 457: { ! 458: } ! 459: /* ! 460: ** GETLA -- get the current load average ! 461: ** ! 462: ** This code stolen from la.c. ! 463: ** ! 464: ** Parameters: ! 465: ** none. ! 466: ** ! 467: ** Returns: ! 468: ** The current load average as an integer. ! 469: ** ! 470: ** Side Effects: ! 471: ** none. ! 472: */ ! 473: ! 474: #ifdef VMUNIX ! 475: ! 476: #include <nlist.h> ! 477: ! 478: struct nlist Nl[] = ! 479: { ! 480: { "_avenrun" }, ! 481: #define X_AVENRUN 0 ! 482: { 0 }, ! 483: }; ! 484: ! 485: getla() ! 486: { ! 487: static int kmem = -1; ! 488: double avenrun[3]; ! 489: ! 490: if (kmem < 0) ! 491: { ! 492: kmem = open("/dev/kmem", 0); ! 493: if (kmem < 0) ! 494: return (-1); ! 495: (void) ioctl(kmem, FIOCLEX, 0); ! 496: nlist("/vmunix", Nl); ! 497: if (Nl[0].n_type == 0) ! 498: return (-1); ! 499: } ! 500: (void) lseek(kmem, (long) Nl[X_AVENRUN].n_value, 0); ! 501: (void) read(kmem, avenrun, sizeof(avenrun)); ! 502: return ((int) (avenrun[0] + 0.5)); ! 503: } ! 504: ! 505: #else VMUNIX ! 506: ! 507: getla() ! 508: { ! 509: return (0); ! 510: } ! 511: ! 512: #endif VMUNIX
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.