Annotation of researchv10dc/ipc/bin/pupu/maphost.c, revision 1.1

1.1     ! root        1: #include <stdio.h>
        !             2: #include <string.h>
        !             3: 
        !             4:        static char     SCCSID[] = "@(#)maphost.c       2.1 DKHOST 84/08/10";
        !             5: 
        !             6:        char            mh_hostname[64];
        !             7:        static char     miscplace[128];
        !             8:        extern char *   miscfield() ;
        !             9: 
        !            10: /*
        !            11:  * Map DATAKIT VCS destination name to a dialstring
        !            12:  *
        !            13:  * The host name is mapped into a full DATAKIT address using
        !            14:  * the file /etc/dkhosts unless it already looks like a full address
        !            15:  * by having '/'s in it.  The host name must match the first field
        !            16:  * of the /etc/dkhosts file and the service class specified (a single
        !            17:  * ASCII character) must be in the listed classes.  The dialstring is
        !            18:  * then constructed from the dialstring (from dkhosts), service
        !            19:  * (defsufx or from miscfield, below), protocol (defprot or miscfield),
        !            20:  * and parm.
        !            21:  *
        !            22:  * Another way of calling this routine is to provide a null host name,
        !            23:  * in which case the routine will successively return all hosts that
        !            24:  * match the service class.  When the end of the dkhosts file is reached,
        !            25:  * a 0 pointer is returned.
        !            26:  *
        !            27:  *     host    = host name to match
        !            28:  *             | 0 -- return all class matches
        !            29:  *     service = service class to match
        !            30:  *     defsufx = service to supply if none in host name or miscellany field
        !            31:  *     defprot = protocol string to supply if none in miscellany field
        !            32:  *     parm    = parameter string to append
        !            33:  *     return  = dialstring pointer
        !            34:  *             | 0 -- if host == "" and EOF reached on /etc/dkhosts
        !            35:  *     mh_hostname     : set to the matched host name if host == ""
        !            36:  *     miscplace       : set for subsequent calls to miscfield()
        !            37:  */
        !            38: 
        !            39:        char *
        !            40: maphost(host, service, defsufx, defprot, parm)
        !            41:        char            service;
        !            42:        register char   *host, *defsufx, *defprot, *parm;
        !            43: {
        !            44:        register int    matched;
        !            45:        char            *dotted, *wasdotted;
        !            46:        char            hostentry[256], hostaddr[128], classes[64];
        !            47:        static FILE     *hostfile;
        !            48:        static char     dialstring[128];
        !            49: 
        !            50:        strcpy(hostaddr, host);
        !            51:        if(dotted = strchr(hostaddr, '.'))
        !            52:                *dotted++ = '\0';
        !            53: 
        !            54:        matched = 0;
        !            55: 
        !            56:        if(!strchr(hostaddr, '/')
        !            57:          && (hostfile || (hostfile = fopen("/etc/dkhosts", "r")) != NULL))
        !            58: 
        !            59:                while(fgets(hostentry, sizeof(hostentry), hostfile) != NULL)
        !            60: 
        !            61:                        if(hostentry[0] != '#' &&
        !            62:                          sscanf(hostentry, "%s %s %s %s",
        !            63:                            mh_hostname, classes, dialstring, miscplace) == 4)
        !            64: 
        !            65:                                if(strchr(classes, service)
        !            66:                                  && (!*host || strcmp(hostaddr, mh_hostname) == 0)){
        !            67:                                        matched = 1;
        !            68:                                        break;
        !            69:                                }
        !            70: 
        !            71:        if(hostfile && (*host || !matched)){
        !            72:                fclose(hostfile);
        !            73:                hostfile = NULL;
        !            74:        }
        !            75: 
        !            76:        if(!matched){
        !            77:                if(!*host)
        !            78:                        return((char *) 0);
        !            79:                strcpy(dialstring, hostaddr);
        !            80:                strcpy(miscplace, "-");
        !            81:        }
        !            82: 
        !            83:        if(!strchr(dialstring, '.')){
        !            84:                wasdotted = dotted;
        !            85: 
        !            86:                if(dotted || (dotted = miscfield(service, 's')))
        !            87:                        defsufx = dotted;
        !            88: 
        !            89:                strcat(dialstring, ".");
        !            90:                strcat(dialstring, defsufx);
        !            91: 
        !            92:                if(!wasdotted){
        !            93:                        if(dotted = miscfield(service, 'p'))
        !            94:                                defprot = dotted;
        !            95: 
        !            96:                        strcat(dialstring, ".");
        !            97:                        strcat(dialstring, defprot);
        !            98:                        strcat(dialstring, ".");
        !            99:                        strcat(dialstring, parm);
        !           100:                }
        !           101:        }
        !           102: 
        !           103:        dotted = &dialstring[strlen(dialstring)];
        !           104: 
        !           105:        while(*--dotted == '.')
        !           106:                *dotted = '\0';
        !           107: 
        !           108:        return(dialstring);
        !           109: }
        !           110: 
        !           111: /*
        !           112:  * Parse Miscellany Field of /etc/dkhosts
        !           113:  *
        !           114:  * This routine is only called after a successful call to maphost()
        !           115:  * and pokes around in the miscellany field saved at that time.
        !           116:  * The subfields are separated by commas and have two-character names
        !           117:  * constructed from the service class character and another character
        !           118:  * appropriate to the subfield value.
        !           119:  *
        !           120:  *     class   = service class as matched by maphost()
        !           121:  *     field   = character representing field name
        !           122:  *     return  = field value string
        !           123:  *             | 0 -- field not listed
        !           124:  */
        !           125: 
        !           126:        char *
        !           127: miscfield(class, field)
        !           128:        char            class, field;
        !           129: {
        !           130:        register char   *next, *ptr;
        !           131:        int             n;
        !           132:        char            cs[16];
        !           133:        static char     place[64];
        !           134: 
        !           135:        ptr = miscplace;
        !           136: 
        !           137:        sprintf(cs, "%c%c=", class, field);
        !           138:        n = strlen(cs);
        !           139: 
        !           140:        do{
        !           141:                if(next = strchr(ptr, ','))
        !           142:                        *next = '\0';
        !           143: 
        !           144:                if(strncmp(ptr, cs, n) == 0){
        !           145:                        strcpy(place, ptr+n);
        !           146:                        if(next)
        !           147:                                *next++ = ',';
        !           148:                        return(place);
        !           149:                }
        !           150: 
        !           151:                if(next)
        !           152:                        *next++ = ',';
        !           153:        }while(ptr = next);
        !           154: 
        !           155:        return((char *) 0);
        !           156: }

unix.superglobalmegacorp.com

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