|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T x
Length: 5348 (0x14e4) Types: TextFile Names: »xhost.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z« └─⟦2109abc41⟧ └─⟦this⟧ »./X.V10R4/xhost/xhost.c«
#include <X/mit-copyright.h> /* Copyright 1985 Massachusetts Institute of Technology */ #ifndef lint static char *rcsid_xhost_c = "$Header: xhost.c,v 10.12 86/11/19 19:24:01 jg Rel $"; #endif #include <signal.h> #include <setjmp.h> #include <ctype.h> #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netdb.h> #include <netinet/in.h> #ifdef DNETCONN #include <netdnet/dn.h> #include <netdnet/dnetdb.h> #endif #include <X/Xlib.h> #include <X/Xproto.h> char *index(); int local_xerror(); #define NAMESERVER_TIMEOUT 5 /* time to wait for nameserver */ int nameserver_timedout; main(argc, argv) int argc; char **argv; { Display *dpy; char host[256]; register char *arg; int display, i, w, nhosts; char *address, *get_address(); char *hostname, *get_hostname(); struct in_addr *list, *XGetHosts(); #ifdef DNETCONN char *dnet_htoa(); struct nodeent *np; struct dn_naddr *nlist, dnaddr, *dnaddrp, *XGetNodes(), *dnet_addr(); char *cp, *index(); #endif if ((dpy = XOpenDisplay(NULL)) == NULL) { fprintf(stderr, "%s: Can't open display '%s'\n", argv[0], XDisplayName("\0")); exit(1); } XErrorHandler(local_xerror); if (argc == 1) { /* * Get all the INET host names */ list = XGetHosts(&nhosts); if (nhosts != 0) { sethostent(1); /* don't close the data base each time */ for (i = 0; i < nhosts; i++ ) { hostname = get_hostname(list[i]); printf("%s\t", hostname); if (nameserver_timedout) printf("(nameserver did not respond in %d seconds)\n", NAMESERVER_TIMEOUT); else printf("\n"); } endhostent(); } #ifdef DNETCONN /* * Get all the DECnet node names */ nlist = XGetNodes(&nhosts); if (nhosts != 0) { setnodeent(1); /* keep the database accessed */ for (i = 0; i < nhosts; i++ ) { printf("%s::\n", dnet_htoa(&nlist[i])); } } #endif exit(0); } for (i = 1; i < argc; i++) { arg = argv[i]; if (*arg == '-') { arg++; #ifdef DNETCONN if ((cp = index(arg, ':')) && (*(cp + 1) == ':')) { *cp = '\0'; if (dnaddrp = dnet_addr(arg)) { XRemoveNode(dnaddrp); } else { if ((np = getnodebyname (arg)) == NULL) { printf("xhost:bad node: %s::\n", arg); } else { dnaddr.a_len = np->n_length; bcopy (np->n_addr, dnaddr.a_addr, np->n_length); XRemoveNode(&dnaddr); } } } else { #endif if ((address = get_address(arg)) == NULL) fprintf(stderr, "%s: bad host: %s\n", argv[0], arg); else XRemoveHost(address); #ifdef DNETCONN } #endif } else { if (*arg == '+') arg++; #ifdef DNETCONN if ((cp = index(arg, ':')) && (*(cp + 1) == ':')) { *cp = '\0'; if (dnaddrp = dnet_addr(arg)) { XAddNode(dnaddrp); } else { if ((np = getnodebyname (arg)) == NULL) { printf("xhost:bad node: %s::\n", arg); } else { dnaddr.a_len = np->n_length; bcopy (np->n_addr, dnaddr.a_addr, np->n_length); XAddNode(&dnaddr); } } } else { #endif if ((address = get_address(arg)) == NULL) fprintf(stderr, "%s: bad host: %s\n", argv[0], arg); else XAddHost(address); #ifdef DNETCONN } #endif } } XSync(0); exit(0); } /* * get_address - return a pointer to an internet address given * either a name (CHARON.MIT.EDU) or a string with the raw * address (18.58.0.13) */ char *get_address (name) char *name; { struct hostent *hp; static unsigned long address; /* * First see if inet_addr() can grok the name; if so, then use it. */ if ((address = inet_addr(name)) != -1) { return((char *)&address); /* Found it */ } /* * Is it in the namespace? */ else if (((hp = gethostbyname(name)) == (struct hostent *)NULL) || hp->h_addrtype != AF_INET) { return (NULL); /* Sorry, you lose */ } else { return (hp->h_addr); /* Found it. */ } } /* * get_hostname - Given an internet address, return a name (CHARON.MIT.EDU) * or a string representing the address (18.58.0.13) if the name cannot * be found. */ jmp_buf env; char *get_hostname (address) struct in_addr *address; { struct hostent *hp = NULL; int nameserver_lost(); char *inet_ntoa(); /* gethostbyaddr can take a LONG time if the host does not exist. Assume that if it does not respond in NAMESERVER_TIMEOUT seconds that something is wrong and do not make the user wait. gethostbyaddr will continue after a signal, so we have to jump out of it. */ nameserver_timedout = 0; signal(SIGALRM, nameserver_lost); alarm(4); if (setjmp(env) == 0) { hp = gethostbyaddr (&address, sizeof(struct in_addr), AF_INET); } alarm(0); if (hp) return (hp->h_name); else return (inet_ntoa(address)); } nameserver_lost() { nameserver_timedout = 1; longjmp(env, -1); } /* * local_xerror - local non-fatal error handling routine. If the error was * that an X_GetHosts request for an unknown address format was received, just * return, otherwise call the default error handler _XError. */ local_xerror (dpy, rep) Display *dpy; XErrorEvent *rep; { if ((rep->error_code == BadValue) && (rep->request_code == X_GetHosts)) { return; } else { _XError(dpy, rep); } }