Annotation of 43BSD/contrib/xns/examples/ch/registerhost.c, revision 1.1

1.1     ! root        1: /* $Header: registerhost.c,v 2.0a 85/11/21 07:22:36 jqj,sklower 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.0  85/11/21  07:22:36  jqj
        !            10:  * 4.3BSD standard release
        !            11:  * 
        !            12:  * Revision 1.1  85/11/20  13:54:08  jqj
        !            13:  * Initial revision
        !            14:  * 
        !            15:  */
        !            16: 
        !            17: #include <stdio.h>
        !            18: #include <sys/types.h>
        !            19: #include <netns/ns.h>
        !            20: #include "Clearinghouse2_defs.h"
        !            21: #include <xnscourier/CHEntries.h>
        !            22: #include <xnscourier/CH.h>
        !            23: #include <xnscourier/except.h>
        !            24: 
        !            25: 
        !            26: 
        !            27: char *
        !            28: ItemToString(item)
        !            29:        Item item;
        !            30: {
        !            31:        char *strval;
        !            32: 
        !            33:        Unspecified buf[501], *bp;
        !            34:        Cardinal len;
        !            35: 
        !            36:        externalize_Item(&item, buf);
        !            37:        bp = buf;
        !            38:        bp += internalize_Cardinal(&len, bp);
        !            39:        bp += internalize_String(&strval, bp);  
        !            40:        return(strval);
        !            41: }
        !            42: 
        !            43: Item
        !            44: StringToItem(strval)
        !            45:        String strval;
        !            46: {
        !            47:        Unspecified buf[501], *bp;
        !            48:        Item item;
        !            49:        Cardinal len;
        !            50: 
        !            51:        bp = buf + sizeof_Cardinal(len);
        !            52:        len = externalize_String(&strval, bp);
        !            53:        (void) externalize_Cardinal(&len, buf);
        !            54:        internalize_Item(&item, buf);
        !            55:        return(item);
        !            56: }
        !            57: 
        !            58: Item
        !            59: addrToItem(addr)
        !            60:        struct ns_addr *addr;
        !            61: {
        !            62:        Unspecified buf[501], *bp;
        !            63:        Item item;
        !            64:        Cardinal len;
        !            65:        NetworkAddressList nalist;
        !            66:        NetworkAddress naddr;
        !            67: 
        !            68:        nalist.length = 1;
        !            69:        nalist.sequence = &naddr;
        !            70:        naddr.network[0] = htons(addr->x_net.s_net[0]);
        !            71:        naddr.network[1] = htons(addr->x_net.s_net[1]);
        !            72:        naddr.host[0] = htons(addr->x_host.s_host[0]);
        !            73:        naddr.host[1] = htons(addr->x_host.s_host[1]);
        !            74:        naddr.host[2] = htons(addr->x_host.s_host[2]);
        !            75:        naddr.socket = 0;
        !            76:        
        !            77:        bp = buf + sizeof_Cardinal(len);
        !            78:        len = externalize_NetworkAddressList(&nalist, bp);
        !            79:        (void) externalize_Cardinal(&len, buf);
        !            80:        internalize_Item(&item, buf);
        !            81:        return(item);
        !            82: }
        !            83: 
        !            84: int
        !            85: isprop(prop, proplist)
        !            86:        Property prop;
        !            87:        Properties proplist;
        !            88: {
        !            89:        int i;
        !            90: 
        !            91:        prop = prop<<16;        /* correct for bug in Clearinghouse v 2 */
        !            92:        for (i=0; i < proplist.length; i++) {
        !            93:                if (proplist.sequence[i] == prop) return(1);
        !            94:        }
        !            95:        return(0);              /* not found */
        !            96: }
        !            97: 
        !            98: char *
        !            99: XNSaddrToString(addr)
        !           100:        struct ns_addr *addr;
        !           101: {
        !           102:        u_char *s;
        !           103:        static char buf[21];
        !           104: 
        !           105:        s = addr->x_host.c_host;
        !           106:        sprintf(buf,"%lx#%x.%x.%x.%x.%x.%x#%x",
        !           107:                ntohl(ns_netof(*addr)),
        !           108:                s[0], s[1], s[2], s[3], s[4], s[5],
        !           109:                ntohs(addr->x_port));
        !           110:        return(buf);
        !           111: }
        !           112: 
        !           113: 
        !           114: main(argc, argv)
        !           115:        int argc;
        !           116:        char *argv[];
        !           117: {
        !           118:        ObjectName myname, name, defname;
        !           119:        struct ns_addr *destaddr, *getXNSaddr(), *myaddr;
        !           120:        struct sockaddr_ns sns;
        !           121:        Authenticator agent;
        !           122:        CourierConnection *conn;
        !           123:        int i;
        !           124:        ListPropertiesResults LPresult;
        !           125:        RetrieveItemResults RIresult;
        !           126:        ChangeItemResults CIresult;
        !           127:        AddItemPropertyResults AIPresult;
        !           128:        char *pwd, *propval, *getXNSpass(), *malloc(), *gets(), 
        !           129:                mystrname[200], addrstr[200], *myhostname;
        !           130:        String ItemToString();
        !           131:        Item item, StringToItem(), addrToItem();
        !           132:        Property propnum;
        !           133:        struct ns_addr *addr;
        !           134:        static Boolean authseq[2] = {1, 0};     /* simple, not strong */
        !           135: 
        !           136:        if (argc < 1 || argc >4) {
        !           137:                fprintf(stderr,"Usage: %s [hostname]\n",argv[0]);
        !           138:                exit(1);
        !           139:        }
        !           140:        CH_NameDefault(&defname);
        !           141:        if (argc == 1) {
        !           142:            gethostname(myhostname=malloc(100), 100);
        !           143:          name = CH_StringToName(myhostname, &defname);
        !           144:        } else
        !           145:          name = CH_StringToName(argv[1], &defname);
        !           146:        if (argc > 2)
        !           147:                name.domain = argv[2];
        !           148:        if (argc > 3)
        !           149:                name.organization = argv[3];
        !           150:        printf("Registering host %s:%s:%s\n",
        !           151:               name.object,name.domain,name.organization);
        !           152:        printf("XNS UserName: ");
        !           153:        gets(mystrname);
        !           154:        myname = CH_StringToName(mystrname, &name);
        !           155:        pwd = getXNSpass("Password:");
        !           156:        MakeSimpleCredsAndVerifier(&myname,pwd,
        !           157:                        &agent.credentials, &agent.verifier);
        !           158:        conn = CH_GetFirstCH();
        !           159:        i = sizeof(sns); myaddr = &sns.sns_addr;
        !           160:        getsockname(*(int *)conn, &sns, &i); myaddr->x_port = 0;
        !           161:        DURING {
        !           162:                LPresult = ListProperties(conn,NULL,name,agent);
        !           163:        } HANDLER {
        !           164:                if (Exception.Code == ArgumentError) {
        !           165:                  DURING CreateObject(conn,NULL,name,agent);
        !           166:                  HANDLER {
        !           167:                        fprintf(stderr,"Can't create object. Error %d\n",
        !           168:                                Exception.Code);
        !           169:                        exit(1);
        !           170:                  } END_HANDLER;
        !           171:                  LPresult.properties.length = 0;
        !           172:                }
        !           173:                else {
        !           174:                  fprintf(stderr,"ListProperties failed.  Error %d\n",
        !           175:                        Exception.Code);
        !           176:                  exit(1);
        !           177:                }
        !           178:        } END_HANDLER;
        !           179:        /* AddressList property */
        !           180:        if (isprop(4,LPresult.properties)) {
        !           181:                addr = CH_LookupAddr(name,4);
        !           182:                if (addr==0) {
        !           183:                    fprintf(stderr,"NetworkAddress is in property list, but CH_LookupAddr failed\n");
        !           184:                    exit(1);
        !           185:                }
        !           186:                printf("Old address: %s\n",XNSaddrToString(addr));
        !           187:                printf("New address: ");
        !           188:                gets(addrstr);
        !           189:                if (*addrstr==0 && addr->x_port!=0) {
        !           190:                    printf("Warning:  port should be 0 for gaptelnet\n");
        !           191:                    printf("New address: ");
        !           192:                    gets(addrstr);
        !           193:                }
        !           194:                if (*addrstr!=0) {
        !           195:                    addr = getXNSaddr(addrstr);
        !           196:                } else
        !           197:                    addr = myaddr;
        !           198:                item = addrToItem(addr);
        !           199:                DURING CIresult = ChangeItem(conn,NULL, name,4,item,agent);
        !           200:                HANDLER {
        !           201:                  fprintf(stderr,"Can't change address.  Error %d\n",
        !           202:                         Exception.Code);
        !           203:                  exit(1);
        !           204:                } END_HANDLER;
        !           205:        } else {
        !           206:                printf("NS address (e.g. 2-273#2-613-688-939-672): ");
        !           207:                gets(addrstr);
        !           208:                if (*addrstr==0) {
        !           209:                        addr = myaddr;
        !           210:                } else
        !           211:                        addr = getXNSaddr(addrstr);
        !           212:                item = addrToItem(addr);
        !           213:                DURING
        !           214:                  AIPresult = AddItemProperty(conn,NULL,name,4,item,agent);
        !           215:                HANDLER {
        !           216:                  fprintf(stderr,"Can't add address property.  Error %d\n",
        !           217:                        Exception.Code);
        !           218:                  exit(1);
        !           219:                } END_HANDLER;
        !           220:        }
        !           221:        /* AuthenticationLevel property */
        !           222:        if (!isprop(8,LPresult.properties)) {
        !           223:                item.length = 2;
        !           224:                item.sequence = (Unspecified *) authseq;
        !           225:                DURING
        !           226:                  AIPresult = AddItemProperty(conn,NULL,name,8,item,agent);
        !           227:                HANDLER {
        !           228:                  fprintf(stderr,"Can't add AuthenticationLevel property.\n");
        !           229:                  exit(1);
        !           230:                } END_HANDLER;
        !           231:        }
        !           232:        /* description */
        !           233:        DURING {
        !           234:                if (isprop(10005,LPresult.properties)) {
        !           235:                        propnum = 10005; /* 10005<<16; */
        !           236:                        RIresult = RetrieveItem(conn, NULL,
        !           237:                                        name,
        !           238:                                        propnum, agent);
        !           239:                        propval = ItemToString(RIresult.value);
        !           240:                        printf("Workstation description (Property 10005) has value ``%s''\n",
        !           241:                               propval );
        !           242:                        clear_RetrieveItemResults(&RIresult);
        !           243:                }
        !           244:                propnum = 10024; /* 10024<<16; */
        !           245:                if (isprop(10024,LPresult.properties)) {
        !           246:                        RIresult = RetrieveItem(conn, NULL,
        !           247:                                        name,
        !           248:                                        propnum, agent);
        !           249:                        propval = ItemToString(RIresult.value);
        !           250:                        printf("Server description (Property 10024) has value ``%s''\nNew value: ",
        !           251:                               propval );
        !           252:                        propval = gets(malloc(100));
        !           253:                        item = StringToItem(propval);
        !           254:                        CIresult = ChangeItem(conn, NULL,
        !           255:                                        name,
        !           256:                                        propnum, item, agent);
        !           257:                } else {
        !           258:                        printf("Enter new description: ");
        !           259:                        propval = gets(malloc(100));
        !           260:                        item = StringToItem(propval);
        !           261:                        AIPresult = AddItemProperty(conn, NULL,
        !           262:                                        name,
        !           263:                                        propnum, item, agent);
        !           264:                }
        !           265:        } HANDLER {
        !           266:                fprintf(stderr,
        !           267:                        "Error during Property manipulations, %d (%d)\n",
        !           268:                        Exception.Code,
        !           269:                        CourierErrArgs(Clearinghouse2_CallErrorArgs,problem) );
        !           270:        } END_HANDLER;
        !           271: }

unix.superglobalmegacorp.com

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