gethostent.c

来自「minix操作系统最新版本(3.1.1)的源代码」· C语言 代码 · 共 169 行

C
169
字号
/*	gethostent() - Interface to /etc/hosts		Author: Kees J. Bot *								31 May 1999 *//* Prefix the functions defined here with underscores to distinguish them * from the newer replacements in the resolver library. */#define sethostent	_sethostent#define endhostent	_endhostent#define gethostent	_gethostent#define gethostbyname	_gethostbyname#define gethostbyaddr	_gethostbyaddr#define nil 0#include <sys/types.h>#include <stdio.h>#include <string.h>#include <net/gen/netdb.h>#include <net/gen/in.h>#include <net/gen/inet.h>#include <net/gen/socket.h>#define arraysize(a)	(sizeof(a) / sizeof((a)[0]))#define arraylimit(a)	((a) + arraysize(a))#define isspace(c)	((unsigned) (c) <= ' ')static char HOSTS[]= _PATH_HOSTS;static char *hosts= HOSTS;	/* Current hosts file. */static FILE *hfp;		/* Open hosts file. */void sethostent(int stayopen)/* Start search.  (Same as ending it.) */{    endhostent();}void endhostent(void)/* End search and reinitialize. */{    if (hfp != nil) {	fclose(hfp);	hfp= nil;    }    hosts= _PATH_HOSTS;}struct hostent *gethostent(void)/* Return the next entry from the hosts files. */{    static char line[256];	/* One line in a hosts file. */    static ipaddr_t addr;	/* IP address found first on the line. */    static char *names[16];	/* Pointers to the words on the line. */    static char *addrs[2]= {	/* List of IP addresses (just one.) */	(char *) &addr,	nil,    };    static struct hostent host = {	nil,			/* h_name, will set to names[1]. */	names + 2,		/* h_aliases, the rest of the names. */	AF_INET,		/* h_addrtype */	sizeof(ipaddr_t),	/* Size of an address in the address list. */	addrs,			/* List of IP addresses. */    };    static char nexthosts[128];	/* Next hosts file to include. */    char *lp, **np;    int c;    for (;;) {	if (hfp == nil) {	    /* No hosts file open, try to open the next one. */	    if (hosts == 0) return nil;	    if ((hfp= fopen(hosts, "r")) == nil) { hosts= nil; continue; }	}	/* Read a line. */	lp= line;	while ((c= getc(hfp)) != EOF && c != '\n') {	    if (lp < arraylimit(line)) *lp++= c;	}	/* EOF?  Then close and prepare for reading the next file. */	if (c == EOF) {	    fclose(hfp);	    hfp= nil;	    hosts= nil;	    continue;	}	if (lp == arraylimit(line)) continue;	*lp= 0;	/* Break the line up in words. */	np= names;	lp= line;	for (;;) {	    while (isspace(*lp) && *lp != 0) lp++;	    if (*lp == 0 || *lp == '#') break;	    if (np == arraylimit(names)) break;	    *np++= lp;	    while (!isspace(*lp) && *lp != 0) lp++;	    if (*lp == 0) break;	    *lp++= 0;	}	if (np == arraylimit(names)) continue;	*np= nil;	/* Special "include file" directive. */	if (np == names + 2 && strcmp(names[0], "include") == 0) {	    fclose(hfp);	    hfp= nil;	    hosts= nil;	    if (strlen(names[1]) < sizeof(nexthosts)) {		strcpy(nexthosts, names[1]);		hosts= nexthosts;	    }	    continue;	}	/* At least two words, the first of which is an IP address. */	if (np < names + 2) continue;	if (!inet_aton((char *) names[0], &addr)) continue;	host.h_name= (char *) names[1];	return &host;    }}/* Rest kept in reserve, we probably never need 'em. */#if XXXstruct hostent *gethostbyname(const char *name){    struct hostent *he;    char **pa;    char alias[256];    char *domain;        sethostent(0);    while ((he= gethostent()) != nil) {	if (strcasecmp(he->h_name, name) == 0) goto found;	domain= strchr(he->h_name, '.');	for (pa= he->h_aliases; *pa != nil; pa++) {	    strcpy(alias, *pa);	    if (domain != nil && strchr(alias, '.') == nil) {		strcat(alias, domain);	    }	    if (strcasecmp(alias, name) == 0) goto found;	}    }  found:    endhostent();    return he;}struct hostent *gethostbyaddr(const char *addr, int len, int type){    struct hostent *he;    sethostent(0);    while ((he= gethostent()) != nil) {	if (he->h_name[0] == '%') continue;	if (type == AF_INET && memcmp(he->h_addr, addr, len) == 0) break;    }    endhostent();    return he;}#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?