Annotation of 43BSD/contrib/xns/morexnslib/ch/CHlookup.c, revision 1.1.1.1

1.1       root        1: /* $Header: CHlookup.c,v 2.0 85/11/21 07:22:32 jqj Exp $ */
                      2: 
                      3: /* contains:
                      4:  * CH_LookupAddr
                      5:  * CH_GetFirstCH
                      6:  * CH_GetOtherCH
                      7:  * CH_NameDefault
                      8:  */
                      9: 
                     10: /* $Log:       CHlookup.c,v $
                     11:  * Revision 2.0  85/11/21  07:22:32  jqj
                     12:  * 4.3BSD standard release
                     13:  * 
                     14:  * Revision 1.3  85/11/21  07:14:19  jqj
                     15:  * 4.3BSD standard release
                     16:  * 
                     17:  * Revision 1.2  85/10/21  12:41:55  jqj
                     18:  * Gould version:  work around a Gould compiler bug.  Default to /usr/new
                     19:  * for consistency.
                     20:  * 
                     21:  * Revision 1.1  85/10/18  09:14:53  jqj
                     22:  * Initial revision
                     23:  * 
                     24:  * Revision 1.1  85/03/26  06:27:00  jqj
                     25:  * Initial revision
                     26:  * 
                     27:  */
                     28: #include <stdio.h>
                     29: #include <sys/types.h>
                     30: #include <netns/ns.h>
                     31: #include <xnscourier/Clearinghouse2.h>
                     32: #include <xnscourier/CHEntries.h>
                     33: #include <xnscourier/except.h>
                     34: #define MAXPACKS 5
                     35: #define NLSIZE 50
                     36: 
                     37: static Clearinghouse2_ObjectName *namelist[NLSIZE];
                     38: static int nlcount = 0;
                     39: 
                     40: static Cardinal nullpasswd = 0;
                     41: static Clearinghouse2_Authenticator nullagent = {{0,{0,0}},{1,&nullpasswd}};
                     42: 
                     43: static
                     44: GetData(conn)
                     45:        CourierConnection *conn;
                     46: {
                     47:        int count, i;
                     48:        Unspecified buffer[MAXWORDS*MAXPACKS], *bp, *bufend;
                     49:        Clearinghouse2_StreamOfObjectName obnames;
                     50:        
                     51:        bufend = buffer;
                     52:        bp = buffer+((MAXWORDS-1)*MAXPACKS);    /* end of available space */
                     53:        while (count = BDTread(conn, (char*)bufend, 
                     54:                                MAXWORDS*sizeof(Unspecified))
                     55:                ) {
                     56:                bufend += count/sizeof(Unspecified);
                     57:                if (bufend > bp) {
                     58:                        fprintf(stderr,"BDT read too big to fit\n");
                     59:                        BDTabort(conn);
                     60:                        /* should clear out stuff here if we knew how much */
                     61:                }
                     62:        }
                     63:        bp = buffer;
                     64:        while (bp < bufend) {
                     65:                bp += internalize_Clearinghouse2_StreamOfObjectName(&obnames,bp);
                     66:                if (0 == (int) obnames.designator) {
                     67:                   for (i = 0; i < obnames.nextSegment_case.segment.length; i++)
                     68:                        if (nlcount < NLSIZE) namelist[nlcount++] =
                     69:                                &obnames.nextSegment_case.segment.sequence[i];
                     70:                } else {
                     71:                   for (i = 0; i < obnames.lastSegment_case.length; i++)
                     72:                        if (nlcount < NLSIZE) namelist[nlcount++] =
                     73:                                &obnames.lastSegment_case.sequence[i];
                     74:                   return;
                     75:                }
                     76:        }
                     77: }
                     78: 
                     79: static struct ns_addr*
                     80: itemtonsaddr(itemptr)
                     81:        Clearinghouse2_Item *itemptr;   /* i.e. a sequence of Unspecified */
                     82: {
                     83:        static union {
                     84:                struct ns_addr addr;
                     85:                u_short shrt[6];
                     86:        } result;
                     87:        register int i;
                     88:        register Unspecified *seq;
                     89: 
                     90:        if (itemptr->length < 7)
                     91:                return(0);
                     92: 
                     93:        seq = itemptr->sequence +1;
                     94:        /* itemptr->sequence[0] == number of addresses */
                     95:        for (i = 0; i < 6; i++, seq++)
                     96:                result.shrt[i] = ntohs(*seq);
                     97:        return(&result.addr);
                     98: }
                     99: 
                    100: /*
                    101:  * path to look for the addresses file on
                    102:  * (I wish I'd picked a shorter name, so we could rendezvous in /etc.
                    103:  *  But long file names in /etc are very unpopular!).
                    104:  */
                    105: static char *chaddrpath[] = {
                    106: #ifdef CHADDRS
                    107:                        CHADDRS,
                    108: #endif
                    109:                        "/usr/new/lib/xnscourier/clearinghouse.addresses",
                    110:                        "/etc/clearinghouse.addresses",
                    111:                        "/usr/local/lib/xnscourier/clearinghouse.addresses",
                    112:                        0 };
                    113: 
                    114: 
                    115: /*
                    116:  * Set defaults for organization and domain, based on the file
                    117:  * /usr/local/lib/xnscourier/clearinghouse.addresses
                    118:  * (should get the local clearinghouse and set defaults based on
                    119:  * ListDomainsServed
                    120:  */
                    121: CH_NameDefault(defaultobjnamep)
                    122:        Clearinghouse2_ObjectName *defaultobjnamep;
                    123: {
                    124:        FILE *chfile;
                    125:        int i, nmatch;
                    126:        static char orgbuf[21], domainbuf[21];
                    127:        
                    128:        defaultobjnamep->object = "";
                    129:        for (i=0; chaddrpath[i] != NULL; i++) {
                    130:                chfile = fopen(chaddrpath[i],"r");
                    131:                if (chfile != (FILE*)0) {
                    132:                        nmatch = fscanf(chfile,"%*[^ \t\n] \":%[^:]:%[^\"]",
                    133:                                        domainbuf, orgbuf);
                    134:                        fclose(chfile);
                    135:                        if (nmatch == 2) {
                    136:                                defaultobjnamep->domain = domainbuf;
                    137:                                defaultobjnamep->organization = orgbuf;
                    138:                                return; /* done */
                    139:                        }
                    140:                }
                    141:        }
                    142:        defaultobjnamep->organization = "";
                    143:        defaultobjnamep->domain = "";
                    144: }
                    145: 
                    146: 
                    147: CourierConnection*
                    148: CH_GetFirstCH()
                    149: {
                    150:        struct ns_addr *chaddr;
                    151:        extern struct ns_addr *getXNSaddr();
                    152:        char buf[BUFSIZ];
                    153:        CourierConnection *result;
                    154:        FILE *chfile;
                    155:        int i;
                    156: 
                    157:        /* for now, use hard-coded CH */
                    158:        /* eventually we'll do an expanding-ring or something */
                    159:        result = (CourierConnection *) NULL;
                    160:        for (i = 0; chaddrpath[i] != NULL; i++) {
                    161:                if ((chfile = fopen(chaddrpath[i],"r")) != NULL) {
                    162:                        while (fgets(buf, BUFSIZ, chfile))
                    163:                                if ((chaddr = getXNSaddr(buf)) &&
                    164:                                    (result = CourierOpen(chaddr))) {
                    165:                                        fclose(chfile);
                    166:                                        return(result);
                    167:                                }
                    168:                        fclose(chfile);
                    169:                        break;  /* don't look for other files */
                    170:                }
                    171:        }
                    172:        /* try expanding-ring here */
                    173:        return(result);
                    174: }
                    175: 
                    176: CourierConnection *
                    177: CH_GetOtherCH(conn,hint)
                    178:        CourierConnection *conn;
                    179:        Clearinghouse2_ObjectName hint;
                    180: {
                    181:        struct ns_addr *ch2addr;
                    182:        CourierConnection *ch2conn;
                    183:        Clearinghouse2_RetrieveItemResults riresult;
                    184:        Clearinghouse2_RetrieveMembersResults rmresult;
                    185:        int i;
                    186: 
                    187:        Clearinghouse2_Property clearinghouseNames = 3;
                    188:        Clearinghouse2_Property clearinghouseAddresses = 4;
                    189:        Clearinghouse2_ObjectName hint1;
                    190: 
                    191:        DURING
                    192:                /* get list of possible other clearinghouses */
                    193:                rmresult = Clearinghouse2_RetrieveMembers(conn, GetData, hint, 
                    194:                        clearinghouseNames, BulkData1_immediateSink,
                    195:                        nullagent);
                    196:        HANDLER {
                    197:                /* some race condition */
                    198:                return(NULL);
                    199:        } END_HANDLER;
                    200:        /* throw away the distinguished name, which we don't need */
                    201:        clear_Clearinghouse2_RetrieveMembersResults(&rmresult);
                    202:        /* for each member of potentials list, probe it */
                    203:        ch2conn = NULL;
                    204:        for (i = 0; i < nlcount; i++) {
                    205:                Clearinghouse2_ObjectName thisname;
                    206:                thisname = *namelist[i];
                    207:                /* get its address */
                    208:                DURING
                    209:                        riresult = Clearinghouse2_RetrieveItem(conn, NULL, 
                    210:                                thisname,
                    211:                                clearinghouseAddresses, nullagent);
                    212:                HANDLER
                    213:                        continue;       /* try next in namelist */
                    214:                END_HANDLER;
                    215:                ch2addr = itemtonsaddr(&riresult.value);
                    216:                clear_Clearinghouse2_RetrieveItemResults(&riresult);
                    217:                ch2conn = CourierOpen(ch2addr);
                    218:                if (ch2conn == NULL) continue;
                    219:                /* make sure the second CH is really there */
                    220:                DURING
                    221:                        (void) Clearinghouse2_RetrieveAddresses(ch2conn, NULL);
                    222:                HANDLER {
                    223:                        CourierClose(ch2conn);
                    224:                        ch2conn = NULL;
                    225:                        continue;
                    226:                } END_HANDLER;
                    227:                /* we got it! */
                    228:                break;
                    229:        }
                    230:        for (i = 0; i < nlcount; i++) {
                    231:                        /* free namelist[i] components */
                    232:                        clear_Clearinghouse2_ObjectName(namelist[i]);
                    233:                        /* free the top level thing too */
                    234:                        Deallocate((Unspecified*) namelist[i]);
                    235:                }
                    236:        return(ch2conn);
                    237: }
                    238: 
                    239: /*
                    240:  * Given a Clearinghouse three part name (possibly containing wild cards)
                    241:  * and the property number on which a NetworkAddress is expected to occur,
                    242:  * returns the ns_addr structure associated with that name.
                    243:  * Note that the ns_addr structure is statically allocated!
                    244:  * Resets pattern to be the distinguished name of the object found.
                    245:  */
                    246: struct ns_addr *
                    247: CH_LookupAddr(pattern,property)
                    248:        Clearinghouse2_ObjectNamePattern pattern;
                    249:        Clearinghouse2_Property property;
                    250: {
                    251:        struct ns_addr* CH_LookupAddrDN();
                    252:        return(CH_LookupAddrDN(pattern,property,0,0));
                    253: }
                    254: 
                    255: /*
                    256:  * Lookup a clearinghouse address, returning the address and the
                    257:  * distinguished name of the object found.
                    258:  */
                    259: struct ns_addr *
                    260: CH_LookupAddrDN(pattern,property,distnamep,distnamelen)
                    261:        Clearinghouse2_ObjectNamePattern pattern;
                    262:        Clearinghouse2_Property property;
                    263:        char *distnamep;
                    264:        int distnamelen;
                    265: {
                    266:        struct ns_addr *chaddr, *resultaddr;
                    267:        CourierConnection *conn, *ch2conn;
                    268:        Clearinghouse2_ObjectName hint;         /* from WrongServer errors */
                    269:        Clearinghouse2_RetrieveItemResults riresult;
                    270: 
                    271: 
                    272:        if ((long) property <= 0)       /* default to addressList i.e. 4 */
                    273:                property = CHEntries0_addressList;
                    274:        if (pattern.object == NULL ||
                    275:            pattern.domain == NULL ||
                    276:            pattern.organization == NULL)
                    277:                return(NULL);                   /* can't handle defaults */
                    278:        
                    279:        if ((conn = CH_GetFirstCH()) == NULL) {
                    280:                fprintf(stderr,"Can't open connection to local Clearinghouse\n");
                    281:                exit(1);
                    282:        }
                    283:        /* ask our primary clearinghouse for the address of this thing */
                    284:        DURING {
                    285:                riresult = Clearinghouse2_RetrieveItem(conn, NULL,
                    286:                                pattern, property, nullagent);
                    287:        } HANDLER {
                    288:                if (Exception.Code != Clearinghouse2_WrongServer) {
                    289:                        CourierClose(conn);
                    290:                        return(0);      /* some random error */
                    291:                }
                    292:                hint = CourierErrArgs(Clearinghouse2_WrongServerArgs, hint);
                    293:                ch2conn = CH_GetOtherCH(conn, hint);
                    294:                CourierClose(conn);
                    295:                if (ch2conn == NULL) return(0);
                    296:                conn = ch2conn;
                    297:                /* probe the second clearinghouse */
                    298:                DURING
                    299:                        riresult = Clearinghouse2_RetrieveItem(conn, NULL,
                    300:                                pattern, property, nullagent);
                    301:                HANDLER {
                    302:                        /* should be smarter if WrongServer here */
                    303:                        CourierClose(conn);
                    304:                        return(0);
                    305:                } END_HANDLER;
                    306:                /* we got it */
                    307:        } END_HANDLER;
                    308:        resultaddr = itemtonsaddr(&riresult.value);
                    309:        if (distnamep != NULL &&
                    310:            distnamelen >= (2+strlen(riresult.distinguishedObject.object)+
                    311:                            strlen(riresult.distinguishedObject.domain)+
                    312:                            strlen(riresult.distinguishedObject.organization)))
                    313:                sprintf(distnamep,"%s:%s:%s",
                    314:                        riresult.distinguishedObject.object,
                    315:                        riresult.distinguishedObject.domain,
                    316:                        riresult.distinguishedObject.organization);
                    317:        clear_Clearinghouse2_RetrieveItemResults(&riresult);
                    318:        CourierClose(conn);
                    319:        return(resultaddr);
                    320: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.