| /* |
| * cheap and dirty network database lookup functions |
| */ |
| /* |
| * uses local files only |
| */ |
| /* |
| * currently searches the protocols only |
| */ |
| |
| #include <net-snmp/net-snmp-config.h> |
| #include <net-snmp/net-snmp-includes.h> |
| |
| #if (defined(WIN32) || defined(cygwin) || defined(aix4)) |
| |
| #ifdef aix4 |
| #define _NO_PROTO /* Hack, you say ? */ |
| #endif |
| |
| #include <stdio.h> |
| #include <sys/types.h> |
| #if HAVE_STDLIB_H |
| #include <stdlib.h> |
| #endif |
| #if HAVE_STRING_H |
| #include <string.h> |
| #endif |
| #if HAVE_WINSOCK_H |
| #include <winsock.h> |
| #endif |
| #if HAVE_NETINET_IN_H |
| #include <netinet/in.h> |
| #endif |
| #if HAVE_NETDB_H |
| #include <netdb.h> |
| #endif |
| |
| static int h_stay_open, s_stay_open, p_stay_open, n_stay_open; |
| static FILE *h_fp, *s_fp, *p_fp, *n_fp; |
| static char *p_fn; |
| #ifdef notused |
| static char *h_fn, *s_fn, *n_fn; |
| #endif |
| |
| #ifdef aix4 |
| #define ROOT_BASE "/etc/" |
| #define PROT_FN "protocols" |
| #else |
| #define ROOT_BASE "\\SYSTEM32\\DRIVERS\\ETC\\" |
| #define PROT_FN "protocol" |
| #endif |
| #define HOST_FN "hosts" |
| #define SERV_FN "services" |
| #define NETW_FN "networks" |
| |
| static int pre_env_done = 0; |
| static void |
| pre_env(void) |
| { |
| const char *cproot; |
| const char *cp = ""; |
| |
| if (pre_env_done) |
| return; |
| pre_env_done = 1; |
| |
| #ifndef aix4 |
| cp = getenv("SYSTEMROOT"); |
| if (cp) { |
| ; |
| /* |
| * printf ("Root is '%s'\n", cp); |
| */ |
| } else |
| cp = "C:\\WINNT"; |
| #endif |
| |
| cproot = ROOT_BASE; |
| p_fn = |
| (char *) malloc(3 + strlen(cp) + strlen(cproot) + strlen(PROT_FN)); |
| if (p_fn) |
| sprintf(p_fn, "%s%s%s", cp, cproot, PROT_FN); |
| #ifdef notused |
| h_fn = |
| (char *) malloc(3 + strlen(cp) + strlen(cproot) + strlen(HOST_FN)); |
| if (h_fn) |
| sprintf(h_fn, "%s%s%s", cp, cproot, HOST_FN); |
| s_fn = |
| (char *) malloc(3 + strlen(cp) + strlen(cproot) + strlen(SERV_FN)); |
| if (s_fn) |
| sprintf(s_fn, "%s%s%s", cp, cproot, SERV_FN); |
| n_fn = |
| (char *) malloc(3 + strlen(cp) + strlen(cproot) + strlen(NETW_FN)); |
| if (n_fn) |
| sprintf(n_fn, "%s%s%s", cp, cproot, NETW_FN); |
| #endif |
| } |
| |
| /* |
| * sets can open. ends must close. |
| */ |
| void |
| endhostent(void) |
| { |
| if (h_fp) |
| fclose(h_fp); |
| h_fp = 0; |
| } |
| |
| void |
| endservent(void) |
| { |
| if (s_fp) |
| fclose(s_fp); |
| s_fp = 0; |
| } |
| |
| void |
| endprotoent(void) |
| { |
| if (p_fp) |
| fclose(p_fp); |
| p_fp = 0; |
| } |
| |
| void |
| endnetent(void) |
| { |
| if (n_fp) |
| fclose(n_fp); |
| n_fp = 0; |
| } |
| |
| void |
| sethostent(int stay_open) |
| { |
| pre_env(); |
| endhostent(); |
| h_stay_open = stay_open; |
| } |
| |
| void |
| setservent(int stay_open) |
| { |
| pre_env(); |
| endservent(); |
| s_stay_open = stay_open; |
| } |
| |
| void |
| setprotoent(int stay_open) |
| { |
| pre_env(); |
| endprotoent(); |
| p_stay_open = stay_open; |
| } |
| |
| void |
| setnetent(int stay_open) |
| { |
| pre_env(); |
| endnetent(); |
| n_stay_open = stay_open; |
| } |
| |
| #define STRTOK_DELIMS " \t\n" |
| |
| /* |
| * get next entry from data base file, or from NIS if possible. |
| */ |
| /* |
| * returns 0 if there are no more entries to read. |
| */ |
| struct hostent * |
| gethostent(void) |
| { |
| return 0; |
| } |
| struct servent * |
| getservent(void) |
| { |
| return 0; |
| } |
| |
| struct protoent * |
| getprotoent(void) |
| { |
| char *cp, **alp, lbuf[256]; |
| static struct protoent spx; |
| static char *ali[10]; |
| struct protoent *px = &spx; |
| int linecnt = 0; |
| char *st; |
| |
| for (alp = ali; *alp; free(*alp), *alp = 0, alp++); |
| if (px->p_name) |
| free(px->p_name); |
| px->p_aliases = ali; |
| |
| if (!p_fn) |
| return 0; |
| if (!p_fp) |
| p_fp = fopen(p_fn, "r"); |
| |
| if (!p_fp) |
| return 0; |
| while (fgets(lbuf, sizeof(lbuf), p_fp)) { |
| linecnt++; |
| cp = lbuf; |
| if (*cp == '#') |
| continue; |
| |
| cp = strtok_r(lbuf, STRTOK_DELIMS, &st); |
| if (!cp) |
| continue; |
| if (cp) |
| px->p_name = strdup(cp); |
| |
| cp = strtok_r(NULL, STRTOK_DELIMS, &st); |
| if (!cp) { |
| free(px->p_name); |
| continue; |
| } |
| px->p_proto = (short) atoi(cp); |
| |
| for (alp = px->p_aliases; cp; alp++) { |
| cp = strtok_r(NULL, STRTOK_DELIMS, &st); |
| if (!cp) |
| break; |
| if (*cp == '#') |
| break; |
| *alp = strdup(cp); |
| } |
| |
| return (px); |
| } |
| |
| return 0; |
| } |
| struct netent * |
| getnetent(void) |
| { |
| return 0; |
| } |
| |
| struct netent * |
| getnetbyaddr(long net, int type) |
| { |
| return 0; |
| } |
| |
| /* |
| * Return the network number from an internet address |
| */ |
| u_long |
| inet_netof(struct in_addr in) |
| { |
| register u_long i = ntohl(in.s_addr); |
| u_long ii = (i >> 24) & 0xff; |
| if (0 == (ii & 0x80)) |
| return ((0xff000000 & i) >> 24); |
| if (0x80 == (ii & 0xc0)) |
| return ((0xffff0000 & i) >> 16); |
| /* |
| * if (0xc0 == (ii & 0xe0)) |
| */ |
| return ((0xffffff00 & i) >> 8); |
| } |
| |
| /* |
| * Return the host number from an internet address |
| */ |
| u_long |
| inet_lnaof(struct in_addr in) |
| { |
| register u_long i = ntohl(in.s_addr); |
| u_long ii = (i >> 24) & 0xff; |
| if (0 == (ii & 0x80)) |
| return (0x00ffffff & i); |
| if (0x80 == (ii & 0xc0)) |
| return (0x0000ffff & i); |
| /* |
| * if (0xc0 == (ii & 0xe0)) |
| */ |
| return (0x000000ff & i); |
| } |
| |
| #endif /* WIN32 or cygwin */ |