winstub.c
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:5k
- /*
- * 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 " tn"
- /*
- * 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 */