# /* names.c */ /* EMACS_MODES: c !fill */ /* Resolve a host name into an internet address. Three name formats are * accepted: * 1) A character string host name * 2) An octal host number, in the form: * ,,, * Any of the , , and may be left blank or left out * entirely; they default to the local net/subnet. * 3) A thirty-two bit hex number, preceeded by a '#', which is used * without interpretation as the host number. * * The following routines are included in this file: * resolve_name Resolve a name as specified above * gethmch Parse a hex machine address specification * getomch Parse an octal machine address specification */ #define INSZ 4 #define TRUE 1 #define FALSE 0 /* Format of host tables */ extern struct mach { char *m_name; int m_id; } mach[]; extern struct mchid { char m_addr[INSZ]; int m_type; } mchid[]; extern int nmach; #define MYNET 022 #define MYSNET 012 #define MYRSD 0 #define MYHOST 010 resolve_name (name, paddr) /* Resolve foreign host internet address * Scan table of host names and nicknames. * On each pass, include one more letter in comparison * and count no. matches. * When only have one match, have found host name so quit search - return TRUE * When more than one match, do another pass (which will include * one more letter in comparison). * When find no matches, error - cannot recognize name - return FALSE * * Arguments: */ char *name; /* name to resolve */ char *paddr; /* ptr. to place to return in addr */ { register char *q, *p; register i; int j, nfnd, fnd, pass; if ((*name >= '0') && (*name <= '7')) return (getomch(name, paddr)); if (*name == '#') return (gethmch(name, paddr)); for (pass = 1; ; pass++) { nfnd = 0; for (j = 0; j < nmach; j++) { p = name; q = mach[j].m_name; for (i = 0; i < pass; i++) if (*p++ != *q++) break; if (i == pass) { fnd = j; nfnd++; } } if (nfnd > 1) continue; if (nfnd == 0) return (FALSE); if (nfnd == 1) { fnd = mach[fnd].m_id; for (i = 0; i < INSZ; i++) paddr[i] = mchid[fnd].m_addr[i]; return (TRUE); } } } /* Parse foreign host number input as hex string */ gethmch(name, paddr) char *name; register char *paddr; { register char *tmp; register int i; tmp = &name[1]; for (i = 0; i < 8; i++) { if ((*tmp >= '0') && (*tmp <= '9')) *tmp++ -= '0'; else if ((*tmp >= 'A') && (*tmp <= 'Z')) *tmp++ -= ('A' - 10); else if ((*tmp >= 'a') && (*tmp <= 'z')) *tmp++ -= ('a' - 10); else return (FALSE); } if (*tmp != 0) return (FALSE); tmp = &name[1]; for (i = 0; i < INSZ; i++) *paddr++ = ((*tmp++ << 4) + *tmp++); return (TRUE); } /* Parse foreign host number input as octal string */ getomch(name, paddr) char *name; char *paddr; { char tmp[INSZ]; register char *p; register int i, j; int n; paddr[0] = MYNET; paddr[1] = MYSNET; paddr[2] = MYRSD; paddr[3] = MYHOST; p = name; for (i = 0; i < INSZ; i++) { n = 0; while((*p >= '0') && (*p <= '7')) { n = ((n << 3) + (*p++ - '0')); if (n > 0377) return (FALSE); } tmp[i] = n; if (*p == 0) break; if (*p == ',') p++; else return (FALSE); } if (i == INSZ) return (FALSE); for (j = 3; j >= 0; j--) { paddr[j] = tmp[i]; if (--i < 0) break; } return (TRUE); }