Annotation of 43BSDTahoe/new/xns/examples/ch/registerhost.c, revision 1.1.1.1

1.1       root        1: /* $Header: registerhost.c,v 2.5 87/04/01 11:48:11 jqj Exp $ */
                      2: 
                      3: /*
                      4:  * This program enters a Unix host into the Clearinghouse as a server and
                      5:  * workstation, hence eligible for gap telnet 
                      6:  */
                      7: /*
                      8:  * $Log:       registerhost.c,v $
                      9:  * Revision 2.5  87/04/01  11:48:11  jqj
                     10:  * merged Webster changes: added -f switch for registering as file service
                     11:  * 
                     12:  * Revision 2.4  87/02/19  13:29:59  jqj
                     13:  * If hostname() returns a fully qualified Internet domain name, use only
                     14:  * the leaf (first) componenent.
                     15:  * 
                     16:  * Revision 2.3  86/12/15  11:27:06  jqj
                     17:  * rework address code to permit multihomed hosts.
                     18:  * 
                     19:  * Revision 2.2  86/05/07  14:05:27  jqj
                     20:  * eliminated use of ns_netof, since it has alignment problems on Gould
                     21:  * 
                     22:  * Revision 2.1  85/12/17  10:25:34  jqj
                     23:  * from Sklower:  default to our address as set by ifconfig
                     24:  * 
                     25:  * Revision 2.0  85/11/21  07:22:36  jqj
                     26:  * 4.3BSD standard release
                     27:  * 
                     28:  * Revision 1.1  85/11/20  13:54:08  jqj
                     29:  * Initial revision
                     30:  * 
                     31:  */
                     32: 
                     33: #include <stdio.h>
                     34: #include <sys/types.h>
                     35: #include <netns/ns.h>
                     36: #include "Clearinghouse2_defs.h"
                     37: #include <xnscourier/CHEntries.h>
                     38: #include <xnscourier/CH.h>
                     39: #include <xnscourier/except.h>
                     40: 
                     41: 
                     42: 
                     43: char *
                     44: ItemToString(item)
                     45:        Item item;
                     46: {
                     47:        char *strval;
                     48: 
                     49:        Unspecified buf[501], *bp;
                     50:        Cardinal len;
                     51: 
                     52:        externalize_Item(&item, buf);
                     53:        bp = buf;
                     54:        bp += internalize_Cardinal(&len, bp);
                     55:        bp += internalize_String(&strval, bp);  
                     56:        return(strval);
                     57: }
                     58: 
                     59: Item
                     60: StringToItem(strval)
                     61:        String strval;
                     62: {
                     63:        Unspecified buf[501], *bp;
                     64:        Item item;
                     65:        Cardinal len;
                     66: 
                     67:        bp = buf + sizeof_Cardinal(len);
                     68:        len = externalize_String(&strval, bp);
                     69:        (void) externalize_Cardinal(&len, buf);
                     70:        internalize_Item(&item, buf);
                     71:        return(item);
                     72: }
                     73: 
                     74: int
                     75: isprop(prop, proplist)
                     76:        Property prop;
                     77:        Properties proplist;
                     78: {
                     79:        int i;
                     80: 
                     81:        prop = prop<<16;        /* correct for bug in Clearinghouse v 2 */
                     82:        for (i=0; i < proplist.length; i++) {
                     83:                if (proplist.sequence[i] == prop) return(1);
                     84:        }
                     85:        return(0);              /* not found */
                     86: }
                     87: 
                     88: char *
                     89: XNSaddrToString(addr)
                     90:        struct ns_addr *addr;
                     91: {
                     92:        u_char *s;
                     93:        static char buf[21];
                     94:        union {
                     95:                u_short y_net[2];
                     96:                u_long y_long;
                     97:        } netvalue;
                     98: 
                     99:        s = addr->x_host.c_host;
                    100:        netvalue.y_net[0] = addr->x_net.s_net[0];
                    101:        netvalue.y_net[1] = addr->x_net.s_net[1];
                    102:        sprintf(buf,"%lx#%x.%x.%x.%x.%x.%x#%x",
                    103:                ntohl(netvalue.y_long),
                    104:                s[0], s[1], s[2], s[3], s[4], s[5],
                    105:                ntohs(addr->x_port));
                    106:        return(buf);
                    107: }
                    108: 
                    109: 
                    110: addNAelem(nalistp, addr)
                    111:        NetworkAddressList *nalistp;
                    112:        struct ns_addr *addr;
                    113: {
                    114:        register NetworkAddress *naddrp;
                    115:        
                    116:        naddrp = nalistp->sequence + nalistp->length;                   
                    117:        nalistp->length++;
                    118:        naddrp->network[0] = htons(addr->x_net.s_net[0]);
                    119:        naddrp->network[1] = htons(addr->x_net.s_net[1]);
                    120:        naddrp->host[0] = htons(addr->x_host.s_host[0]);
                    121:        naddrp->host[1] = htons(addr->x_host.s_host[1]);
                    122:        naddrp->host[2] = htons(addr->x_host.s_host[2]);
                    123: }
                    124: 
                    125: Item
                    126: getaddresslist(myaddr)
                    127:        struct ns_addr *myaddr;
                    128: {
                    129:        char addrstr[200];
                    130:        struct ns_addr addr;
                    131:        extern struct ns_addr ns_addr();
                    132:        NetworkAddressList nalist;
                    133:        Unspecified buf[501], *bp;
                    134:        Item item;
                    135:        Cardinal len;
                    136:        NetworkAddress naddrs[10];
                    137:        
                    138:        nalist.length = 0;
                    139:        nalist.sequence = naddrs;
                    140:        printf("NS address (e.g. 2-273#2-613-688-939-672, - for default, CR to end):\nPrimary NS address: ");
                    141:        
                    142:        /* get list of addresses */
                    143:        gets(addrstr);
                    144:        while (*addrstr != 0) {
                    145:                if (*addrstr=='-') {
                    146:                        addNAelem(&nalist, myaddr);
                    147:                } else {
                    148:                        addr = ns_addr(addrstr);
                    149:                        addNAelem(&nalist, &addr);
                    150:                }
                    151:                printf("Additional NS address (CR for none): ");
                    152:                gets(addrstr);
                    153:        }
                    154:        
                    155:        /* canonicalize socket #s */
                    156:        for (len = 0; len < nalist.length; len++)
                    157:                nalist.sequence[len].socket = 0;
                    158:                
                    159:        /* encode */
                    160:        bp = buf + sizeof_Cardinal(len);
                    161:        len = externalize_NetworkAddressList(&nalist, bp);
                    162:        (void) externalize_Cardinal(&len, buf);
                    163:        internalize_Item(&item, buf);
                    164:        return(item);
                    165: }
                    166: 
                    167: main(argc, argv)
                    168:        int argc;
                    169:        char *argv[];
                    170: {
                    171:        ObjectName myname, name, defname, fsname;
                    172:        struct ns_addr *destaddr, *getXNSaddr(), *myaddr;
                    173:        struct sockaddr_ns sns;
                    174:        Authenticator agent;
                    175:        CourierConnection *conn;
                    176:        int i;
                    177:        ListPropertiesResults LPresult;
                    178:        RetrieveItemResults RIresult;
                    179:        ChangeItemResults CIresult;
                    180:        AddItemPropertyResults AIPresult;
                    181:        char *pwd, *propval, *getXNSpass(), *malloc(), *gets(), 
                    182:                mystrname[200], *myhostname;
                    183:        String ItemToString();
                    184:        Item item, StringToItem(), addrToItem();
                    185:        Property propnum;
                    186:        struct ns_addr *addr;
                    187:        static Boolean authseq[2] = {1, 0};     /* simple, not strong */
                    188:        Boolean fileservice= 0;
                    189:        int opt;
                    190:        extern int optind;
                    191:        extern char *optarg;
                    192: 
                    193:        if (argc < 1 || argc > 5) {
                    194:                fprintf(stderr,"Usage: %s [-f] [hostname]\n",argv[0]);
                    195:                exit(1);
                    196:        }
                    197:        while ( (opt= getopt(argc, argv, "f")) != EOF )
                    198:                switch (opt) {
                    199:                        case 'f' :
                    200:                                fileservice++;
                    201:                                break;
                    202: 
                    203:                        default :
                    204:                                fprintf(stderr,  "Invalid command option -%c\n", opt);
                    205:                                exit(1);
                    206:                }
                    207:        CH_NameDefault(&defname);
                    208:        if (argc == optind) {
                    209:            char *tmp; extern char *index();
                    210:            gethostname(myhostname=malloc(100), 100);
                    211:            if ((tmp = index(myhostname,'.')) != NULL)
                    212:                *tmp = '\0';
                    213:            name = CH_StringToName(myhostname, &defname);
                    214:        } else
                    215:            name = CH_StringToName(argv[optind], &defname);
                    216:        printf("Registering host %s\n",
                    217:                CH_NameToString(name) );
                    218:        printf("XNS UserName: ");
                    219:        gets(mystrname);
                    220:        myname = CH_StringToName(mystrname, &name);
                    221:        pwd = getXNSpass("Password:");
                    222:        MakeSimpleCredsAndVerifier(&myname,pwd,
                    223:                        &agent.credentials, &agent.verifier);
                    224:        conn = CH_GetFirstCH();
                    225:        i = sizeof(sns); myaddr = &sns.sns_addr;
                    226:        getsockname(*(int *)conn, &sns, &i); myaddr->x_port = 0;
                    227:        DURING {
                    228:                LPresult = ListProperties(conn,NULL,name,agent);
                    229:        } HANDLER {
                    230:                if (Exception.Code == ArgumentError) {
                    231:                  DURING CreateObject(conn,NULL,name,agent);
                    232:                  HANDLER {
                    233:                        fprintf(stderr,"Can't create object. Error %d\n",
                    234:                                Exception.Code);
                    235:                        exit(1);
                    236:                  } END_HANDLER;
                    237:                  LPresult.properties.length = 0;
                    238:                }
                    239:                else {
                    240:                  fprintf(stderr,"ListProperties failed.  Error %d\n",
                    241:                        Exception.Code);
                    242:                  exit(1);
                    243:                }
                    244:        } END_HANDLER;
                    245:        /* AddressList property */
                    246:        if (isprop(4,LPresult.properties)) {
                    247:                addr = CH_LookupAddr(name,4);
                    248:                if (addr==0) {
                    249:                    fprintf(stderr,"NetworkAddress is in property list, but CH_LookupAddr failed\n");
                    250:                    exit(1);
                    251:                }
                    252:                printf("Old address: %s\n",XNSaddrToString(addr));
                    253:                myaddr->x_port = 0;
                    254:                item = getaddresslist(myaddr);
                    255:                DURING CIresult = ChangeItem(conn,NULL, name,4,item,agent);
                    256:                HANDLER {
                    257:                  fprintf(stderr,"Can't change address.  Error %d\n",
                    258:                         Exception.Code);
                    259:                  exit(1);
                    260:                } END_HANDLER;
                    261:        } else {
                    262:                item = getaddresslist(myaddr);
                    263:                DURING
                    264:                  AIPresult = AddItemProperty(conn,NULL,name,4,item,agent);
                    265:                HANDLER {
                    266:                  fprintf(stderr,"Can't add address property.  Error %d\n",
                    267:                        Exception.Code);
                    268:                  exit(1);
                    269:                } END_HANDLER;
                    270:        }
                    271:        /* AuthenticationLevel property */
                    272:        if (!isprop(8,LPresult.properties)) {
                    273:                item.length = 2;
                    274:                item.sequence = (Unspecified *) authseq;
                    275:                DURING
                    276:                  AIPresult = AddItemProperty(conn,NULL,name,8,item,agent);
                    277:                HANDLER {
                    278:                  fprintf(stderr,"Can't add AuthenticationLevel property.\n");
                    279:                  exit(1);
                    280:                } END_HANDLER;
                    281:        }
                    282:        /* description */
                    283:        DURING {
                    284:                propnum = 10005; /* 10005<<16; */
                    285:                if (isprop(propnum,LPresult.properties)) {
                    286:                        RIresult = RetrieveItem(conn, NULL,
                    287:                                        name,
                    288:                                        propnum, agent);
                    289:                        propval = ItemToString(RIresult.value);
                    290:                        printf("Workstation description (Property 10005) has value ``%s''\n",
                    291:                               propval );
                    292:                        clear_RetrieveItemResults(&RIresult);
                    293:                }
                    294:                propnum = 10024; /* 10024<<16; */
                    295:                if (isprop(propnum,LPresult.properties)) {
                    296:                        RIresult = RetrieveItem(conn, NULL,
                    297:                                        name,
                    298:                                        propnum, agent);
                    299:                        propval = ItemToString(RIresult.value);
                    300:                        printf("Server description (Property 10024) has value ``%s''\nNew value: ",
                    301:                               propval );
                    302:                        propval = gets(malloc(100));
                    303:                        item = StringToItem(propval);
                    304:                        CIresult = ChangeItem(conn, NULL,
                    305:                                        name,
                    306:                                        propnum, item, agent);
                    307:                        clear_RetrieveItemResults(&RIresult);
                    308:                } else {
                    309:                        printf("Enter new description: ");
                    310:                        propval = gets(malloc(100));
                    311:                        item = StringToItem(propval);
                    312:                        AIPresult = AddItemProperty(conn, NULL,
                    313:                                        name,
                    314:                                        propnum, item, agent);
                    315:                }
                    316:                if ( fileservice ) {
                    317:                        propnum= 10000; /* 10000<<16 */
                    318:                        if (isprop(10000,LPresult.properties)) {
                    319:                                RIresult = RetrieveItem(conn, NULL,
                    320:                                                name,
                    321:                                                propnum, agent);
                    322:                                propval = ItemToString(RIresult.value);
                    323:                                printf("FileService description (Property 10000) has value ``%s''\nNew value: ",
                    324:                                       propval );
                    325:                                propval = gets(malloc(100));
                    326:                                item = StringToItem(propval);
                    327:                                CIresult = ChangeItem(conn, NULL,
                    328:                                                name,
                    329:                                                propnum, item, agent);
                    330:                        } else {
                    331:                                printf("Enter new FileService description: ");
                    332:                                propval = gets(malloc(100));
                    333:                                item = StringToItem(propval);
                    334:                                AIPresult = AddItemProperty(conn, NULL,
                    335:                                                name,
                    336:                                                propnum, item, agent);
                    337:                        }
                    338:                }
                    339:        } HANDLER {
                    340:                fprintf(stderr,
                    341:                        "Error during Property manipulations, %d (%d)\n",
                    342:                        Exception.Code,
                    343:                        CourierErrArgs(Clearinghouse2_CallErrorArgs,problem) );
                    344:        } END_HANDLER;
                    345: }
                    346: 

unix.superglobalmegacorp.com

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