services.c
上传用户:tjescc
上传日期:2021-02-23
资源大小:419k
文件大小:4k
源码类别:

Telnet服务器

开发平台:

Unix_Linux

  1. /* 
  2.  * Copyright (C) 2002 Michel Arboi
  3.  *
  4.  * This library is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU Library General Public
  6.  * License as published by the Free Software Foundation; either
  7.  * version 2 of the License, or (at your option) any later version.
  8.  *
  9.  * This library is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12.  * Library General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU Library General Public
  15.  * License along with this library; if not, write to the Free
  16.  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  *
  18.  * TCP/IP service functions (getservent enhancement)
  19.  */ 
  20. #define EXPORTING
  21. #include <includes.h>
  22. #include <stdarg.h>
  23. #include <sys/mman.h>
  24. #include <sys/types.h>
  25. #include <sys/stat.h>
  26. #include <unistd.h>
  27. #ifndef MAP_FAILED
  28. #define MAP_FAILED ((void*)-1)
  29. #endif
  30. #include "services.h"
  31. #include "libnessus.h"
  32. /* IMPORTANT ! Some options are defined in services.h */
  33. static int
  34. cmp_ns_svc(const void *v1,
  35.    const void *v2)
  36. {
  37.   const struct nessus_service * p1 = v1;
  38.   const struct nessus_service * p2 = v2;
  39.   
  40.   if(v1 == NULL)
  41.    return 1;
  42.   else if(v2 == NULL)
  43.    return -1;
  44.   
  45.   return p1->ns_port - p2->ns_port;
  46. }
  47. ExtFunc const char*
  48. nessus_get_svc_name(int port, const char* proto)
  49. {
  50.   static struct nessus_service *svc_db_ptr[2] = { NULL, NULL };
  51.   static int nb_svc[2];
  52.   int fd = -1, len, idx;
  53.   struct stat st;
  54.   struct nessus_service *pns, kns;
  55.   struct servent *svc;
  56.   if (proto != NULL && strcmp(proto, "udp") == 0)
  57.     idx = 1;
  58.   else
  59.     idx = 0; /* default to TCP */
  60.   if (svc_db_ptr[idx] == NULL)
  61.     {
  62.       if ((fd = open(idx ? NESSUS_SERVICES_UDP : NESSUS_SERVICES_TCP, O_RDONLY)) >= 0)
  63. {
  64.   if (fstat(fd, &st) < 0)
  65.     perror("fstat");
  66.   else
  67.     {
  68.       len = st.st_size;
  69.       nb_svc[idx] = len / sizeof(struct nessus_service);
  70.       if ((svc_db_ptr[idx] = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, 0))== MAP_FAILED )
  71. {
  72. perror("mmap");
  73. svc_db_ptr[idx] = NULL;
  74. }
  75.     }
  76. }
  77.     }
  78.   if (svc_db_ptr[idx] == NULL)
  79.     {
  80.       if (fd > 0)
  81. close(fd);
  82.     }
  83.   else
  84.     {
  85.       kns.ns_port = port;
  86.       pns = bsearch(&kns, svc_db_ptr[idx], nb_svc[idx], sizeof(kns), cmp_ns_svc);
  87.       if (pns != NULL)
  88. return pns->ns_name;
  89. #ifdef NESSUS_SVC_READS_ETC_SERVICES
  90.       else
  91. return "unknown";
  92. #endif
  93.     }
  94.   setservent(1); /* Rewinds /etc/services and keep the file open */
  95.   svc = getservbyport(htons((unsigned short) port), proto);
  96.   if (svc == NULL)
  97.     return "unknown";
  98.   else
  99.     return svc->s_name;
  100. }
  101. ExtFunc unsigned short * get_tcp_svcs(int * num)
  102. {
  103.   struct nessus_service * ns = NULL;
  104.   int len, num_svc;
  105.   unsigned short * ret;
  106.   int fd, i;
  107.   struct stat st;
  108.   if ((fd = open(NESSUS_SERVICES_TCP, O_RDONLY)) >= 0)
  109. {
  110.   if (fstat(fd, &st) < 0)
  111.     perror("fstat");
  112.   else
  113.     {
  114.       len = st.st_size;
  115.       num_svc = len / sizeof(struct nessus_service);
  116.       if ((ns = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, 0))== MAP_FAILED ) {
  117. perror("mmap");
  118. ns = NULL;
  119. }
  120.     }
  121. }
  122.   if (ns == NULL)
  123.     {
  124.     struct servent  * ent;
  125.     int n = 0;
  126.     ret = emalloc(sizeof(unsigned short) * 65537);
  127.     endservent();
  128.     while ( (ent = getservent()) != NULL )
  129.     {
  130.     if(strcmp(ent->s_proto, "tcp") == 0 && ntohs(ent->s_port))
  131.     {
  132.     ret[n++] = ntohs(ent->s_port);
  133.     if(n >= 65537)break;
  134.     }
  135.     }
  136.     endservent();
  137.     if(num != NULL)
  138.     *num = n;
  139.     ret = erealloc(ret, sizeof(unsigned short) * (n+1)); 
  140.     ret[n] = 0;
  141.     return ret;
  142.     }
  143.   else
  144.     {
  145.     ret = emalloc(sizeof(unsigned short) * (num_svc + 1));
  146.     for(i=0;i<num_svc;i++)
  147.     {
  148.     ret[i] = ns[i].ns_port;
  149.       }
  150.     if(num != NULL)
  151.     *num = num_svc;
  152.     munmap(ns, len);
  153.     close(fd);
  154.     }
  155.  return ret;
  156. }