home *** CD-ROM | disk | FTP | other *** search
- /* 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 256
-
- static 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];
- #endif
- static 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);
- }
-