Annotation of 43BSDTahoe/new/X/xhost/xhost.c, revision 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.12 86/11/19 19:24:01 jg 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 open display '%s'\n",
        !            48:                    argv[0], XDisplayName("\0"));
        !            49:            exit(1);
        !            50:        }
        !            51:  
        !            52:        XErrorHandler(local_xerror);
        !            53:  
        !            54:  
        !            55:        if (argc == 1) {
        !            56:                /*
        !            57:                 * Get all the INET host names
        !            58:                 */
        !            59:                list = XGetHosts(&nhosts);
        !            60:                if (nhosts != 0) {
        !            61:                    sethostent(1); /* don't close the data base each time */
        !            62:                    for (i = 0; i < nhosts; i++ )  {
        !            63:                      hostname = get_hostname(list[i]);
        !            64:                      printf("%s\t", hostname);
        !            65:                      if (nameserver_timedout)
        !            66:                        printf("(nameserver did not respond in %d seconds)\n",
        !            67:                                NAMESERVER_TIMEOUT);
        !            68:                      else printf("\n");
        !            69:                    }
        !            70:                    endhostent();
        !            71:                }
        !            72: #ifdef DNETCONN
        !            73:                /*
        !            74:                 * Get all the DECnet node names
        !            75:                 */
        !            76:                nlist = XGetNodes(&nhosts);
        !            77:                if (nhosts != 0) {
        !            78:                    setnodeent(1); /* keep the database accessed */
        !            79:                    for (i = 0; i < nhosts; i++ )  {
        !            80:                        printf("%s::\n", dnet_htoa(&nlist[i]));
        !            81:                    }
        !            82:                }
        !            83: #endif
        !            84:                exit(0);
        !            85:        }
        !            86:  
        !            87:        for (i = 1; i < argc; i++) {
        !            88:            arg = argv[i];
        !            89:            if (*arg == '-') {
        !            90:                arg++;
        !            91: #ifdef DNETCONN
        !            92:                if ((cp = index(arg, ':')) && (*(cp + 1) == ':')) {
        !            93:                    *cp = '\0';
        !            94:                    if (dnaddrp = dnet_addr(arg)) {
        !            95:                        XRemoveNode(dnaddrp);
        !            96:                    } else {
        !            97:                        if ((np = getnodebyname (arg)) == NULL) {
        !            98:                            printf("xhost:bad node: %s::\n", arg);
        !            99:                        } else {
        !           100:                            dnaddr.a_len = np->n_length;
        !           101:                            bcopy (np->n_addr, dnaddr.a_addr, np->n_length);
        !           102:                            XRemoveNode(&dnaddr);
        !           103:                        }
        !           104:                    }
        !           105:                } else {
        !           106: #endif
        !           107:                     if ((address = get_address(arg)) == NULL) 
        !           108:                         fprintf(stderr, "%s: bad host: %s\n", argv[0], arg);
        !           109:                     else XRemoveHost(address);
        !           110: #ifdef DNETCONN
        !           111:                }
        !           112: #endif
        !           113:            } else {
        !           114:                if (*arg == '+') arg++;
        !           115: #ifdef DNETCONN
        !           116:                if ((cp = index(arg, ':')) && (*(cp + 1) == ':')) {
        !           117:                    *cp = '\0';
        !           118:                    if (dnaddrp = dnet_addr(arg)) {
        !           119:                        XAddNode(dnaddrp);
        !           120:                    } else {
        !           121:                        if ((np = getnodebyname (arg)) == NULL) {
        !           122:                            printf("xhost:bad node: %s::\n", arg);
        !           123:                        } else {
        !           124:                            dnaddr.a_len = np->n_length;
        !           125:                            bcopy (np->n_addr, dnaddr.a_addr, np->n_length);
        !           126:                            XAddNode(&dnaddr);
        !           127:                        }
        !           128:                    }
        !           129:                } else {
        !           130: #endif
        !           131:                     if ((address = get_address(arg)) == NULL) 
        !           132:                         fprintf(stderr, "%s: bad host: %s\n", argv[0], arg);
        !           133:                     else XAddHost(address);
        !           134: #ifdef DNETCONN
        !           135:                }
        !           136: #endif
        !           137:            }
        !           138:        }
        !           139:        XSync(0);
        !           140:        exit(0);
        !           141: }
        !           142: 
        !           143:  
        !           144: 
        !           145: /*
        !           146:  * get_address - return a pointer to an internet address given
        !           147:  * either a name (CHARON.MIT.EDU) or a string with the raw
        !           148:  * address (18.58.0.13)
        !           149:  */
        !           150: 
        !           151: char *get_address (name) 
        !           152: char *name;
        !           153: {
        !           154:   struct hostent *hp;
        !           155:   static unsigned long address;
        !           156: 
        !           157:   /*
        !           158:    * First see if inet_addr() can grok the name; if so, then use it.
        !           159:    */
        !           160:   if ((address = inet_addr(name)) != -1) {
        !           161:     return((char *)&address);  /* Found it */
        !           162:   } 
        !           163:   /*
        !           164:    * Is it in the namespace?
        !           165:    */
        !           166:   else if (((hp = gethostbyname(name)) == (struct hostent *)NULL)
        !           167:        || hp->h_addrtype != AF_INET) {
        !           168:     return (NULL);             /* Sorry, you lose */
        !           169:   } else {
        !           170:     return (hp->h_addr);       /* Found it. */
        !           171:   }
        !           172: }
        !           173: 
        !           174: 
        !           175: /*
        !           176:  * get_hostname - Given an internet address, return a name (CHARON.MIT.EDU)
        !           177:  * or a string representing the address (18.58.0.13) if the name cannot
        !           178:  * be found.
        !           179:  */
        !           180: 
        !           181: jmp_buf env;
        !           182: 
        !           183: char *get_hostname (address)
        !           184: struct in_addr *address;
        !           185: {
        !           186:   struct hostent *hp = NULL;
        !           187:   int nameserver_lost();
        !           188:   char *inet_ntoa();
        !           189:   /* gethostbyaddr can take a LONG time if the host does not exist.
        !           190:      Assume that if it does not respond in NAMESERVER_TIMEOUT seconds
        !           191:      that something is wrong and do not make the user wait.
        !           192:      gethostbyaddr will continue after a signal, so we have to
        !           193:      jump out of it. 
        !           194:    */
        !           195:   nameserver_timedout = 0;
        !           196:   signal(SIGALRM, nameserver_lost);
        !           197:   alarm(4);
        !           198:   if (setjmp(env) == 0) {
        !           199:     hp = gethostbyaddr (&address, sizeof(struct in_addr), AF_INET);
        !           200:   }
        !           201:   alarm(0);
        !           202:   if (hp)
        !           203:     return (hp->h_name);
        !           204:   else return (inet_ntoa(address));
        !           205: }
        !           206: 
        !           207: nameserver_lost()
        !           208: {
        !           209:   nameserver_timedout = 1;
        !           210:   longjmp(env, -1);
        !           211: }
        !           212: 
        !           213: /*
        !           214:  * local_xerror - local non-fatal error handling routine. If the error was
        !           215:  * that an X_GetHosts request for an unknown address format was received, just
        !           216:  * return, otherwise call the default error handler _XError.
        !           217:  */
        !           218: local_xerror (dpy, rep)
        !           219:     Display *dpy;
        !           220:     XErrorEvent *rep;
        !           221: {
        !           222:     if ((rep->error_code == BadValue) && (rep->request_code == X_GetHosts)) {
        !           223:        return;
        !           224:     } else {
        !           225:        _XError(dpy, rep);
        !           226:     }
        !           227: }
        !           228: 

unix.superglobalmegacorp.com

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