|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.