⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getx25hostent.c

📁 早期freebsd实现
💻 C
字号:
/*	getx25hostent.c	2.0	86-9-29	*//* * Get next entry from /etc/x25hosts table * Adapted from 4.2bsd network support code. * * Frank Pronk * The University of British Columbia * Laboratory for Computational Vision * Copyright (c) */#include <sys/types.h>#include <sys/socket.h>#include <sys/stat.h>#include <netccitt/x25.h>#include <netdb.h>#include <ctype.h>/* * ccitt version. */#define	MAXALIASES	8#define	MAXADDRSIZE	64#define LINESIZE	256static char HOSTDB[] = "/etc/x25hosts";static char line[LINESIZE+1];static char hostaddr[MAXADDRSIZE];static struct hostent host;#ifdef h_addr		/* for 4.3bsd; see <netdb.h> */static char *host_addrs[2];#endifstatic char *host_aliases[MAXALIASES];static char *FileStart, *FilePos, *FileEnd;static short stayopen;static char *any();char *malloc ();setx25hostent(f)	int f;{	register int fd = -1;	struct stat st;	if (FileStart == 0) {		if ((fd = open (HOSTDB, 0)) < 0)			return;		fstat (fd, &st);		if ((FileStart = malloc (st.st_size)) == 0)			goto fail;		if (read (fd, FileStart, st.st_size) != st.st_size)			goto fail;		FileEnd = FileStart + st.st_size;		close (fd);		stayopen |= f;	}	FilePos = FileStart;	return;fail:	if (FileStart) {		free (FileStart);		FileStart = 0;	}	if (fd >= 0)		close (fd);}endx25hostent(){	if (FileStart && !stayopen) {		free (FileStart);		FileStart = 0;	}}struct hostent *getx25hostent(){	register char *p, *cp, **q, *end;	long iaddr;	if (FileStart == 0) {		setx25hostent (0);		if (FileStart == 0)			return (0);	}#ifdef h_addr	host.h_addr_list = host_addrs;	host_addrs[0] = hostaddr;#else	host.h_addr = hostaddr;#endif	p = FilePos;	end = any (p, FileEnd, "\n");	for (; end; p = end+1, end = any (end+1, FileEnd, "\n")) {		if (*p == '#')			continue;		bcopy (p, line, (end + 1) - p);		p = line;		if (cp = any (p, line+LINESIZE, "\n#"))			*cp = '\0';		if ((cp = any (p, line+LINESIZE, " \t")) == 0)			continue;		*cp++ = '\0';		if (ccitt_addr(p, (struct sockaddr_x25 *)hostaddr) == 0)			continue;		host.h_length = sizeof (struct sockaddr_x25);		host.h_addrtype = AF_CCITT;		while (*cp == ' ' || *cp == '\t')			cp++;		host.h_name = cp;		q = host.h_aliases = host_aliases;		cp = any(cp, line+LINESIZE, " \t");		if (cp != 0) 			*cp++ = '\0';		while (cp && *cp) {			if (*cp == ' ' || *cp == '\t') {				cp++;				continue;			}			if (q < &host_aliases[MAXALIASES - 1])				*q++ = cp;			cp = any(cp, line+LINESIZE, " \t");			if (cp != 0)				*cp++ = '\0';		}		*q = 0;		FilePos = end + 1;		return (&host);	}	return (0);}static char *any(cp, limit, match)	register char *cp;	char *limit, *match;{	register char *mp, c;	while (cp < limit) {		c = *cp;		for (mp = match; *mp; mp++)			if (*mp == c)				return (cp);		cp++;	}	return ((char *)0);}

⌨️ 快捷键说明

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