1: #include <X/mit-copyright.h>
2: /* Copyright 1985 Massachusetts Institute of Technology */
3: #ifndef lint
4: static char *rcsid_xhost_c = "$Header: xhost.c,v 10.9 86/02/01 15:59:16 tony Rel $";
5: #endif
6:
7: #include <signal.h>
8: #include <setjmp.h>
9: #include <ctype.h>
10: #include <sys/types.h>
11: #include <sys/socket.h>
12: #include <stdio.h>
13: #include <netdb.h>
14: #include <netinet/in.h>
15: #ifdef DNETCONN
16: #include <netdnet/dn.h>
17: #include <netdnet/dnetdb.h>
18: #endif
19: #include <X/Xlib.h>
20: #include <X/Xproto.h>
21:
22: char *index();
23: int local_xerror();
24:
25: #define NAMESERVER_TIMEOUT 5 /* time to wait for nameserver */
26: int nameserver_timedout;
27:
28: main(argc, argv)
29: int argc;
30: char **argv;
31: {
32: Display *dpy;
33: char host[256];
34: register char *arg;
35: int display, i, w, nhosts;
36: char *address, *get_address();
37: char *hostname, *get_hostname();
38: struct in_addr *list, *XGetHosts();
39: #ifdef DNETCONN
40: char *dnet_htoa();
41: struct nodeent *np;
42: struct dn_naddr *nlist, dnaddr, *dnaddrp, *XGetNodes(), *dnet_addr();
43: char *cp, *index();
44: #endif
45:
46: if ((dpy = XOpenDisplay(NULL)) == NULL) {
47: fprintf(stderr, "%s: Can't connect to display!\n", argv[0]);
48: exit(1);
49: }
50:
51: XErrorHandler(local_xerror);
52:
53:
54: if (argc == 1) {
55: /*
56: * Get all the INET host names
57: */
58: list = XGetHosts(&nhosts);
59: if (nhosts != 0) {
60: sethostent(1); /* don't close the data base each time */
61: for (i = 0; i < nhosts; i++ ) {
62: hostname = get_hostname(list[i]);
63: printf("%s\t", hostname);
64: if (nameserver_timedout)
65: printf("(nameserver did not respond in %d seconds)\n",
66: NAMESERVER_TIMEOUT);
67: else printf("\n");
68: }
69: endhostent();
70: }
71: #ifdef DNETCONN
72: /*
73: * Get all the DECnet node names
74: */
75: nlist = XGetNodes(&nhosts);
76: if (nhosts != 0) {
77: setnodeent(1); /* keep the database accessed */
78: for (i = 0; i < nhosts; i++ ) {
79: printf("%s::\n", dnet_htoa(&nlist[i]));
80: }
81: }
82: #endif
83: exit(0);
84: }
85:
86: for (i = 1; i < argc; i++) {
87: arg = argv[i];
88: if (*arg == '-') {
89: arg++;
90: #ifdef DNETCONN
91: if ((cp = index(arg, ':')) && (*(cp + 1) == ':')) {
92: *cp = '\0';
93: if (dnaddrp = dnet_addr(arg)) {
94: XRemoveNode(dnaddrp);
95: } else {
96: if ((np = getnodebyname (arg)) == NULL) {
97: printf("xhost:bad node: %s::\n", arg);
98: } else {
99: dnaddr.a_len = np->n_length;
100: bcopy (np->n_addr, dnaddr.a_addr, np->n_length);
101: XRemoveNode(&dnaddr);
102: }
103: }
104: } else {
105: #endif
106: if ((address = get_address(arg)) == NULL)
107: fprintf(stderr, "%s: bad host: %s\n", argv[0], arg);
108: else XRemoveHost(address);
109: #ifdef DNETCONN
110: }
111: #endif
112: } else {
113: if (*arg == '+') arg++;
114: #ifdef DNETCONN
115: if ((cp = index(arg, ':')) && (*(cp + 1) == ':')) {
116: *cp = '\0';
117: if (dnaddrp = dnet_addr(arg)) {
118: XAddNode(dnaddrp);
119: } else {
120: if ((np = getnodebyname (arg)) == NULL) {
121: printf("xhost:bad node: %s::\n", arg);
122: } else {
123: dnaddr.a_len = np->n_length;
124: bcopy (np->n_addr, dnaddr.a_addr, np->n_length);
125: XAddNode(&dnaddr);
126: }
127: }
128: } else {
129: #endif
130: if ((address = get_address(arg)) == NULL)
131: fprintf(stderr, "%s: bad host: %s\n", argv[0], arg);
132: else XAddHost(address);
133: #ifdef DNETCONN
134: }
135: #endif
136: }
137: }
138: XSync(0);
139: exit(0);
140: }
141:
142:
143:
144: /*
145: * get_address - return a pointer to an internet address given
146: * either a name (CHARON.MIT.EDU) or a string with the raw
147: * address (18.58.0.13)
148: */
149:
150: char *get_address (name)
151: char *name;
152: {
153: struct hostent *hp;
154: static unsigned long address;
155:
156: /* Raw addresses are the ones that begin with a digit (do this for speed) */
157: if (isdigit(*name)) {
158: address = inet_addr (name);
159: if ((int)address == -1) return(NULL);
160: else return((char *)&address);
161: }
162: hp = gethostbyname (name);
163: if (hp) {
164: if (hp->h_addrtype != AF_INET) return (NULL);
165: else return(hp->h_addr);
166: } else return(NULL);
167: }
168:
169:
170: /*
171: * get_hostname - Given an internet address, return a name (CHARON.MIT.EDU)
172: * or a string representing the address (18.58.0.13) if the name cannot
173: * be found.
174: */
175:
176: jmp_buf env;
177:
178: char *get_hostname (address)
179: struct in_addr *address;
180: {
181: struct hostent *hp = NULL;
182: int nameserver_lost();
183: char *inet_ntoa();
184: /* gethostbyaddr can take a LONG time if the host does not exist.
185: Assume that if it does not respond in NAMESERVER_TIMEOUT seconds
186: that something is wrong and do not make the user wait.
187: gethostbyaddr will continue after a signal, so we have to
188: jump out of it.
189: */
190: nameserver_timedout = 0;
191: signal(SIGALRM, nameserver_lost);
192: alarm(4);
193: if (setjmp(env) == 0) {
194: hp = gethostbyaddr (&address, sizeof(struct in_addr), AF_INET);
195: }
196: alarm(0);
197: if (hp)
198: return (hp->h_name);
199: else return (inet_ntoa(address));
200: }
201:
202: nameserver_lost()
203: {
204: nameserver_timedout = 1;
205: longjmp(env, -1);
206: }
207:
208: /*
209: * local_xerror - local non-fatal error handling routine. If the error was
210: * that an X_GetHosts request for an unknown address format was received, just
211: * return, otherwise call the default error handler _XError.
212: */
213: local_xerror (dpy, rep)
214: Display *dpy;
215: XErrorEvent *rep;
216: {
217: if ((rep->error_code == BadValue) && (rep->request_code == X_GetHosts)) {
218: return;
219: } else {
220: _XError(dpy, rep);
221: }
222: }
Defined functions
main
defined in line
28;
never used
Defined variables
env
defined in line
176; used 2 times
Defined macros