Annotation of 43BSD/contrib/X/xhost/xhost.c, revision 1.1.1.1

1.1       root        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: }
                    223: 

unix.superglobalmegacorp.com

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