1294Seric # include <stdio.h> 2294Seric # include <pwd.h> 32967Seric # include "postbox.h" 4404Seric 5294Seric /* 62967Seric ** CONF.C -- Postbox Configuration Tables. 7294Seric ** 8294Seric ** Defines the configuration of this installation. 9294Seric ** 101388Seric ** Compilation Flags: 111388Seric ** HASARPA -- set if this machine has a connection to 121388Seric ** the Arpanet. 131388Seric ** HASUUCP -- set if this machine has a connection to 141388Seric ** the UUCP network. 151388Seric ** NETV6MAIL -- set if you want to use "v6mail" that 161388Seric ** comes with the Berkeley network. Normally 171388Seric ** /bin/mail will work fine, but around Berkeley 181388Seric ** we use v6mail because it is a "fixed target". 192355Seric ** Also, only v6mail has the "/dev/mail" stuff 202355Seric ** in it (for biff(1)). 211388Seric ** V6 -- running on a version 6 system. This determines 221388Seric ** whether to define certain routines between 231388Seric ** the two systems. If you are running a funny 241388Seric ** system, e.g., V6 with long tty names, this 251388Seric ** should be checked carefully. 261573Seric ** DUMBMAIL -- set if your /bin/mail doesn't have the 271573Seric ** -d flag. 28294Seric ** 291388Seric ** Configuration Variables: 301573Seric ** ArpaHost -- the arpanet name of the host through 311573Seric ** which arpanet mail will be sent. 321388Seric ** MyLocName -- the name of the host on a local network. 331388Seric ** This is used to disambiguate the contents of 341388Seric ** ArpaHost among many hosts who may be sharing 351388Seric ** a gateway. 362099Seric ** DaemonName -- the name of this agent for use in 372099Seric ** error messages, typically "~MAILER~DAEMON~" 382099Seric ** at this host on the local net. 391573Seric ** ArpaLocal -- a list of local names for this host on 401573Seric ** the arpanet. Only functional if HASARPA set. 411573Seric ** UucpLocal -- ditto for the Arpanet. 421573Seric ** BerkLocal -- ditto for the Berknet. 431388Seric ** Mailer -- a table of mailers known to the system. 441388Seric ** The fields are: 451388Seric ** - the pathname of the mailer. 461388Seric ** - a list of flags describing the properties 471388Seric ** of this mailer: 481388Seric ** M_FOPT -- if set, the mailer has a picky "-f" 491388Seric ** option. In this mode, the mailer will 501388Seric ** only accept the "-f" option if the 511388Seric ** sender is actually "root", "network", 521388Seric ** and possibly (but not necessarily) if 531388Seric ** the -f argument matches the real sender. 541388Seric ** The effect is that if the "-f" option 552967Seric ** is given to postbox then it will be 561388Seric ** passed through (as arguments 1 & 2) to 571388Seric ** the mailer. 581388Seric ** M_ROPT -- identical to M_FOPT, except uses 591388Seric ** -r instead. 601388Seric ** M_QUIET -- if set, don't print a message if 611388Seric ** the mailer returns bad status. 621388Seric ** M_RESTR -- if set, this mailer is restricted 631388Seric ** to use by "daemon"; otherwise, we do a 641388Seric ** setuid(getuid()) before calling the 651388Seric ** mailer. 661388Seric ** M_HDR -- if set, the mailer wants us to 671388Seric ** insert a UNIX "From" line before 681388Seric ** outputing. 691827Seric ** M_FHDR -- if set, the header that we 701827Seric ** generate will be used literally, so 711827Seric ** we must force it to be correct. The 721827Seric ** effect is that we generate a header 731827Seric ** even if one exists. 741388Seric ** M_NOHOST -- if set, this mailer doesn't care 751388Seric ** about the host part (e.g., the local 761388Seric ** mailer). 771388Seric ** M_STRIPQ -- if set, strip quote (`"') 781388Seric ** characters out of parameters as you 791388Seric ** transliterate them into the argument 801388Seric ** vector. For example, the local mailer 811388Seric ** is called directly, so these should be 821388Seric ** stripped, but the program-mailer (i.e., 831388Seric ** csh) should leave them in. 842897Seric ** M_NEEDDATE -- this mailer requires a Date: 852897Seric ** field in the message. 862897Seric ** M_NEEDFROM -- this mailer requires a From: 872897Seric ** field in the message. 882897Seric ** M_MSGID -- this mailer requires a Message-Id 892897Seric ** field in the message. 902897Seric ** M_COMMAS -- this mailer wants comma- 912897Seric ** seperated To: and Cc: fields. 922897Seric ** M_ARPAFMT == M_NEEDDATE|M_NEEDFROM|M_MSGID| 932897Seric ** M_COMMAS. 941388Seric ** - an exit status to use as the code for the 951388Seric ** error message print if the mailer returns 961388Seric ** something we don't understand. 971388Seric ** - A list of names that are to be considered 981388Seric ** "local" (and hence are stripped off) for 991388Seric ** this mailer. 1001388Seric ** - An argument vector to be passed to the 1011388Seric ** mailer with the following substitutions: 1021388Seric ** $f - the from person name. 1031388Seric ** $u - the target user name. 1041388Seric ** $h - the target user host. 1051388Seric ** $c - the hop count. 1061388Seric ** >>>>>>>>>> Entry zero must be for the local 1071388Seric ** >> NOTE >> mailer and entry one must be for 1081388Seric ** >>>>>>>>>> the shell. 1091388Seric ** ParseTab -- a table driving the parsing process. Each 1101388Seric ** entry contains: 1111388Seric ** - a character that will trigger this entry. 1121388Seric ** - an index into the Mailer table. 1132967Seric ** - a word of flags, described in postbox.h. 1141388Seric ** - an argument. If we have P_MAP, it is the 1151388Seric ** character to turn the trigger character into. 1161388Seric ** If we have P_MOVE, it is the site to send it 1171388Seric ** to, using the mailer specified above. 1181573Seric ** This table will almost certainly have to be 1191573Seric ** changed on your site if you have anything more 1201573Seric ** than the UUCP net. 1212897Seric ** HdrInfo -- a table describing well-known header fields. 1222897Seric ** Each entry has the field name and some flags, 1232897Seric ** which can be: 1242897Seric ** H_CONCAT -- if there is more than one field 1252897Seric ** of this name, turn it into a comma- 1262897Seric ** seperated list. 1272897Seric ** H_DELETE -- delete this field. 128294Seric */ 129294Seric 130294Seric 131294Seric 132294Seric 133*3046Seric static char SccsId[] = "@(#)conf.c 3.4 03/07/81"; 134294Seric 1351388Seric 1361388Seric # include <whoami.h> /* definitions of machine id's at berkeley */ 1371388Seric 1381573Seric # ifdef BERKELEY 1392099Seric 1401573Seric char *ArpaHost = "Berkeley"; /* host name of gateway on Arpanet */ 1412897Seric char *UucpHost = "ucbvax"; /* host name of gateway on UUCP net */ 1422897Seric # define BerkHost MyLocName /* host name of gateway on Berk net */ 1432355Seric # define NETV6MAIL /* use /usr/net/bin/v6mail for local delivery */ 1442099Seric 1451573Seric # else BERKELEY 1462099Seric 1471573Seric char *ArpaHost = "[unknown]"; 1481573Seric char *MyLocName = sysname; 1491573Seric # define HASUUCP /* default to having UUCP net */ 1501573Seric char *UucpLocal[] = { sysname, NULL }; 1512099Seric 1521573Seric # endif BERKELEY 1531573Seric 1542099Seric 1552099Seric /* Specific Configurations for Berkeley Machines */ 1562099Seric 1572099Seric /* Berkeley people: mail changes to csvax:eric or they will be lost! */ 1582099Seric 159294Seric # ifdef ING70 160294Seric static char *BerkLocal[] = { "i", "ingres", "ing70", NULL }; 1612099Seric char *ArpaLocal = { "berkeley", "ucb", NULL }; 1621206Seric char *MyLocName = "Ing70"; 1632098Seric char *DaemonName = "Ing70:~MAILER~DAEMON~"; 164294Seric # define HASARPA 165294Seric # define V6 166294Seric # endif ING70 167294Seric 168294Seric # ifdef INGVAX 169294Seric static char *BerkLocal[] = { "j", "ingvax", NULL }; 1701206Seric char *MyLocName = "IngVax"; 1712098Seric char *DaemonName = "IngVax:~MAILER~DAEMON~"; 172294Seric # endif INGVAX 173294Seric 174294Seric # ifdef CSVAX 175294Seric static char *BerkLocal[] = { "v", "csvax", "vax", NULL }; 176590Seric static char *UucpLocal[] = { "ucbvax", "ernie", NULL }; 1771206Seric char *MyLocName = "CSVAX"; 1782098Seric char *DaemonName = "CSVAX:~MAILER~DAEMON~"; 179294Seric # define HASUUCP 180294Seric # endif CSVAX 181294Seric 1822355Seric # ifdef ARPAVAX 1832355Seric static char *BerkLocal[] = { "r", "arpavax", NULL }; 1842355Seric char *MyLocName = "ARPAVAX"; 1852355Seric char *DaemonName = "ARPAVAX:~MAILER~DAEMON~"; 1862355Seric # endif ARPAVAX 1872355Seric 188294Seric # ifdef CORY 189294Seric static char *BerkLocal[] = { "y", "cory", NULL }; 1901206Seric char *MyLocName = "Cory"; 1912098Seric char *DaemonName = "Cory:~MAILER~DAEMON~"; 192294Seric # endif CORY 193294Seric 1942420Seric # ifdef ONYX 1952420Seric static char *BerkLocal[[] = { "x", "onyx", NULL }; 1962420Seric char *MyLocName = "Onyx"; 1972420Seric char *DaemonName = "Onyx:~MAILER~DAEMON~"; 1982420Seric # endif ONYX 1992420Seric 200294Seric # ifdef IMAGE 201294Seric /* untested */ 202294Seric static char *BerkLocal[] = { "m", "image", NULL }; 2031206Seric char *MyLocName = "Image"; 2042098Seric char *DaemonName = "Image:~MAILER~DAEMON~"; 205294Seric # define V6 206294Seric # endif IMAGE 207294Seric 208294Seric # ifdef ESVAX 209294Seric static char *BerkLocal[] = { "o", "esvax", NULL }; 2101206Seric char *MyLocName = "ESVAX"; 2112098Seric char *DaemonName = "ESVAX:~MAILER~DAEMON~"; 212294Seric # endif ESVAX 213294Seric 214294Seric # ifdef EECS40 215294Seric /* untested */ 216294Seric static char *BerkLocal[] = { "z", "eecs40", NULL }; 2171206Seric char *MyLocName = "EECS40"; 2182098Seric char *DaemonName = "EECS40:~MAILER~DAEMON~"; 219294Seric # define V6 220294Seric # endif EECS40 221294Seric 222590Seric 223590Seric # ifndef HASARPA 224590Seric # define ArpaLocal NULL 225590Seric # endif HASARPA 226590Seric 227590Seric # ifndef HASUUCP 228590Seric # define UucpLocal NULL 229590Seric # endif HASUUCP 230590Seric 231590Seric 232*3046Seric /* local mail -- must be #0 */ 233*3046Seric static char *LocalArgv[] = 234294Seric { 235*3046Seric "...local%mail", 236*3046Seric "-d", 237*3046Seric "$u", 238*3046Seric NULL 239*3046Seric }; 240*3046Seric 241*3046Seric static struct mailer LocalMailer = 242*3046Seric { 243294Seric # ifdef NETV6MAIL 244*3046Seric "/usr/net/bin/v6mail", 245294Seric # else 246*3046Seric "/bin/mail", 247294Seric # endif 248*3046Seric M_ROPT|M_NOHOST|M_STRIPQ|M_ARPAFMT, EX_NOUSER, NULL, 249*3046Seric "$f", NULL, LocalArgv, 250*3046Seric }; 251*3046Seric 252*3046Seric /* pipes through programs -- must be #1 */ 253*3046Seric static char *ProgArgv[] = 254*3046Seric { 255*3046Seric "...prog%mail", 256*3046Seric "-fc", 257*3046Seric "$u", 258*3046Seric NULL 259*3046Seric }; 260*3046Seric 261*3046Seric static struct mailer ProgMailer = 262*3046Seric { 263*3046Seric "/bin/csh", 264*3046Seric M_HDR|M_FHDR|M_NOHOST, EX_UNAVAILABLE, NULL, 265*3046Seric "$f", NULL, ProgArgv, 266*3046Seric }; 267*3046Seric 268*3046Seric /* local berkeley mail */ 269*3046Seric static char *BerkArgv[] = 270*3046Seric { 271*3046Seric "...berk%mail", 272*3046Seric "-m", 273*3046Seric "$h", 274*3046Seric "-t", 275*3046Seric "$u", 276*3046Seric "-h", 277*3046Seric "$c", 278*3046Seric NULL 279*3046Seric }; 280*3046Seric 281*3046Seric static struct mailer BerkMailer = 282*3046Seric { 283*3046Seric "/usr/net/bin/sendberkmail", 284*3046Seric M_FOPT|M_HDR|M_STRIPQ, EX_UNAVAILABLE, BerkLocal, 285*3046Seric "$B:$f", NULL, BerkArgv, 286*3046Seric }; 287*3046Seric 288*3046Seric /* arpanet mail */ 289*3046Seric static char *ArpaArgv[] = 290*3046Seric { 291*3046Seric "...arpa%mail", 292*3046Seric "$f", 293*3046Seric "$h", 294*3046Seric "$u", 295*3046Seric NULL 296*3046Seric }; 297*3046Seric 298*3046Seric static struct mailer ArpaMailer = 299*3046Seric { 300*3046Seric "/usr/lib/mailers/arpa", 301*3046Seric M_STRIPQ|M_ARPAFMT, 0, ArpaLocal, 302*3046Seric "$f@$A", NULL, ArpaArgv, 303*3046Seric }; 304*3046Seric 305*3046Seric /* uucp mail (cheat & use Bell's v7 mail) */ 306*3046Seric static char *UucpArgv[] = 307*3046Seric { 308*3046Seric "...uucp%mail", 309294Seric # ifdef DUMBMAIL 310*3046Seric "-d", 311294Seric # endif DUMBMAIL 312*3046Seric "$h!$u", 313*3046Seric NULL 314294Seric }; 315294Seric 316*3046Seric static struct mailer UucpMailer = 317*3046Seric { 318*3046Seric "/bin/mail", 319*3046Seric M_ROPT|M_STRIPQ, EX_NOUSER, UucpLocal, 320*3046Seric "$U!$f", NULL, UucpArgv, 321*3046Seric }; 322*3046Seric 323*3046Seric struct mailer *Mailer[] = 324*3046Seric { 325*3046Seric &LocalMailer, /* 0 -- must be 0 */ 326*3046Seric &ProgMailer, /* 1 -- must be 1 */ 327*3046Seric &BerkMailer, /* 2 */ 328*3046Seric &ArpaMailer, /* 3 */ 329*3046Seric &UucpMailer, /* 4 */ 330*3046Seric }; 331*3046Seric 332*3046Seric # define NMAILERS (sizeof Mailer / sizeof Mailer[0]) 333*3046Seric 334294Seric # define M_LOCAL 0 335*3046Seric # define M_PROG 1 336294Seric # define M_BERK 2 337294Seric # define M_ARPA 3 338294Seric # define M_UUCP 4 339294Seric 340*3046Seric /* list of messages for each mailer (sorted by host) */ 341*3046Seric ADDRESS MailList[NMAILERS]; 342294Seric 343294Seric 344*3046Seric 3451573Seric # ifdef BERKELEY 346294Seric struct parsetab ParseTab[] = 347294Seric { 348294Seric ':', M_BERK, P_ONE, NULL, 349294Seric # ifdef HASARPA 350294Seric '@', M_ARPA, P_HLAST|P_USR_UPPER, NULL, 351294Seric # else 352294Seric '@', M_BERK, P_HLAST|P_USR_UPPER|P_MOVE, "ing70", 353294Seric # endif HASARPA 354294Seric '^', -1, P_MAP, "!", 355294Seric # ifdef HASUUCP 356294Seric '!', M_UUCP, 0, NULL, 357294Seric # else 358294Seric '!', M_BERK, P_MOVE, "csvax", 359294Seric # endif HASUUCP 360294Seric '.', -1, P_MAP|P_ONE, ":", 361294Seric '\0', M_LOCAL, P_MOVE, "", 362294Seric }; 3631573Seric # else BERKELEY 3641573Seric struct parsetab ParseTab[] = 3651573Seric { 3661573Seric # ifdef HASARPA 3671573Seric '@', M_ARPA, P_HLAST|P_USR_UPPER, NULL, 3681573Seric # endif HASARPA 3691573Seric # ifdef HASUUCP 3701573Seric '^', -1, P_MAP, "!", 3711573Seric '!', M_UUCP, 0, NULL, 3721573Seric # endif HASUUCP 3731573Seric '\0', M_LOCAL, P_MOVE, "", 3741573Seric }; 3751573Seric # endif BERKELEY 3762897Seric 3772897Seric 3782897Seric /* 3792897Seric ** Header info table 3802897Seric */ 3812897Seric 3822897Seric struct hdrinfo HdrInfo[] = 3832897Seric { 3842897Seric "date", 0, 3852897Seric "from", 0, 3862897Seric "to", H_CONCAT, 3872897Seric "cc", H_CONCAT, 3882897Seric "subject", 0, 3892897Seric "message-id", 0, 3902897Seric NULL, 0 3912897Seric }; 392294Seric /* 3932897Seric ** INITMACS -- initialize predefined macros. 3942897Seric ** 3952897Seric ** Parameters: 3962897Seric ** none. 3972897Seric ** 3982897Seric ** Returns: 3992897Seric ** none. 4002897Seric ** 4012897Seric ** Side Effects: 4022897Seric ** Macros array gets initialized. 4032897Seric */ 4042897Seric 4052897Seric char *Macro[26]; 4062897Seric 4072897Seric # define MACRO(x) Macro[x - 'A'] 4082897Seric 4092897Seric initmacs() 4102897Seric { 4112897Seric MACRO('A') = ArpaHost; 4122897Seric MACRO('B') = BerkHost; 4132897Seric MACRO('U') = UucpHost; 4142897Seric } 415294Seric 416294Seric # ifdef V6 417294Seric /* 418294Seric ** TTYPATH -- Get the path of the user's tty -- Version 6 version. 419294Seric ** 420294Seric ** Returns the pathname of the user's tty. Returns NULL if 421294Seric ** the user is not logged in or if s/he has write permission 422294Seric ** denied. 423294Seric ** 424294Seric ** Parameters: 425294Seric ** none 426294Seric ** 427294Seric ** Returns: 428294Seric ** pathname of the user's tty. 429294Seric ** NULL if not logged in or write permission denied. 430294Seric ** 431294Seric ** Side Effects: 432294Seric ** none. 433294Seric ** 434294Seric ** WARNING: 435294Seric ** Return value is in a local buffer. 436294Seric ** 437294Seric ** Called By: 438294Seric ** savemail 439294Seric */ 440294Seric 441294Seric # include <sys/types.h> 442294Seric # include <sys/stat.h> 443294Seric 444294Seric char * 445294Seric ttypath() 446294Seric { 447294Seric struct stat stbuf; 448294Seric register int i; 449294Seric static char pathn[] = "/dev/ttyx"; 450294Seric extern int errno; 451294Seric 452294Seric /* compute the pathname of the controlling tty */ 453294Seric if ((i = ttyn(2)) == 'x' && (i = ttyn(1)) == 'x' && (i = ttyn(0)) == 'x') 454294Seric { 455294Seric errno = 0; 456294Seric return (NULL); 457294Seric } 458294Seric pathn[8] = i; 459294Seric 460294Seric /* see if we have write permission */ 4612967Seric if (stat(pathn, &stbuf) < 0 || !bitset(02, stbuf.st_mode)) 462294Seric { 463294Seric errno = 0; 464294Seric return (NULL); 465294Seric } 466294Seric 467294Seric /* see if the user is logged in */ 468294Seric if (getlogin() == NULL) 469294Seric return (NULL); 470294Seric 471294Seric /* looks good */ 472294Seric return (pathn); 473294Seric } 474294Seric /* 475294Seric ** FDOPEN -- Open a stdio file given an open file descriptor. 476294Seric ** 477294Seric ** This is included here because it is standard in v7, but we 478294Seric ** need it in v6. 479294Seric ** 480294Seric ** Algorithm: 481294Seric ** Open /dev/null to create a descriptor. 482294Seric ** Close that descriptor. 483294Seric ** Copy the existing fd into the descriptor. 484294Seric ** 485294Seric ** Parameters: 486294Seric ** fd -- the open file descriptor. 487294Seric ** type -- "r", "w", or whatever. 488294Seric ** 489294Seric ** Returns: 490294Seric ** The file descriptor it creates. 491294Seric ** 492294Seric ** Side Effects: 493294Seric ** none 494294Seric ** 495294Seric ** Called By: 496294Seric ** deliver 497294Seric ** 498294Seric ** Notes: 499294Seric ** The mode of fd must match "type". 500294Seric */ 501294Seric 502294Seric FILE * 503294Seric fdopen(fd, type) 504294Seric int fd; 505294Seric char *type; 506294Seric { 507294Seric register FILE *f; 508294Seric 509294Seric f = fopen("/dev/null", type); 510294Seric close(fileno(f)); 511294Seric fileno(f) = fd; 512294Seric return (f); 513294Seric } 514294Seric /* 515294Seric ** INDEX -- Return pointer to character in string 516294Seric ** 517294Seric ** For V7 compatibility. 518294Seric ** 519294Seric ** Parameters: 520294Seric ** s -- a string to scan. 521294Seric ** c -- a character to look for. 522294Seric ** 523294Seric ** Returns: 524294Seric ** If c is in s, returns the address of the first 525294Seric ** instance of c in s. 526294Seric ** NULL if c is not in s. 527294Seric ** 528294Seric ** Side Effects: 529294Seric ** none. 530294Seric */ 531294Seric 532294Seric index(s, c) 533294Seric register char *s; 534294Seric register char c; 535294Seric { 536294Seric while (*s != '\0') 537294Seric { 538294Seric if (*s++ == c) 539294Seric return (--s); 540294Seric } 541294Seric return (NULL); 542294Seric } 543294Seric # endif V6 544294Seric 545294Seric # ifndef V6 546294Seric /* 547294Seric ** TTYPATH -- Get the path of the user's tty -- Version 7 version. 548294Seric ** 549294Seric ** Returns the pathname of the user's tty. Returns NULL if 550294Seric ** the user is not logged in or if s/he has write permission 551294Seric ** denied. 552294Seric ** 553294Seric ** Parameters: 554294Seric ** none 555294Seric ** 556294Seric ** Returns: 557294Seric ** pathname of the user's tty. 558294Seric ** NULL if not logged in or write permission denied. 559294Seric ** 560294Seric ** Side Effects: 561294Seric ** none. 562294Seric ** 563294Seric ** WARNING: 564294Seric ** Return value is in a local buffer. 565294Seric ** 566294Seric ** Called By: 567294Seric ** savemail 568294Seric */ 569294Seric 570294Seric # include <sys/types.h> 571294Seric # include <sys/stat.h> 572294Seric 573294Seric char * 574294Seric ttypath() 575294Seric { 576294Seric struct stat stbuf; 577294Seric register char *pathn; 578294Seric extern int errno; 579294Seric extern char *ttyname(); 580294Seric 581294Seric /* compute the pathname of the controlling tty */ 582294Seric if ((pathn = ttyname(2)) == NULL && (pathn = ttyname(1)) == NULL && (pathn = ttyname(0)) == NULL) 583294Seric { 584294Seric errno = 0; 585294Seric return (NULL); 586294Seric } 587294Seric 588294Seric /* see if we have write permission */ 5892967Seric if (stat(pathn, &stbuf) < 0 || !bitset(02, stbuf.st_mode)) 590294Seric { 591294Seric errno = 0; 592294Seric return (NULL); 593294Seric } 594294Seric 595294Seric /* see if the user is logged in */ 596294Seric if (getlogin() == NULL) 597294Seric return (NULL); 598294Seric 599294Seric /* looks good */ 600294Seric return (pathn); 601294Seric } 602294Seric # endif V6 6032967Seric /* 6042967Seric ** CHECKCOMPAT -- check for From and To person compatible. 6052967Seric ** 6062967Seric ** This routine can be supplied on a per-installation basis 6072967Seric ** to determine whether a person is allowed to send a message. 6082967Seric ** This allows restriction of certain types of internet 6092967Seric ** forwarding or registration of users. 6102967Seric ** 6112967Seric ** If the hosts are found to be incompatible, an error 6122967Seric ** message should be given using "usrerr" and FALSE should 6132967Seric ** be returned. 6142967Seric ** 6152967Seric ** Parameters: 6162967Seric ** to -- the person being sent to. 6172967Seric ** 6182967Seric ** Returns: 6192967Seric ** TRUE -- ok to send. 6202967Seric ** FALSE -- not ok. 6212967Seric ** 6222967Seric ** Side Effects: 6232967Seric ** none (unless you include the usrerr stuff) 6242967Seric */ 6252967Seric 6262967Seric bool 6272967Seric checkcompat(to) 6282967Seric register ADDRESS *to; 6292967Seric { 6302967Seric return (TRUE); 6312967Seric } 632