|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T a
Length: 30463 (0x76ff) Types: TextFile Names: »apollo+uk.src.patches«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit └─⟦bfebc70e2⟧ »EurOpenD3/mail/sendmail-5.65b+IDA-1.4.3.tar.Z« └─⟦f9e35cd84⟧ └─⟦this⟧ »sendmail/uk.extras/apollo+uk.src.patches«
*** /tmp/,RCSt1a05356 Thu Dec 20 23:57:57 1990 --- collect.c Thu Dec 20 23:55:28 1990 *************** *** 236,243 **** --- 236,250 ---- "collect: unexpected close on connection from %s: %m\n", CurEnv->e_from.q_paddr, RealHostName); # endif /* LOG */ + #ifdef CANT_SELECT_FUNCS + if (feof(InChannel)) + usrerr ("collect: unexpected close, from=%s", CurEnv->e_from.q_paddr); + else + syserr ("collect: unexpected close, from=%s", CurEnv->e_from.q_paddr); + #else (feof(InChannel) ? usrerr: syserr) ("collect: unexpected close, from=%s", CurEnv->e_from.q_paddr); + #endif /* CANT_SELECT_FUNCS */ /* don't return an error indication */ CurEnv->e_to = NULL; *** /tmp/,RCSt1a05356 Thu Dec 20 23:58:09 1990 --- conf.h Thu Dec 20 23:55:36 1990 *************** *** 36,42 **** # define MAXHOP 17 /* max value of HopCount */ # define MAXATOM 200 /* max atoms per address */ # define MAXMAILERS 25 /* maximum mailers known to system */ ! # define MAXRWSETS 31 /* max # of sets of rewriting rules */ # define MAXPRIORITIES 25 /* max values for Precedence: field */ # define MAXTRUST 30 /* maximum number of trusted users */ # define MAXUSERENVIRON 40 /* max # of items in user environ */ --- 36,42 ---- # define MAXHOP 17 /* max value of HopCount */ # define MAXATOM 200 /* max atoms per address */ # define MAXMAILERS 25 /* maximum mailers known to system */ ! # define MAXRWSETS 40 /* max # of sets of rewriting rules */ # define MAXPRIORITIES 25 /* max values for Precedence: field */ # define MAXTRUST 30 /* maximum number of trusted users */ # define MAXUSERENVIRON 40 /* max # of items in user environ */ *************** *** 65,71 **** # define UGLYUUCP 1 /* output ugly UUCP From lines */ # define DAEMON 1 /* include the daemon (requires IPC & SMTP) */ /*# define MAIL11V3 1 /* enable non-standard SMTP mods for DECnet */ ! # define SETPROCTITLE 1 /* munge argv to display current status */ # define NAMED_BIND 1 /* use Berkeley Internet Domain Server */ # define SIG_TYPE int /* SUN's signal() returns void type */ # define VSPRINTF 1 /* have vsprintf() in /lib/libc.a */ --- 65,73 ---- # define UGLYUUCP 1 /* output ugly UUCP From lines */ # define DAEMON 1 /* include the daemon (requires IPC & SMTP) */ /*# define MAIL11V3 1 /* enable non-standard SMTP mods for DECnet */ ! # ifndef apollo /* jf 12/90 - this action always crashes apollos */ ! # define SETPROCTITLE 1 /* munge argv to display current status */ ! # endif # define NAMED_BIND 1 /* use Berkeley Internet Domain Server */ # define SIG_TYPE int /* SUN's signal() returns void type */ # define VSPRINTF 1 /* have vsprintf() in /lib/libc.a */ *************** *** 87,93 **** ** file. Older systems used /usr/lib/sendmail.cf, some newer systems move ** this file to /etc/sendmail.cf. */ ! # define _PATH_SENDMAILCF "/etc/sendmail.cf" /* ** Comment out the following line if freeze files don't work on your platform. --- 89,95 ---- ** file. Older systems used /usr/lib/sendmail.cf, some newer systems move ** this file to /etc/sendmail.cf. */ ! #define _PATH_SENDMAILCF "/usr/lib/sendmail.cf" /* ** Comment out the following line if freeze files don't work on your platform. *************** *** 94,105 **** ** Freeze files will not work on the Next, nor under AIX 3.1 unless both ** malloc.c and getpwent.c are compiled with the sendmail source. */ ! # if !defined(NeXT) && !defined(_AIX) && !defined(apollo) ! # define _PATH_SENDMAILFC "/etc/sendmail.fc" ! # endif /* !NeXT && !_AIX && !apollo */ /* ** Comment out this line if you don't want sendmail to write a file with ** the daemon's pid. */ ! # define _PATH_SENDMAILPID "/etc/sendmail.pid" --- 96,264 ---- ** Freeze files will not work on the Next, nor under AIX 3.1 unless both ** malloc.c and getpwent.c are compiled with the sendmail source. */ ! #if !defined(NeXT) && !defined(_AIX) ! /* # define _PATH_SENDMAILFC "/etc/sendmail.fc" */ ! #endif /* !NeXT && !_AIX */ /* ** Comment out this line if you don't want sendmail to write a file with ** the daemon's pid. */ ! /* #define _PATH_SENDMAILPID "/etc/sendmail.pid" */ ! ! /* The following two definitions added from older implementations - ! particularly for HP Apollo 10.1 - John.Forrest@umist.ac.uk 12/90 */ ! /* There are problems on HP Apollo's when updating database files. ! Essentially, one node will lock out the others if they are opened ! RW. By default this distribution gets around this by stopping ! Apollo's from auto-updating. This is not always convenient. An ! alternative, which some users may prefer, would be to give every ! machine a unique directory - `node_data/sendmail for instance - ! and make /usr/lib/mail or whatever symbolic links there. The ! responsibility for this falls onto the system manager - otherwise ! sendmail will give lots of messages about being unable to open ! files. If you want this feature, uncomment the next define. This ! has no affect on non-Apollo machines. */ ! #define APOLLO_CAN_UPDATE 1 ! ! /* ! * A problem has arrisen on Apollo OS/10.1, where sendmail ! * is sometimes unable to exec mailers with EBADF errno. ! * This would appear to be related to closing files by ! * setting their "close on exec" flag, just before the ! * exec itself. To get around this, defining ! * EXPLICIT_CLOSE_ON_EXEC forces explicit calls to close ! * instead. The effect should be identical - it is difficult ! * to see why close was not used to start with. ! */ ! #define EXPLICIT_CLOSE_ON_EXEC 1 ! ! /* Some compilers cannot cope with: ! (conf ? func1 : func2) (args); ! These include the OS10.1 Apollo compilers. To get around ! this problem, define CANT_SELECT_FUNCS. jf 12/90, after earlier fix. */ ! #define CANT_SELECT_FUNCS 1 ! ! /* ! * There is a bug in doprnt in some machines, including ! * Apollo 10.1, where %.*s has problems. The bug manifests ! * itself an extra blank line being added to each set of ! * blank lines in the original. To overcome this, we use ! * an older version of putline in util.c - if DOPRNT_FIX ! * is defined. ! */ ! #define DOPRNT_FIX 1 ! ! /* Beginning of changes aimed at domain.c done by John Forrest, ! Dept of Computation, UMIST - John.Forrest@umist.ac.uk */ ! ! /* ! * If you define LOOK_FOR_LONGSYNONYMS, sendmail will try to spot ! * situations where parent domains have synonyms in BIND. ! * For example, with: ! * manchester.ac.uk. CNAME man.ac.uk. ! * computer-science.man.ac.uk CNAME cs.man.ac.uk. ! * ! * with this option set, given computer-science.manchester.ac.uk ! * it will produce cs.man.ac.uk. Normally, no such synonym will ! * be spotted. Note this is primarily intended for use in the UK, ! * where such synonyms abound. It does take longer to spot a bad ! * address, so if you don't need the functionality don't use it - ! * comment out the next line - jf 12/90 */ ! #define LOOK_FOR_LONGSYNONYMS 1 ! ! /* An extension which allows one of the classes to be nominated ! as known top domains. If an address ends with one of these to start ! with, we assume it is fully expanded, and the only point of looking ! up the name is to find synonyms. Note: this only affects getting ! the canonical name using BIND. To enable the extension, define ! TOP_DOMAIN_CLASS to the letter you wish to use. It is suggested ! that class 't' be used - because this is lower case, no other cf rule ! set should use this for another reason. However, as a safety ! measure, the feature is only enabled if there is some data placed ! in TOP_DOMAIN_CLASS. ! ! By default, names are always searched for normally (if ! NO_WILDCARD_MX) or not really searched for (! NO_WILDCARD_MX). ! jf 12/90 ! */ ! #define TOP_DOMAIN_CLASS 't' ! ! /* ! * By default, during getcanonname, sendmail accesses BIND ! * with the DEFNAMES and DNSRCH flags set. This means that ! * partially defined names will be automatically resolved ! * by BIND. [Note, if TOP_DOMAIN_CLASS is defined, there is ! * a dot in the name, and the last element is in the ! * top domain class, the search will take place with these ! * bits reset.] If you prefer never to use DNSRCH in this ! * situation, for some reason, uncomment the next line. The ! * effect of this is that BIND only knows local and global ! * names. The bits used are refered to as the "SEARCH bits". ! * The disadvantage of this is that there are ambiguity ! * problems if TOP_DOMAIN_CLASS is not kept up to date - there ! * is a small possibility that what is really a full address ! * from somewhere else will match a local address. Whether you ! * feel this is a real possibility is a matter of opinion. ! * John Forrest 12/90. ! */ ! /* #define DONT_DNSRCH 1 */ ! ! /* ! * if IGNORE_SELF_MX is defined, getcanonname fails if the ! * found name has MX's where the best points to the current ! * node. The reason for this ``trick'' is as follows: ! * ! * Host 'somecompany.com', which has a uucp node name of ! * 'somecompany' arranges to have an MX record created, ! * pointing to the localnmode as the best preference. ! * At the same time, they make sure their uucp name is in ! * the uucp maps. ! * ! * When any internet user sends mail to ! * 'user@somecompany.com' it arrives at the localnode. ! * Because the best preference MX is local, the TCP mailer ! * is not selected. There is now a lookup of the PATHTABLE ! * database. This contains a record: ! * ! * somecompany.com foo!bar!somecompany%s ! * ! * which was generated from the uucp maps, using the ! * pathalias function. ! * ! * The big advantage of this is that whether to use the relay ! * or not can be determined by ``samecompany'' - it is a ! * question of changing the MX entry. The disadvantage is ! * that you have to be able to cope with ALL local synonyms ! * yourself - via PSEUDONUMS or via the DOMAINTABLE database. ! * Otherwise, you may find yourself with bouncing mail. ! * The alternative technique for routing is to use the ! * MAILERTABLE to indicate different mailers are required ! * for particular mail. This requires more local intervention, ! * but doesn't have any of the problems associated with ! * this option. ! * ! * Generally, if you don't relay or you are using non-IDA ! * .cf files, it is best to leave the option commented out. ! * Otherwise, it is up to you - it probably depends on ! * how many nodes you relay to, and how frequently the ! * information changes. ! - John.Forrest@umist 11/90. This option selectively ! enables code added by Paul Pomes. Comment derived ! from mail by Neil Rickert. */ ! /* #define IGNORE_SELF_MX 1 */ ! ! /* end of jf domain.c changes */ ! ! /* ! * There is always a problem of knowing what to do if ! * the name server returns h_errno==TRY_AGAIN during getcanonname. ! * By default, it will return FALSE, but if you define ! * IGNORE_TRYAGAIN, it will return TRUE. Normally if the ! * condition still persists, then it will be met again ! * during getmxrs, and the mail will be requeued. However, ! * if you use BIND to resolve names, there is always a possibility ! * that the wrong action will occur. Probably best only to ! * set this if BIND problems are common. ! */ ! /* #define IGNORE_TRYAGAIN 1 */ *** /tmp/,RCSt1a05356 Thu Dec 20 23:58:33 1990 --- deliver.c Thu Dec 20 23:56:00 1990 *************** *** 1027,1035 **** #else for (i = getdtablesize(); i > 2; --i) { #endif /* XPG3 */ ! register int j; ! if ((j = fcntl(i, F_GETFD, 0)) != -1) ! (void)fcntl(i, F_SETFD, j|1); } /* try to execute the mailer */ --- 1027,1041 ---- #else for (i = getdtablesize(); i > 2; --i) { #endif /* XPG3 */ ! #ifdef EXPLICIT_CLOSE_ON_EXEC ! if (close(i) < 0) ! if (errno != EBADF) ! syserr("Can't close fd %d\n", i); ! #else ! register int j; ! if ((j = fcntl(i, F_GETFD, 0)) != -1) ! (void)fcntl(i, F_SETFD, j|1); ! #endif } /* try to execute the mailer */ *** /tmp/,RCSt1a05356 Thu Dec 20 23:58:39 1990 --- domain.c Thu Dec 20 23:56:05 1990 *************** *** 170,235 **** return(nmx); } ! /* ! ** Getcanonname() below is broken in the sense that it won't return ! ** unqualified local host names with their full domain extension, ! ** unless the argument is an alias. ** ! ** Since gethostbyname() calls the name server with bind 4.8, ! ** I don't see why this function would be needed at all. I've ! ** therefore restored the old code in maphostname() of daemon.c ! ** that uses gethostbyname(). If there's something I've missed, ! ** feel free to change maphostname() to again call getcanonname(), ! ** but also make sure that the latter will qualify the host with ! ** its full domain AND return a status code indicating if the host ! ** was found. ! ** ! ** Lennart Lovstrand, Rank Xerox EuroPARC, 24-Aug-88 ! ** ! ** Unfortunately, just using gethostbyname won't do it. It queries for ! ** and returns only A Resource Records, so it will miss a host with only ! ** an MX record listed. If you're trying to deliver everything you can ! ** via the Internet, and deliver to only those hosts who are not in the ! ** domain name system at all by a "smart UUCP" mailer like smail, you ! ** will end up delivering more than you want to via that smart mailer. ! ** In that case, gethostbyname isn't enough. ! ** ! ** Chet Ramey, Case Western Reserve University, 15-Sep-88 ! ** ! ** Changed to make it return FALSE on an error, TRUE if an answer was ! ** found (any answer is enough). ! ** ! ** Chet Ramey, Case Western Reserve University, 16-Sep-88 ! ** ! ** In the case of a host with a MX record pointing at localhost, ! ** another routing method must be used. Examine any MX RRs returned. ! ** If the best one points to localhost, return FALSE. ! ** ! ** Paul Pomes, University of Illinois, 10-Oct-88 */ getcanonname(host, hbsize) char *host; int hbsize; { - extern int h_errno; register u_char *eom, *cp; ! register int n; HEADER *hp; querybuf answer; u_short type; int first, ancount, qdcount, loopcnt; char nbuf[PACKETSZ]; ! u_short MailPreference = (u_short) -1; char MailAgent[MAXNAME]; char MyName[MAXNAME]; char **MyAliases; - extern char **myhostname(); - MailAgent[0] = '\0'; - loopcnt = 0; loop: /* * Use query type of ANY if possible (NO_WILDCARD_MX), which will * find types CNAME, A, and MX, and will cause all existing records --- 170,320 ---- return(nmx); } ! /* Getcanonname - try to find canonical names using the BIND name ! server. This is basically done by looking up entries and using ! the names found, or the CNAME values. If nothing is found then ! FALSE is returned. Note, that if the return value is FALSE, ! the host value is not necessarily valid - the code that calls ! getcanonname only uses host for TRUE results. ! ! The exact behaviour depends on the values of NO_WOLDCARD_MX, ! TOP_DOMAIN_CLASS, DONT_DNSRCH, LOOK_FOR_LONGSYNONYMS and ! IGNORE_SELF_MX - see conf.h for more details. ! ! This version, John.Forrest@umist.ac.uk December 90 */ ! ! #ifndef NO_WILDCARD_MX ! /* if NO_WILDCARD_MX is undefined, we can only resolve full names. */ ! # define is_full_name(host) (TRUE) ! ! #else ! ! #ifdef TOP_DOMAIN_CLASS ! clear_topdomain = TRUE; ! #endif /* TOP_DOMAIN_CLASS */ ! ! static is_full_name (host) ! char *host; ! { ! char *top_dom; ! ! top_dom = rindex (host, '.'); ! if (top_dom == NULL) ! return FALSE; ! top_dom += 1; ! if (*top_dom == '\0') /* name ends with "." */ ! return TRUE; ! #if defined(TOP_DOMAIN_CLASS) ! { ! STAB *s; ! if (clear_topdomain) /* we know no top domains - have to */ ! return TRUE; /* assume full for safety */ ! /* is it in class TOP_DOMAIN_CLASS ? */ ! s = stab (top_dom, ST_CLASS, ST_FIND); ! return (s != NULL && bitnset(TOP_DOMAIN_CLASS, s->s_class)); ! } ! #else ! return FALSE; ! #endif /* TOP_DOMAIN_CLASS */ ! } ! ! #endif /* !NO_WILDCARD_MX */ ! ! #if defined(TOP_DOMAIN_CLASS) && defined(NO_WILDCARD_MX) && defined(LOG) ! # define CHECK_TOP 1 ! #else ! # define CHECK_TOP 0 ! #endif ! ! #if CHECK_TOP ! ! static check_top(host) ! char *host; ! { ! char *top_dom; ! STAB *s; ! ! ! if ((top_dom = rindex (host, '.')) == NULL) { ! syslog(LOG_WARNING, "Incomplete named found by BIND - %s", ! host); ! return; ! } ! if (clear_topdomain) ! return; ! top_dom += 1; /* skip over '.' */ ! /* is it in class TOP_DOMAIN_CLASS ? */ ! s = stab (top_dom, ST_CLASS, ST_FIND); ! if (s == NULL || ! bitnset(TOP_DOMAIN_CLASS, s->s_class)) ! syslog (LOG_WARNING, "Unknown top domains %s in %s (returned from BIND)", ! top_dom, host); ! } ! ! #endif /* CHECK_TOP */ ! ! #if defined(DONT_DNSRCH) ! # define SEARCH (RES_DEFNAMES) ! #else ! # define SEARCH (RES_DEFNAMES|RES_DNSRCH) ! #endif ! ! # if defined(IGNORE_SELF_MX) ! /* In the case of a host with a MX record pointing at localhost, ! ** another routing method must be used. Examine any MX RRs returned. ! ** If the best one points to localhost, return FALSE. ** ! ** Paul Pomes, University of Illinois, 10-Oct-88 */ + + #define InitPreference 1000 + # endif + getcanonname(host, hbsize) char *host; int hbsize; { register u_char *eom, *cp; ! register int n; HEADER *hp; querybuf answer; u_short type; int first, ancount, qdcount, loopcnt; char nbuf[PACKETSZ]; ! char *wanted_name; ! #ifdef LOOK_FOR_LONGSYNONYMS ! char name_stub [MAXNAME]; ! char *temp; ! #endif ! int must_be_full; ! long keep_res_options; ! int search_failed; ! #ifdef IGNORE_SELF_MX ! u_short MailPreference; char MailAgent[MAXNAME]; char MyName[MAXNAME]; char **MyAliases; extern char **myhostname(); + #endif + #ifdef LOOK_FOR_LONGSYNONYMS + # define no_stub() (*name_stub == '\0') + #else + # define no_stub() (TRUE) + #endif loopcnt = 0; + must_be_full = is_full_name (host); + keep_res_options = _res.options; loop: + wanted_name = host; + #ifdef IGNORE_SELF_MX + MailPreference = InitPreference; + MailAgent[0] = '\0'; + #endif + #ifdef LOOK_FOR_LONGSYNONYMS + strcpy (name_stub, ""); + while (strlen(wanted_name) > 0) { + #endif + search_failed = 0; /* * Use query type of ANY if possible (NO_WILDCARD_MX), which will * find types CNAME, A, and MX, and will cause all existing records *************** *** 238,303 **** * searched, we can't use ANY; it would cause fully-qualified names * to match as names in a local domain. */ ! # ifndef NO_WILDCARD_MX ! _res.options &= ( ~RES_DEFNAMES & 0xffff ) ; ! # endif /* NO_WILDCARD_MX */ ! n = res_search(host, C_IN, T_ANY, (char *)&answer, sizeof(answer)); ! # ifndef NO_WILDCARD_MX ! _res.options |= RES_DEFNAMES ; ! # endif /* NO_WILDCARD_MX */ if (n < 0) { - /* - * If getcanonname() times out we don't really know whether - * the name is good or bad. Give it the benefit of the doubt, - * take it in and sort it out later using getmxrr(). - */ - if (h_errno == TRY_AGAIN) - { - if (tTd(8, 1)) - printf("getcanonname: res_search timed out (errno=%d, h_errno=%d)\n", - errno, h_errno); - return TRUE; - } if (tTd(8, 1)) printf("getcanonname: res_search failed (errno=%d, h_errno=%d)\n", errno, h_errno); ! ! return FALSE; } ! /* find first satisfactory answer */ ! hp = (HEADER *)&answer; ! ancount = ntohs(hp->ancount); ! /* we don't care about errors here, only if we got an answer */ ! if (ancount == 0) { ! if (tTd(8, 1)) ! printf("rcode = %d, ancount=%d\n", hp->rcode, ancount); ! return FALSE; } ! cp = (u_char *)&answer + sizeof(HEADER); ! eom = (u_char *)&answer + n; ! for (qdcount = ntohs(hp->qdcount); qdcount--; cp += n + QFIXEDSZ) ! if ((n = dn_skipname(cp, eom)) < 0) return FALSE; ! /* * just in case someone puts a CNAME record after another record, * check all records for CNAME; otherwise, just take the first * name found. */ ! for (first = 1; --ancount >= 0 && cp < eom; ) { if ((n = dn_expand((char *)&answer, eom, cp, nbuf, sizeof(nbuf))) < 0) break; ! if (first) { /* XXX */ ! (void)strncpy(host, nbuf, hbsize); ! host[hbsize - 1] = '\0'; first = 0; } cp += n; GETSHORT(type, cp); ! cp += sizeof(u_short) + sizeof(u_long); GETSHORT(n, cp); if (type == T_CNAME) { /* --- 323,427 ---- * searched, we can't use ANY; it would cause fully-qualified names * to match as names in a local domain. */ ! if (must_be_full) ! _res.options &= ( ~SEARCH & 0xffff ); ! else ! _res.options |= SEARCH; ! if (tTd(8, 1)) ! printf ("getcanonname: looking for %s (%d %d %x)\n", wanted_name, ! no_stub(), must_be_full, _res.options); /* DEBUG */ ! n = 0; ! if (! no_stub ()) { ! /* if this is true, we are just interested in CNAMES, ! but in BIND4.6 at least, a lookup for CNAME ! seems to produce "delayed" lookup, even with ! RES_RECURSE set. Thus, look on local server for ! CNAME, and if that fails do ANY normally */ ! if (tTd(8, 2)) ! printf ("getcanonname: looking for CNAME\n"); ! _res.options &= ~ RES_RECURSE; ! n = res_search(wanted_name, C_IN, ! T_CNAME, (char *)&answer, sizeof(answer)); ! _res.options |= RES_RECURSE; ! } ! if (n <= 0) { ! if (tTd(8, 2)) ! printf ("getcanonname: looking for ANY\n"); ! n = res_search(wanted_name, C_IN, ! T_ANY, (char *)&answer, sizeof(answer)); ! } ! _res.options = keep_res_options; if (n < 0) { if (tTd(8, 1)) printf("getcanonname: res_search failed (errno=%d, h_errno=%d)\n", errno, h_errno); ! if (h_errno == TRY_AGAIN) /* difficult to know what to do */ ! #ifdef IGNORE_TRYAGAIN ! return TRUE; ! #else ! return FALSE; ! #endif ! search_failed ++; } ! if (!search_failed) { ! /* find first satisfactory answer */ ! hp = (HEADER *)&answer; ! ancount = ntohs(hp->ancount); ! /* we don't care about errors here, only if we got an answer */ ! if (ancount == 0) { ! if (tTd(8, 1)) ! printf("rcode = %d, ancount=%d\n", hp->rcode, ancount); ! search_failed ++; ! } } ! if (!search_failed) { ! cp = (u_char *)&answer + sizeof(HEADER); ! eom = (u_char *)&answer + n; ! for (qdcount = ntohs(hp->qdcount); qdcount--; cp += n + QFIXEDSZ) ! if ((n = dn_skipname(cp, eom)) < 0) ! search_failed ++; ! } ! if (search_failed) ! # ifdef LOOK_FOR_LONGSYNONYMS ! { ! temp = index (wanted_name, '.'); ! if (temp == NULL) return FALSE; ! temp += 1; ! if (*temp == '\0') ! return FALSE; ! strncat (name_stub, wanted_name, temp - wanted_name); ! wanted_name = temp; ! continue; ! } ! # else ! return FALSE; ! # endif /* * just in case someone puts a CNAME record after another record, * check all records for CNAME; otherwise, just take the first * name found. */ ! for (first = 1; --ancount >= 0 && cp < eom; cp += n) { if ((n = dn_expand((char *)&answer, eom, cp, nbuf, sizeof(nbuf))) < 0) break; ! if (first) { /* XXX */ ! /* if ! no_stub() we are only interested in CNAME ! */ ! if (no_stub ()) { ! (void)strncpy(host, nbuf, hbsize); ! host[hbsize - 1] = '\0'; ! #if CHECK_TOP ! check_top (host); ! #endif ! } first = 0; } cp += n; GETSHORT(type, cp); ! cp += sizeof(u_short) + sizeof(u_long); GETSHORT(n, cp); if (type == T_CNAME) { /* *************** *** 308,320 **** if ((n = dn_expand((char *)&answer, eom, cp, nbuf, sizeof(nbuf))) < 0) break; ! /* cp += n; un-used -pbp */ (void)strncpy(host, nbuf, hbsize); /* XXX */ host[hbsize - 1] = '\0'; ! if (++loopcnt > 8) /* never be more than 1 */ return FALSE; goto loop; } else if (type == T_MX) { /* * Be sure that the best MX record doesn't point --- 432,454 ---- if ((n = dn_expand((char *)&answer, eom, cp, nbuf, sizeof(nbuf))) < 0) break; ! #ifdef LOOK_FOR_LONGSYNONYMS ! host [0] = '\0'; ! strncat (host, name_stub, hbsize); ! strncat (host, nbuf, hbsize - strlen (host)); ! #else (void)strncpy(host, nbuf, hbsize); /* XXX */ host[hbsize - 1] = '\0'; ! #endif ! #if CHECK_TOP ! check_top (host); ! #endif ! must_be_full = 1; /* new name is bound to be full */ ! if (++loopcnt > 8) /* never be more than 1 */ return FALSE; goto loop; } + #ifdef IGNORE_SELF_MX else if (type == T_MX) { /* * Be sure that the best MX record doesn't point *************** *** 328,334 **** if ((n = dn_expand((char *)&answer, eom, cp, nbuf, sizeof(nbuf))) < 0) break; - cp += n; if (tTd(8, 1)) printf("getcanonname: MX host %s, preference %d\n", nbuf, preference); --- 462,467 ---- *************** *** 335,349 **** if (preference < MailPreference) { MailPreference = preference; (void) strcpy(MailAgent, nbuf); ! } } ! else ! cp += n; } /* test MailAgent against $j */ if (MailAgent[0] != '\0' && MyHostName != NULL && strcasecmp(MailAgent, MyHostName) == 0) ! return (FALSE); /* test MailAgent against our DNS name and aliases */ if (MailAgent[0] != '\0' && --- 468,495 ---- if (preference < MailPreference) { MailPreference = preference; (void) strcpy(MailAgent, nbuf); ! } } ! #endif /* IGNORE_SELF_MX */ } + #ifdef LOOK_FOR_LONGSYNONYMS + break; + } + #endif + if (tTd(8, 1)) + #ifdef LOOK_FOR_LONGSYNONYMS + printf ("getcanonname: found stub='%s' host='%s'\n", + name_stub, host); + #else + printf ("getcanonname: found '%s'\n", host); + #endif + if (! no_stub()) + return FALSE; + #ifdef IGNORE_SELF_MX /* test MailAgent against $j */ if (MailAgent[0] != '\0' && MyHostName != NULL && strcasecmp(MailAgent, MyHostName) == 0) ! return FALSE; /* test MailAgent against our DNS name and aliases */ if (MailAgent[0] != '\0' && *************** *** 353,362 **** for (; *MyAliases != NULL; MyAliases++) if (strcasecmp(MailAgent, *MyAliases) == 0) return FALSE; - return TRUE; } ! else ! return TRUE; } #else /* !NAMED_BIND */ --- 499,507 ---- for (; *MyAliases != NULL; MyAliases++) if (strcasecmp(MailAgent, *MyAliases) == 0) return FALSE; } ! #endif /* IGNORE_SELF_MX */ ! return TRUE; } #else /* !NAMED_BIND */ *************** *** 371,382 **** hp = gethostbyname(host); if (hp == NULL) ! return; if (strlen(hp->h_name) >= hbsize) ! return; (void) strcpy(host, hp->h_name); } #endif /* !NAMED_BIND */ --- 516,529 ---- hp = gethostbyname(host); if (hp == NULL) ! return FALSE; if (strlen(hp->h_name) >= hbsize) ! return FALSE; (void) strcpy(host, hp->h_name); + + return TRUE; } #endif /* !NAMED_BIND */ *** /tmp/,RCSt1a05356 Thu Dec 20 23:59:35 1990 --- readcf.c Thu Dec 20 23:56:47 1990 *************** *** 177,182 **** --- 177,188 ---- case 'C': /* word class */ case 'F': /* word class from file */ + #if defined(TOP_DOMAIN_CLASS) && defined(NAMED_BIND) && defined(NO_WILDCARD_MX) + if (buf[1] == TOP_DOMAIN_CLASS) { + extern clear_topdomain; + clear_topdomain = FALSE; + } + #endif /* read list of words from argument or file */ if (buf[0] == 'F') { *************** *** 784,790 **** case 'D': /* rebuild alias database as needed */ AutoRebuild = atobool(val); ! #if defined(apollo) /* * Apollo cannot handle multiple processes (perhaps on * separate nodes) opening the alias database read-write. --- 790,798 ---- case 'D': /* rebuild alias database as needed */ AutoRebuild = atobool(val); ! #if defined(apollo) && !defined(APOLLO_CAN_UPDATE) ! /* jf 12/90 - see note in conf.h about alternative solution ! to this problem. */ /* * Apollo cannot handle multiple processes (perhaps on * separate nodes) opening the alias database read-write. *** /tmp/,RCSt1a05356 Fri Dec 21 00:00:23 1990 --- util.c Thu Dec 20 23:57:18 1990 *************** *** 504,509 **** --- 504,513 ---- #define SMTPLINELIM 990 /* maximum line length */ + #if defined(DOPRNT_FIX) + /* this is the putline from Berkeley 5.65, which seems */ + /* more reliable that the original IDA 5.65 version below */ + putline(l, fp, m) register char *l; FILE *fp; *************** *** 511,516 **** --- 515,575 ---- { register char *p; char svchar; + + /* strip out 0200 bits -- these can look like TELNET protocol */ + if (bitnset(M_LIMITS, m->m_flags)) + { + p = l; + while ((*p++ &= ~0200) != 0) + continue; + } + + do + { + /* find the end of the line */ + p = index(l, '\n'); + if (p == NULL) + p = &l[strlen(l)]; + + /* check for line overflow */ + while ((p - l) > SMTPLINELIM && bitnset(M_LIMITS, m->m_flags)) + { + register char *q = &l[SMTPLINELIM - 1]; + + svchar = *q; + *q = '\0'; + if (l[0] == '.' && bitnset(M_XDOT, m->m_flags)) + (void) putc('.', fp); + fputs(l, fp); + (void) putc('!', fp); + fputs(m->m_eol, fp); + *q = svchar; + l = q; + } + + /* output last part */ + svchar = *p; + *p = '\0'; + if (l[0] == '.' && bitnset(M_XDOT, m->m_flags)) + (void) putc('.', fp); + fputs(l, fp); + fputs(m->m_eol, fp); + *p = svchar; + l = p; + if (*l == '\n') + l++; + } while (l[0] != '\0'); + } + + #else /* DOPRNT_FIX */ + + putline(l, fp, m) + register char *l; + FILE *fp; + MAILER *m; + { + register char *p; + char svchar; int limitsflag, xdotflag; limitsflag = bitnset(M_LIMITS, m->m_flags); *************** *** 548,553 **** --- 607,614 ---- l++; } while (*l != '\0'); } + + #endif /* DOPRNT_FIX */ \f /* ** XUNLINK -- unlink a file, doing logging as appropriate. **