winstub.c
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:5k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  1. /*
  2.  * cheap and dirty network database lookup functions 
  3.  */
  4. /*
  5.  * uses local files only 
  6.  */
  7. /*
  8.  * currently searches the protocols only 
  9.  */
  10. #include <net-snmp/net-snmp-config.h>
  11. #include <net-snmp/net-snmp-includes.h>
  12. #if (defined(WIN32) || defined(cygwin) || defined(aix4))
  13. #ifdef aix4
  14. #define _NO_PROTO               /* Hack, you say ? */
  15. #endif
  16. #include <stdio.h>
  17. #include <sys/types.h>
  18. #if HAVE_STDLIB_H
  19. #include <stdlib.h>
  20. #endif
  21. #if HAVE_STRING_H
  22. #include <string.h>
  23. #endif
  24. #if HAVE_WINSOCK_H
  25. #include <winsock.h>
  26. #endif
  27. #if HAVE_NETINET_IN_H
  28. #include <netinet/in.h>
  29. #endif
  30. #if HAVE_NETDB_H
  31. #include <netdb.h>
  32. #endif
  33. static int      h_stay_open, s_stay_open, p_stay_open, n_stay_open;
  34. static FILE    *h_fp, *s_fp, *p_fp, *n_fp;
  35. static char    *p_fn;
  36. #ifdef notused
  37. static char    *h_fn, *s_fn, *n_fn;
  38. #endif
  39. #ifdef aix4
  40. #define ROOT_BASE "/etc/"
  41. #define PROT_FN "protocols"
  42. #else
  43. #define ROOT_BASE "\SYSTEM32\DRIVERS\ETC\"
  44. #define PROT_FN "protocol"
  45. #endif
  46. #define HOST_FN "hosts"
  47. #define SERV_FN "services"
  48. #define NETW_FN "networks"
  49. static int      pre_env_done = 0;
  50. static void
  51. pre_env(void)
  52. {
  53.     const char     *cproot;
  54.     const char     *cp = "";
  55.     if (pre_env_done)
  56.         return;
  57.     pre_env_done = 1;
  58. #ifndef aix4
  59.     cp = getenv("SYSTEMROOT");
  60.     if (cp) {
  61.         ;
  62.         /*
  63.          * printf ("Root is '%s'n", cp); 
  64.          */
  65.     } else
  66.         cp = "C:\WINNT";
  67. #endif
  68.     cproot = ROOT_BASE;
  69.     p_fn =
  70.         (char *) malloc(3 + strlen(cp) + strlen(cproot) + strlen(PROT_FN));
  71.     if (p_fn)
  72.         sprintf(p_fn, "%s%s%s", cp, cproot, PROT_FN);
  73. #ifdef notused
  74.     h_fn =
  75.         (char *) malloc(3 + strlen(cp) + strlen(cproot) + strlen(HOST_FN));
  76.     if (h_fn)
  77.         sprintf(h_fn, "%s%s%s", cp, cproot, HOST_FN);
  78.     s_fn =
  79.         (char *) malloc(3 + strlen(cp) + strlen(cproot) + strlen(SERV_FN));
  80.     if (s_fn)
  81.         sprintf(s_fn, "%s%s%s", cp, cproot, SERV_FN);
  82.     n_fn =
  83.         (char *) malloc(3 + strlen(cp) + strlen(cproot) + strlen(NETW_FN));
  84.     if (n_fn)
  85.         sprintf(n_fn, "%s%s%s", cp, cproot, NETW_FN);
  86. #endif
  87. }
  88. /*
  89.  * sets can open. ends must close. 
  90.  */
  91. void
  92. endhostent(void)
  93. {
  94.     if (h_fp)
  95.         fclose(h_fp);
  96.     h_fp = 0;
  97. }
  98. void
  99. endservent(void)
  100. {
  101.     if (s_fp)
  102.         fclose(s_fp);
  103.     s_fp = 0;
  104. }
  105. void
  106. endprotoent(void)
  107. {
  108.     if (p_fp)
  109.         fclose(p_fp);
  110.     p_fp = 0;
  111. }
  112. void
  113. endnetent(void)
  114. {
  115.     if (n_fp)
  116.         fclose(n_fp);
  117.     n_fp = 0;
  118. }
  119. void
  120. sethostent(int stay_open)
  121. {
  122.     pre_env();
  123.     endhostent();
  124.     h_stay_open = stay_open;
  125. }
  126. void
  127. setservent(int stay_open)
  128. {
  129.     pre_env();
  130.     endservent();
  131.     s_stay_open = stay_open;
  132. }
  133. void
  134. setprotoent(int stay_open)
  135. {
  136.     pre_env();
  137.     endprotoent();
  138.     p_stay_open = stay_open;
  139. }
  140. void
  141. setnetent(int stay_open)
  142. {
  143.     pre_env();
  144.     endnetent();
  145.     n_stay_open = stay_open;
  146. }
  147. #define STRTOK_DELIMS " tn"
  148. /*
  149.  * get next entry from data base file, or from NIS if possible. 
  150.  */
  151. /*
  152.  * returns 0 if there are no more entries to read. 
  153.  */
  154. struct hostent *
  155. gethostent(void)
  156. {
  157.     return 0;
  158. }
  159. struct servent *
  160. getservent(void)
  161. {
  162.     return 0;
  163. }
  164. struct protoent *
  165. getprotoent(void)
  166. {
  167.     char           *cp, **alp, lbuf[256];
  168.     static struct protoent spx;
  169.     static char    *ali[10];
  170.     struct protoent *px = &spx;
  171.     int             linecnt = 0;
  172.     char            *st;
  173.     for (alp = ali; *alp; free(*alp), *alp = 0, alp++);
  174.     if (px->p_name)
  175.         free(px->p_name);
  176.     px->p_aliases = ali;
  177.     if (!p_fn)
  178.         return 0;
  179.     if (!p_fp)
  180.         p_fp = fopen(p_fn, "r");
  181.     if (!p_fp)
  182.         return 0;
  183.     while (fgets(lbuf, sizeof(lbuf), p_fp)) {
  184.         linecnt++;
  185.         cp = lbuf;
  186.         if (*cp == '#')
  187.             continue;
  188.         cp = strtok_r(lbuf, STRTOK_DELIMS, &st);
  189.         if (!cp)
  190.             continue;
  191.         if (cp)
  192.             px->p_name = strdup(cp);
  193.         cp = strtok_r(NULL, STRTOK_DELIMS, &st);
  194.         if (!cp) {
  195.             free(px->p_name);
  196.             continue;
  197.         }
  198.         px->p_proto = (short) atoi(cp);
  199.         for (alp = px->p_aliases; cp; alp++) {
  200.             cp = strtok_r(NULL, STRTOK_DELIMS, &st);
  201.             if (!cp)
  202.                 break;
  203.             if (*cp == '#')
  204.                 break;
  205.             *alp = strdup(cp);
  206.         }
  207.         return (px);
  208.     }
  209.     return 0;
  210. }
  211. struct netent  *
  212. getnetent(void)
  213. {
  214.     return 0;
  215. }
  216. struct netent  *
  217. getnetbyaddr(long net, int type)
  218. {
  219.     return 0;
  220. }
  221. /*
  222.  * Return the network number from an internet address 
  223.  */
  224. u_long
  225. inet_netof(struct in_addr in)
  226. {
  227.     register u_long i = ntohl(in.s_addr);
  228.     u_long          ii = (i >> 24) & 0xff;
  229.     if (0 == (ii & 0x80))
  230.         return ((0xff000000 & i) >> 24);
  231.     if (0x80 == (ii & 0xc0))
  232.         return ((0xffff0000 & i) >> 16);
  233.     /*
  234.      * if (0xc0 == (ii & 0xe0))
  235.      */
  236.     return ((0xffffff00 & i) >> 8);
  237. }
  238. /*
  239.  * Return the host number from an internet address 
  240.  */
  241. u_long
  242. inet_lnaof(struct in_addr in)
  243. {
  244.     register u_long i = ntohl(in.s_addr);
  245.     u_long          ii = (i >> 24) & 0xff;
  246.     if (0 == (ii & 0x80))
  247.         return (0x00ffffff & i);
  248.     if (0x80 == (ii & 0xc0))
  249.         return (0x0000ffff & i);
  250.     /*
  251.      * if (0xc0 == (ii & 0xe0)) 
  252.      */
  253.     return (0x000000ff & i);
  254. }
  255. #endif                          /* WIN32 or cygwin */