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