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

Telnet服务器

开发平台:

Unix_Linux

  1. /* Nessuslib -- the Nessus Library
  2.  * Copyright (C) 1998 - 2002 Renaud Deraison
  3.  * SSL Support Copyright (C) 2001 Michel Arboi
  4.  *
  5.  * This library is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU Library General Public
  7.  * License as published by the Free Software Foundation; either
  8.  * version 2 of the License, or (at your option) any later version.
  9.  *
  10.  * This library is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * Library General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU Library General Public
  16.  * License along with this library; if not, write to the Free
  17.  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  *
  19.  * Network Functions
  20.  */ 
  21. #define EXPORTING
  22. #include <includes.h>
  23. #include <stdarg.h>
  24. #include "libnessus.h"
  25. #include "network.h"
  26. #include "resolve.h"
  27. #include "ids_send.h"
  28. #include <setjmp.h>
  29. #ifdef HAVE_SSL
  30. #include <openssl/bio.h>
  31. #include <openssl/err.h>
  32. #include <openssl/rand.h>
  33. #endif
  34. #define TIMEOUT 20
  35. #ifndef INADDR_NONE
  36. #define INADDR_NONE 0xffffffff
  37. #endif
  38. extern int plug_get_port_transport(struct arglist*, int);
  39. extern void plug_set_port_transport(struct arglist*, int, int);
  40. /*----------------------------------------------------------------*
  41.  * Low-level connection management                                *
  42.  *----------------------------------------------------------------*/
  43.  
  44. /* Nessus "FILE" structure */
  45. typedef struct {
  46.  int fd; /* socket number, or whatever */
  47.  int transport; /* "transport" layer code when stream is encapsultated. 
  48.  * Negative transport signals a free descriptor */
  49.  int timeout;   /* timeout, in seconds
  50.    * special values: -2 for default */
  51.  int options; /* Misc options - see libnessus.h */
  52.   
  53.  int port;  
  54. #ifdef HAVE_SSL
  55.   SSL_CTX*  ssl_ctx; /* SSL context  */
  56.   SSL_METHOD*  ssl_mt; /* SSL method   */
  57.   SSL*  ssl; /* SSL handler  */
  58.   int last_ssl_err; /* Last SSL error code */
  59. #endif
  60.  pid_t pid; /* Owner - for debugging only */
  61.   char* buf; /* NULL if unbuffered */
  62.   int bufsz, bufcnt, bufptr;
  63.   int  last_err;
  64. } nessus_connection;
  65. /* 
  66.  * The role of this offset is:
  67.  * 1. To detect bugs when the program tries to write to a bad fd
  68.  * 2. See if a fd is a real socket or a "nessus descriptor". This is a
  69.  * quick & dirty hack and should be changed!!!
  70.  */
  71. #define NESSUS_FD_MAX 1024
  72. #define NESSUS_FD_OFF 1000000
  73. static nessus_connection connections[NESSUS_FD_MAX];
  74. /*
  75.  * Quick & dirty patch to run Nessus from behind a picky firewall (e.g.
  76.  * FW/1 and his 'Rule 0'): Nessus will never open more than 1 connection at
  77.  * a time.
  78.  * Define NESSUS_CNX_LOCK, recompile and install nessus-library, and restart nessusd
  79.  *
  80.  * WARNING: waiting on the lock file may be long, so increase the default
  81.  * script timeout or some scripts may be killed.
  82.  */
  83. #undef NESSUS_CNX_LOCK
  84. /*#define NESSUS_CNX_LOCK "/tmp/NessusCnx"*/
  85. #ifdef NESSUS_CNX_LOCK
  86. static int lock_cnt = 0;
  87. static int lock_fd = -1;
  88. #endif
  89. /*
  90.  * NESSUS_STREAM(x) is TRUE if <x> is a Nessus-ified fd
  91.  */
  92. #define NESSUS_STREAM(x) (((x - NESSUS_FD_OFF) < NESSUS_FD_MAX) && ((x - NESSUS_FD_OFF) >=0))
  93. static void
  94. renice_myself()
  95. {
  96.  static pid_t pid = 0;
  97.  pid_t cpid = getpid();
  98.  
  99.  if( pid != cpid )
  100.  {
  101.   if(nice(0) >= 10)return;
  102.   pid = cpid;
  103.   nice(1);
  104.  }
  105. }
  106. /*
  107.  * Same as perror(), but prefixes the data by our pid
  108.  */
  109. static int 
  110. nessus_perror(error)
  111.  const char* error;
  112. {
  113.   fprintf(stderr, "[%d] %s : %sn", getpid(), error, strerror(errno));
  114.   return 0;
  115. }
  116. /*
  117.  * Returns the amount of data waiting to be read in the socket
  118.  * or -1 in case of an error (errno will be set)
  119.  */
  120. #if 0
  121. static int data_left(soc)
  122.  int soc;
  123. {
  124.  int len = 0;
  125.  int ret = ioctl(soc, FIONREAD, &len);
  126.  if (ret >= 0) {
  127.   if(len <= 0)
  128.    return 0;
  129.   else 
  130.    return len;
  131.  }
  132.  else {
  133.   nessus_perror("ioctl(FIONREAD)");
  134.   return -1;
  135.  }
  136. } /* data_left */
  137. #endif
  138. int
  139. stream_get_err(fd)
  140.  int fd;
  141. {
  142.  nessus_connection *p;
  143.  
  144.  if(!NESSUS_STREAM(fd))
  145.     {
  146.      errno = EINVAL;
  147.      return -1;
  148.     }
  149.     
  150.     
  151.  p = &(connections[fd - NESSUS_FD_OFF]);
  152.  return p->last_err;
  153. }
  154. /*
  155.  * Returns a free file descriptor
  156.  */
  157. static int
  158. get_connection_fd()
  159. {
  160.  int i;
  161.  
  162.  for ( i = 0; i < NESSUS_FD_MAX ; i++)
  163.  {
  164.   if(connections[i].transport <= 0) /* Not used */
  165.   {
  166.    bzero(&(connections[i]),  sizeof(connections[i]));
  167.    connections[i].pid = getpid();
  168.    return i + NESSUS_FD_OFF;
  169.   }
  170.  }
  171.  fprintf(stderr, "[%d] %s:%d : Out of Nessus file descriptorsn", 
  172.  getpid(), __FILE__, __LINE__);
  173.  errno = EMFILE;
  174.  return -1;
  175. }
  176. static int
  177. release_connection_fd(fd)
  178.  int fd;
  179. {
  180.  nessus_connection *p;
  181.  
  182.  if(!NESSUS_STREAM(fd))
  183.     {
  184.      errno = EINVAL;
  185.      return -1;
  186.     }
  187.     
  188.     
  189.  p = &(connections[fd - NESSUS_FD_OFF]);
  190.  efree(&p->buf);
  191. #ifdef HAVE_SSL
  192.  if (p->ssl != NULL)
  193.   SSL_free(p->ssl);
  194.  if (p->ssl_ctx != NULL)
  195.   SSL_CTX_free(p->ssl_ctx);
  196. #endif
  197. /* 
  198.  * So far, fd is always a socket. If this is changed in the future, this
  199.  * code shall be fixed
  200.  */
  201. if (p->fd >= 0)
  202.  {
  203.   if (shutdown(p->fd, 2) < 0)
  204.     {
  205. #if DEBUG_SSL > 1
  206.     /*
  207.      * It's not uncommon to see that one fail, since a lot of
  208.      * services close the connection before we ask them to
  209.      * (ie: http), so we don't show this error by default
  210.      */
  211.     nessus_perror("release_connection_fd: shutdown()");
  212. #endif    
  213.     }
  214.   if (socket_close(p->fd)  < 0)
  215.     nessus_perror("release_connection_fd: close()");
  216.  }
  217.  bzero(p, sizeof(*p));
  218.  p->transport = -1; 
  219.  return 0;
  220. }
  221. /* ******** Compatibility function ******** */
  222. ExtFunc int
  223. nessus_register_connection(s, ssl)
  224.      int s;
  225. #ifdef HAVE_SSL
  226.      SSL *ssl;
  227. #else
  228.      void *ssl;
  229. #endif
  230. {
  231.   int fd;
  232.   nessus_connection *p;
  233.   if((fd = get_connection_fd()) < 0)
  234.     return -1;
  235.   p = connections + (fd - NESSUS_FD_OFF);
  236. #ifdef HAVE_SSL 
  237.   p->ssl_ctx = NULL;
  238.   p->ssl_mt = NULL; /* shall be freed elsewhere */
  239.   p->ssl = ssl; /* will be freed on close */
  240. #endif  
  241.   p->timeout = TIMEOUT; /* default value */
  242.   p->port = 0; /* just used for debug */
  243.   p->fd = s;
  244.   p->transport = (ssl != NULL) ? NESSUS_ENCAPS_SSLv23 : NESSUS_ENCAPS_IP;
  245.   p->last_err  = 0;
  246.   return fd;
  247. }
  248. ExtFunc int
  249. nessus_deregister_connection(fd)
  250.  int fd;
  251. {
  252.  nessus_connection * p;
  253.  if(!NESSUS_STREAM(fd))
  254.  {
  255.   errno = EINVAL;
  256.   return -1;
  257.  }
  258.  
  259.  p = connections +  (fd - NESSUS_FD_OFF);
  260.  bzero(p, sizeof(*p));
  261.  p->transport = -1; 
  262.  return 0;
  263. }
  264. /*----------------------------------------------------------------*
  265.  * High-level connection management                               *
  266.  *----------------------------------------------------------------*/
  267. static int __port_closed;
  268. static int unblock_socket(int soc)
  269. {
  270.   int flags =  fcntl(soc, F_GETFL, 0);
  271.   if (flags < 0)
  272. {
  273.       nessus_perror("fcntl(F_GETFL)");
  274.       return -1;
  275.     }
  276.   if (fcntl(soc, F_SETFL, O_NONBLOCK | flags) < 0)
  277.     {
  278.       nessus_perror("fcntl(F_SETFL,O_NONBLOCK)");
  279.       return -1;
  280.     }
  281.   return 0;
  282. }
  283. static int block_socket(int soc)
  284. {
  285.   int flags =  fcntl(soc, F_GETFL, 0);
  286.   if (flags < 0)
  287.     {
  288.       nessus_perror("fcntl(F_GETFL)");
  289.       return -1;
  290.     }
  291.   if (fcntl(soc, F_SETFL, (~O_NONBLOCK) & flags) < 0)
  292.     {
  293.       nessus_perror("fcntl(F_SETFL,~O_NONBLOCK)");
  294.       return -1;
  295.     }
  296.   return 0;
  297. }
  298. /*
  299.  * Initialize the SSL library (error strings and algorithms) and try
  300.  * to set the pseudo random generator to something less silly than the
  301.  * default value: 1 according to SVID 3, BSD 4.3, ISO 9899 :-(
  302.  */
  303. #ifdef HAVE_SSL
  304. /* Adapted from stunnel source code */
  305. ExtFunc
  306. void sslerror2(txt, err)
  307.      char *txt;
  308.      int err;
  309. {
  310.   char string[120];
  311.   ERR_error_string(err, string);
  312.   fprintf(stderr, "[%d] %s: %sn", getpid(), txt, string);
  313. }
  314. void
  315. sslerror(txt)
  316.      char *txt;
  317. {
  318.   sslerror2(txt, ERR_get_error());
  319. }
  320. #endif
  321. ExtFunc int
  322. nessus_SSL_init(path)
  323.      char *path; /* entropy pool file name */
  324. {
  325. #ifdef HAVE_SSL
  326.   SSL_library_init();
  327.   SSL_load_error_strings();
  328. #ifdef HAVE_RAND_STATUS
  329.   if (RAND_status() == 1)
  330.     {
  331.     /* The random generator is happy with its current entropy pool */
  332.     return 0;
  333.    }
  334. #endif
  335.   /*
  336.    * Init the random generator
  337.    *
  338.    * OpenSSL provides nice functions for this job.
  339.    * OpenSSL also ensures that each thread uses a different seed.
  340.    * So this function should be called *before* forking.
  341.    * Cf. http://www.openssl.org/docs/crypto/RAND_add.html#
  342.    *
  343.    * On systems that have /dev/urandom, SSL uses it transparently to seed 
  344.    * its PRNG
  345.    */
  346.  
  347. #if 0
  348.   RAND_screen(); /* Only available under MSWin */
  349. #endif
  350. #ifdef EGD_PATH
  351.   /*
  352.    * We have the entropy gathering daemon.
  353.    * However, OpenSSL automatically query it if it is not in some odd place
  354.    */
  355.   if(RAND_egd(EGD_PATH) > 0)
  356.   return 0;
  357. #endif
  358.    if (path != NULL)
  359.     {
  360.     (void) RAND_load_file(path, -1);
  361.     RAND_write_file(path);
  362.     }
  363.    else
  364.    {
  365.     /*
  366.      * Try with the default path
  367.      */
  368.     char path[1024];
  369.     if(RAND_file_name(path, sizeof(path) - 1) == 0)
  370.     return -1;
  371.     path[sizeof(path) - 1] = '';
  372.     if(RAND_load_file(path, -1) < 0)
  373.     return -1;
  374.     RAND_write_file(path);
  375.     return 0;
  376.    } 
  377. #endif
  378.    return -1;
  379. }
  380. #ifdef HAVE_SSL
  381. # if 0
  382. ExtFunc void
  383. nessus_print_SSL_certificate(cert)
  384.      X509* cert;    
  385. {
  386.  BIO * b;
  387.  BUF_MEM * bptr;
  388.  char * ret = NULL;
  389.  int i;
  390.  if(cert == NULL)
  391.    return;
  392.  b = BIO_new(BIO_s_mem());
  393.  if(X509_print(b, cert) > 0)
  394.    {
  395.      BIO_get_mem_ptr(b, &bptr);
  396.      printf("* Peer certificate *n");
  397.      for(i = 0; i < bptr->length; i ++)
  398.        putchar(bptr->data[i]);
  399.      printf("n********************n");
  400.    }
  401.  BIO_free(b);
  402. }
  403. ExtFunc void
  404. nessus_print_peer_SSL_certificate(ssl)
  405.      SSL* ssl;
  406. {
  407.   X509 * cert = SSL_get_peer_certificate(ssl);
  408.   nessus_print_SSL_certificate(cert);
  409. }
  410. # endif
  411. #endif
  412. static int
  413. nessus_SSL_password_cb(buf, size, rwflag, userdata)
  414.      char *buf;
  415.      int size;
  416.      int rwflag;
  417.      void *userdata;
  418. {
  419.   if (userdata != NULL)
  420.     {
  421.       buf[size - 1] = '';
  422.       strncpy(buf, userdata, size - 1);
  423.       return strlen(buf);
  424.     }
  425.   else
  426.     {
  427. #if DEBUG_SSL > 1
  428.       fprintf(stderr, "nessus_SSL_password_cb: returning empty passwordn");
  429. #endif
  430.       *buf = '';
  431.       return 0;
  432.     }
  433. }
  434. ExtFunc int
  435. nessus_get_socket_from_connection(fd)
  436.      int fd;
  437. {
  438.   nessus_connection *fp;
  439.   if (!NESSUS_STREAM(fd))
  440.     {
  441.       fprintf(stderr,
  442.       "[%d] nessus_get_socket_from_connection: bad fd <%d>n", getpid(), fd);
  443.       fflush(stderr);
  444.       return fd;
  445.     }
  446.   fp = connections + (fd - NESSUS_FD_OFF);
  447.   if(fp->transport <= 0)
  448.     {
  449.       fprintf(stderr, "nessus_get_socket_from_connection: fd <%d> is closedn", fd);
  450.       return -1;
  451.     }
  452.   return fp->fd;
  453. }
  454. #ifdef HAVE_SSL
  455. ExtFunc void
  456. nessus_install_passwd_cb(ssl_ctx, pass)
  457.      SSL_CTX *ssl_ctx;
  458.      char *pass;
  459. {
  460.   SSL_CTX_set_default_passwd_cb(ssl_ctx, nessus_SSL_password_cb);
  461.   SSL_CTX_set_default_passwd_cb_userdata(ssl_ctx, pass);
  462. }
  463. static int
  464. open_SSL_connection(fp, timeout, cert, key, passwd, cert_names)
  465.      nessus_connection *fp;
  466.      int timeout;
  467.      char *cert, *key, *passwd; 
  468.      STACK_OF(X509_NAME) *cert_names;
  469. {
  470.   int ret, err, d;
  471.   time_t tictac;
  472.   fd_set fdw, fdr;
  473.   struct timeval to;
  474.   nessus_SSL_init(NULL);
  475.   switch (fp->transport)
  476.     {
  477.     case NESSUS_ENCAPS_SSLv2:
  478.       fp->ssl_mt = SSLv2_client_method();
  479.       break;
  480.     case NESSUS_ENCAPS_SSLv3:
  481.       fp->ssl_mt = SSLv3_client_method();
  482.       break;
  483.     case NESSUS_ENCAPS_TLSv1:
  484.       fp->ssl_mt = TLSv1_client_method();
  485.       break;
  486.     case NESSUS_ENCAPS_SSLv23: /* Compatibility mode */
  487.       fp->ssl_mt = SSLv23_client_method();
  488.       break;
  489.       
  490.     default:
  491. #if DEBUG_SSL > 0
  492.       fprintf(stderr, "*Bug* at %s:%d. Unknown transport %dn",
  493.       __FILE__, __LINE__, fp->transport);
  494. #endif
  495.       fp->ssl_mt = SSLv23_client_method();
  496.       break;
  497.     }
  498.   if((fp->ssl_ctx = SSL_CTX_new(fp->ssl_mt)) == NULL)
  499.     return -1;
  500.   if (SSL_CTX_set_options(fp->ssl_ctx, SSL_OP_ALL) < 0)
  501.     sslerror("SSL_CTX_set_options(SSL_OP_ALL)");
  502.   if ((fp->ssl = SSL_new(fp->ssl_ctx)) == NULL)
  503.     return -1;
  504.   /* Client certificates should not be used if we are in SSLv2 */
  505.   if (fp->transport != NESSUS_ENCAPS_SSLv2) {
  506.   SSL_CTX_set_default_passwd_cb(fp->ssl_ctx, nessus_SSL_password_cb);
  507.   SSL_CTX_set_default_passwd_cb_userdata(fp->ssl_ctx, passwd);
  508.   if (cert != NULL)
  509.     SSL_use_certificate_file(fp->ssl, cert, SSL_FILETYPE_PEM);
  510.   if (key != NULL)
  511. #if 1
  512.     SSL_use_PrivateKey_file(fp->ssl, key, SSL_FILETYPE_PEM);
  513. #else
  514.     SSL_use_RSAPrivateKey_file(fp->ssl, key, SSL_FILETYPE_PEM);
  515. #endif
  516.     if (cert_names != NULL)
  517.       SSL_CTX_set_client_CA_list(fp->ssl_ctx, cert_names);
  518.     }
  519.   unblock_socket(fp->fd);
  520.   if(! (ret = SSL_set_fd(fp->ssl, fp->fd)))
  521.     {
  522. #if DEBUG_SSL > 0
  523.       sslerror("SSL_set_fd");
  524. #endif    
  525.       return -1;
  526.     }
  527.     
  528.   tictac = time(NULL);
  529.   for (;;)
  530.     {
  531.   ret = SSL_connect(fp->ssl);
  532. #if 0
  533.       block_socket(fp->fd);
  534. #endif
  535.       if (ret > 0)
  536. return ret;
  537.       fp->last_ssl_err = err = SSL_get_error(fp->ssl, ret);
  538.       FD_ZERO(&fdr); FD_ZERO(&fdw);
  539.       switch (err)
  540.     {
  541. case SSL_ERROR_WANT_READ:
  542. #if DEBUG_SSL > 2
  543.   fprintf(stderr, "SSL_Connect[%d]: SSL_ERROR_WANT_READn", getpid());
  544. #endif
  545.   FD_SET(fp->fd, &fdr);
  546.   break;
  547. case SSL_ERROR_WANT_WRITE:
  548. #if DEBUG_SSL > 2
  549.   fprintf(stderr, "SSL_Connect[%d]: SSL_ERROR_WANT_WRITEn", getpid());
  550. #endif
  551.   FD_SET(fp->fd, &fdw);
  552.   break;
  553. default:
  554. #ifdef DEBUG_SSL 
  555.   sslerror2("SSL_connect", err);
  556. #endif
  557.          return -1;
  558.     }
  559.      
  560.       do
  561. {
  562.   d = tictac + timeout - time(NULL);
  563.   if (d <= 0)
  564.     {
  565.     fp->last_err = ETIMEDOUT;
  566.     return -1;
  567.             }
  568.   to.tv_sec = d;
  569.   to.tv_usec = 0;
  570.   errno = 0;
  571.   if ((ret = select(fp->fd + 1, &fdr, &fdw, NULL, &to)) <= 0)
  572.     {
  573. #if DEBUG_SSL > 1
  574.       nessus_perror("select");
  575. #endif
  576.     }
  577. }
  578.       while (ret < 0 && errno == EINTR);
  579.       if (ret <= 0)
  580. {
  581. fp->last_err = ETIMEDOUT;
  582. return -1;
  583.         }
  584.     }
  585.   /*NOTREACHED*/
  586. }
  587. #endif
  588. static void
  589. set_ids_evasion_mode(args, fp)
  590.      struct arglist *args;
  591.      nessus_connection *fp;
  592. {
  593.  struct kb_item ** kb = plug_get_kb(args);
  594.  char *ids_evasion_split = kb_item_get_str(kb, "NIDS/TCP/split");
  595.  char  *ids_evasion_inject = kb_item_get_str(kb, "NIDS/TCP/inject");
  596.  char  *ids_evasion_short_ttl = kb_item_get_str(kb,"NIDS/TCP/short_ttl");
  597.  char *ids_evasion_fake_rst = kb_item_get_str(kb, "NIDS/TCP/fake_rst");
  598.  int option = 0;
  599.  
  600.  
  601.  /*
  602.   * These first three options are mutually exclusive
  603.   */
  604.  if(ids_evasion_split != NULL && strcmp(ids_evasion_split, "yes") == 0)
  605.   option = NESSUS_CNX_IDS_EVASION_SPLIT;
  606.  if(ids_evasion_inject != NULL && strcmp(ids_evasion_inject, "yes") == 0)
  607.   option = NESSUS_CNX_IDS_EVASION_INJECT;
  608.  
  609.  if(ids_evasion_short_ttl != NULL && strcmp(ids_evasion_short_ttl, "yes") == 0)
  610.   option = NESSUS_CNX_IDS_EVASION_SHORT_TTL;
  611.  /*
  612.   * This is not exclusive with the above
  613.   */
  614.  if(ids_evasion_fake_rst != NULL && strcmp(ids_evasion_fake_rst, "yes") == 0)
  615.   option |= NESSUS_CNX_IDS_EVASION_FAKE_RST;
  616.  if(option)
  617.    {
  618. #ifdef SO_SNDLOWAT
  619.      int n = 1;
  620.      (void) setsockopt(fp->fd, SOL_SOCKET, SO_SNDLOWAT, (void*)&n, sizeof(n));
  621. #endif
  622.      fp->options |= option;
  623.    }
  624. }
  625. ExtFunc int
  626. open_stream_connection(args, port, transport, timeout)
  627.  struct arglist * args;
  628.  unsigned int port;
  629.  int transport, timeout;
  630. {
  631.  int fd;
  632.  nessus_connection * fp;
  633. #ifdef HAVE_SSL
  634.  char * cert   = NULL;
  635.  char * key    = NULL;
  636.  char * passwd = NULL;
  637.  char * cafile = NULL;
  638.  STACK_OF(X509_NAME) *cert_names = NULL;
  639. #endif
  640. #if DEBUG_SSL > 2
  641.  fprintf(stderr, "[%d] open_stream_connection: TCP:%d transport:%d timeout:%dn",
  642.        getpid(), port, transport, timeout);
  643. #endif
  644.  if(timeout == -2)
  645.   timeout = TIMEOUT;
  646.   
  647.  switch(transport)
  648.  {
  649.   case NESSUS_ENCAPS_IP:
  650. #ifdef HAVE_SSL
  651.   case NESSUS_ENCAPS_SSLv2:
  652.   case NESSUS_ENCAPS_SSLv23:
  653.   case NESSUS_ENCAPS_SSLv3:
  654.   case NESSUS_ENCAPS_TLSv1:
  655. #endif 
  656.    break;
  657.   default:
  658.    fprintf(stderr, "open_stream_connection(): unsupported transport layer %dn",
  659.     transport);
  660.    errno = EINVAL;
  661.    return -1;
  662.  }
  663.  
  664.  if((fd = get_connection_fd()) < 0)
  665.   return -1;
  666.  
  667.  fp = &(connections[fd - NESSUS_FD_OFF]);
  668.  
  669.  
  670.  fp->transport = transport;
  671.  fp->timeout   = timeout;
  672.  fp->port      = port;
  673.  fp->last_err  = 0;
  674.  set_ids_evasion_mode(args, fp);
  675.  if(fp->options & NESSUS_CNX_IDS_EVASION_FAKE_RST)
  676.    fp->fd = ids_open_sock_tcp(args, port, fp->options, timeout);
  677.  else
  678.    fp->fd = open_sock_tcp(args, port, timeout);
  679.   if(fp->fd < 0)
  680.   goto failed;
  681.  switch(transport)
  682.  {
  683.   case NESSUS_ENCAPS_IP:
  684.     break;
  685. #ifdef HAVE_SSL
  686.   case NESSUS_ENCAPS_SSLv23:
  687.   case NESSUS_ENCAPS_SSLv3:
  688.   case NESSUS_ENCAPS_TLSv1:
  689.     renice_myself();
  690.     cert   = kb_item_get_str(plug_get_kb(args), "SSL/cert");
  691.     key    = kb_item_get_str(plug_get_kb(args), "SSL/key");
  692.     passwd = kb_item_get_str(plug_get_kb(args), "SSL/password");
  693.     cafile = kb_item_get_str(plug_get_kb(args), "SSL/CA");
  694.     if ((cafile != NULL) && cafile[0] != '')
  695.       {
  696. cert_names = SSL_load_client_CA_file(cafile);
  697. if (cert_names == NULL)
  698.   {
  699.     char msg[512];
  700.     snprintf(msg, sizeof(msg), "SSL_load_client_CA_file(%s)", cafile);
  701.     sslerror(msg);
  702.   }
  703.      }
  704.    
  705.   case NESSUS_ENCAPS_SSLv2:
  706.     /* We do not need a client certificate in this case */
  707.     if (open_SSL_connection(fp, timeout, cert, key, passwd, cert_names) <= 0)
  708.     goto failed;
  709.   break;
  710. #endif
  711.  }
  712.  
  713.  return fd;
  714. failed:
  715.  release_connection_fd(fd);
  716.  return -1;
  717. }
  718. ExtFunc int
  719. open_stream_connection_unknown_encaps5(args, port, timeout, p, delta_t)
  720.  struct arglist * args;
  721.  unsigned int  port;
  722.  int timeout, * p;
  723.  int *delta_t; /* time, in micro-seconds */
  724. {
  725.  int fd;
  726.  int i;
  727.   struct timeval tv1, tv2;
  728.  static int encaps[] = {
  729. #ifdef HAVE_SSL
  730.    NESSUS_ENCAPS_SSLv2,
  731.    NESSUS_ENCAPS_TLSv1,
  732.    NESSUS_ENCAPS_SSLv3,
  733. #endif
  734.     NESSUS_ENCAPS_IP
  735.   };
  736.  
  737. #if DEBUG_SSL > 2
  738.  fprintf(stderr, "[%d] open_stream_connection_unknown_encaps: TCP:%d; %dn",
  739.  getpid(), port,timeout);
  740. #endif
  741.  for (i = 0; i < sizeof(encaps) / sizeof(*encaps); i ++)
  742.     {
  743.       if (delta_t != NULL) (void) gettimeofday(&tv1, NULL);
  744.    if ((fd = open_stream_connection(args, port, encaps[i], timeout)) >= 0)
  745.      {
  746.        *p = encaps[i];
  747. #if DEBUG_SSL > 2
  748.        fprintf(stderr, "[%d] open_stream_connection_unknown_encaps: TCP:%d -> transport=%dn", getpid(), port, *p);
  749. #endif
  750.   if (delta_t != NULL)
  751.     {
  752.       (void) gettimeofday(&tv2, NULL);
  753.       *delta_t = (tv2.tv_sec - tv1.tv_sec) * 1000000 + (tv2.tv_usec - tv1.tv_usec);
  754.     }
  755.        return fd;
  756.      }
  757.    else if (__port_closed)
  758.      {
  759. #if DEBUG_SSL > 2
  760.        fprintf(stderr, "[%d] open_stream_connection_unknown_encaps: TCP:%d -> closedn", getpid(), port);
  761. #endif
  762.        return -1;
  763.      }
  764.     }
  765.   return -1;
  766.  }
  767.  
  768. ExtFunc int
  769. open_stream_connection_unknown_encaps(args, port, timeout, p)
  770.  struct arglist * args;
  771.  unsigned int  port;
  772.  int timeout, * p;
  773. {
  774.   return open_stream_connection_unknown_encaps5(args, port, timeout, p, NULL);
  775. }
  776. ExtFunc int
  777. open_stream_auto_encaps(args, port, timeout)
  778.  struct arglist * args;
  779.  unsigned int     port;
  780.  int              timeout;
  781. {
  782.  int trp = plug_get_port_transport(args, port);
  783.  int fd;
  784.  
  785.  if(trp == 0)
  786.  {
  787.   if ((fd = open_stream_connection_unknown_encaps(args, port, timeout, &trp)) < 0)
  788.    return -1;
  789.   plug_set_port_transport(args, port, trp);
  790.   return fd;
  791.  }
  792.  else
  793.  {
  794.   fd = open_stream_connection(args, port, trp, timeout);
  795.   return fd;
  796.  }
  797.  /*NOTREACHED*/
  798. }
  799. #ifdef HAVE_SSL
  800. ExtFunc SSL*
  801. stream_get_ssl(fd)
  802.      int fd;
  803. {
  804.  nessus_connection * fp;
  805.  if(!NESSUS_STREAM(fd))
  806.     {
  807.      errno = EINVAL;
  808.      return NULL;
  809.     }
  810.   fp = &(connections[fd - NESSUS_FD_OFF]);
  811.   if (fp->transport <= 0)
  812.     return NULL;
  813.   else
  814.     return fp->ssl;
  815. }
  816. #endif
  817. ExtFunc int
  818. stream_set_timeout(fd, timeout)
  819.  int fd;
  820.  int timeout;
  821. {
  822.  int old;
  823.  nessus_connection * fp;
  824.  if(!NESSUS_STREAM(fd))
  825.     {
  826.      errno = EINVAL;
  827.      return 0;
  828.     }
  829.   fp = &(connections[fd - NESSUS_FD_OFF]);
  830.   old = fp->timeout;
  831.   fp->timeout = timeout;
  832.   return old;
  833. }
  834. ExtFunc int
  835. stream_set_options(fd, reset_opt, set_opt)
  836.      int fd, reset_opt, set_opt;
  837. {
  838.  nessus_connection * fp;
  839.  if(!NESSUS_STREAM(fd))
  840.     {
  841.      errno = EINVAL;
  842.      return -1;
  843.     }
  844.   fp = &(connections[fd - NESSUS_FD_OFF]);
  845.   fp->options &= ~reset_opt;
  846.   fp->options |= set_opt;
  847.   return 0;
  848. }
  849. static int 
  850. read_stream_connection_unbuffered(fd, buf0, min_len, max_len)
  851.  int fd;
  852.  void* buf0;
  853.  int min_len, max_len;
  854. {
  855.   int ret, realfd, trp, t, err;
  856.   int total = 0, flag = 0, timeout = TIMEOUT, waitall = 0;
  857.   unsigned char * buf = (unsigned char*)buf0;
  858.   nessus_connection *fp = NULL;
  859.   fd_set fdr, fdw;
  860.   struct timeval tv;
  861.   time_t now, then;
  862.   int   select_status;
  863.  
  864. #if 0
  865.   fprintf(stderr, "read_stream_connection(%d, 0x%x, %d, %d)n",
  866.   fd, buf, min_len, max_len);
  867. #endif
  868.   if (NESSUS_STREAM(fd))
  869.     {
  870.       fp = &(connections[fd - NESSUS_FD_OFF]);
  871.       trp = fp->transport;
  872.       realfd = fp->fd;
  873.       fp->last_err = 0;
  874.       if (fp->timeout != -2)
  875. timeout = fp->timeout;
  876.     }
  877.   else
  878.     {
  879. #if 0
  880.       fprintf(stderr, "read_stream_connection[%d] : supposedly bad fd %dn",
  881.       getpid(), fd);
  882. #endif
  883.       trp = NESSUS_ENCAPS_IP;
  884.       if(fd < 0 || fd > 1024)
  885.        {
  886. errno = EBADF;
  887. return -1;
  888. }
  889.       realfd = fd;
  890.     }
  891. #ifndef INCR_TIMEOUT
  892. # define INCR_TIMEOUT 1
  893. #endif
  894. #ifdef MSG_WAITALL
  895.   if (min_len == max_len || timeout <= 0)
  896.     waitall = MSG_WAITALL;
  897. #endif
  898.   if(trp == NESSUS_ENCAPS_IP)
  899.     {
  900.       for (t = 0; total < max_len && (timeout <= 0 || t < timeout); )
  901. {
  902.   tv.tv_sec = INCR_TIMEOUT; /* Not timeout! */
  903.   tv.tv_usec = 0;
  904.   FD_ZERO(&fdr);
  905.   FD_SET(realfd, &fdr);
  906.   if(select(realfd + 1, &fdr, NULL, NULL, timeout > 0 ? &tv : NULL) <= 0)
  907.     {
  908.       t += INCR_TIMEOUT;
  909.       /* Try to be smart */
  910.       if (total > 0 && flag) 
  911. return total;
  912.       else if (total >= min_len)
  913. flag ++;
  914.     }
  915.   else
  916.     {
  917.       errno = 0;
  918.       ret = recv(realfd, buf + total, max_len - total, waitall);
  919.       if (ret < 0)
  920. if (errno != EINTR)
  921.                   {
  922.   fp->last_err = errno;
  923.   return total;
  924.                   }
  925. else
  926.   ret = 0;
  927.       else if (ret == 0) /* EOF */
  928.                 {
  929.                 fp->last_err = EPIPE;
  930. return total;
  931.                 }
  932.       /*ret > 0*/
  933.       total += ret; 
  934.       if (min_len > 0 && total >= min_len)
  935. return total;
  936.       flag = 0;
  937.     }
  938. }
  939.       if ( t >= timeout ) fp->last_err = ETIMEDOUT;
  940.       return total;
  941.     }
  942.   switch(trp)
  943.     {
  944.       /* NESSUS_ENCAPS_IP was treated before with the non-Nessus fd */
  945. #ifdef HAVE_SSL
  946.     case NESSUS_ENCAPS_SSLv2:
  947.     case NESSUS_ENCAPS_SSLv23:
  948.     case NESSUS_ENCAPS_SSLv3:
  949.     case NESSUS_ENCAPS_TLSv1:
  950. # if DEBUG_SSL > 0
  951.       if (getpid() != fp->pid)
  952. {
  953.   fprintf(stderr, "PID %d tries to use a SSL connection established by PID %dn", getpid(), fp->pid);
  954.   errno = EINVAL;
  955.   return -1;
  956. }
  957. # endif
  958.       FD_ZERO(&fdr); FD_ZERO(&fdw);
  959.       FD_SET(realfd, &fdr); FD_SET(realfd, &fdw); 
  960.       now = then = time(NULL);
  961.       for (t = 0; timeout <= 0 || t < timeout; t = now - then )
  962. {
  963.           now = time(NULL);
  964.   tv.tv_sec = INCR_TIMEOUT; tv.tv_usec = 0;
  965.   select_status = select ( realfd + 1, &fdr, &fdw, NULL, &tv );
  966.           if ( select_status == 0 )
  967.           {
  968.           FD_ZERO(&fdr); FD_ZERO(&fdw);
  969.           FD_SET(realfd, &fdr); FD_SET(realfd, &fdw); 
  970.           }
  971.   else
  972.   if ( select_status > 0 )
  973.     {
  974.   ret = SSL_read(fp->ssl, buf + total, max_len - total);
  975.   if (ret > 0)
  976. {
  977.           total += ret;
  978.   FD_SET(realfd, &fdr);
  979.   FD_SET(realfd, &fdw); 
  980. }
  981.   if (total >= max_len)
  982.     return total;
  983.       if (ret <= 0)
  984. {
  985.   err = SSL_get_error(fp->ssl, ret);
  986.   FD_ZERO(&fdr); 
  987.   FD_ZERO(&fdw);
  988.   switch (err)
  989.    {
  990.     case SSL_ERROR_WANT_READ:
  991. #if DEBUG_SSL > 2
  992.       fprintf(stderr, "SSL_read[%d]: SSL_ERROR_WANT_READn", getpid());
  993. #endif
  994.       FD_SET(realfd, &fdr);
  995.       break;
  996.     case SSL_ERROR_WANT_WRITE:
  997. #if DEBUG_SSL > 2
  998.       fprintf(stderr, "SSL_Connect[%d]: SSL_ERROR_WANT_WRITEn", getpid());
  999. #endif
  1000.       FD_SET(realfd, &fdr);
  1001.       FD_SET(realfd, &fdw);
  1002.       break;
  1003.     case SSL_ERROR_ZERO_RETURN:
  1004. #if DEBUG_SSL > 2
  1005.       fprintf(stderr, "SSL_Connect[%d]: SSL_ERROR_ZERO_RETURNn", getpid());
  1006. #endif
  1007.       fp->last_err = EPIPE;
  1008.       return total;
  1009.     default:
  1010. #if DEBUG_SSL > 0
  1011.       sslerror2("SSL_read", err);
  1012. #endif
  1013.       fp->last_err = EPIPE;
  1014.       return total;
  1015.     }
  1016. }
  1017.     }
  1018.     if (min_len <= 0)
  1019.       {
  1020. /* Be smart */
  1021. if (total > 0 && flag)
  1022.   return total;
  1023. else
  1024.   flag ++;
  1025.       }
  1026.   else if (total >= min_len)
  1027. return total;
  1028. }
  1029.       if ( t >= timeout ) fp->last_err = ETIMEDOUT;
  1030.       return total;
  1031. #endif
  1032.     default :
  1033.       if (fp->transport != -1 || fp->fd != 0)
  1034. fprintf(stderr, "Severe bug! Unhandled transport layer %d (fd=%d)n",
  1035. fp->transport, fd);
  1036.       else
  1037. fprintf(stderr, "read_stream_connection_unbuffered: fd=%d is closedn", fd);
  1038.       errno = EINVAL;
  1039.       return -1;
  1040.     }
  1041.   /*NOTREACHED*/
  1042. }
  1043. ExtFunc int 
  1044. read_stream_connection_min(fd, buf0, min_len, max_len)
  1045.  int fd;
  1046.  void* buf0;
  1047.  int min_len, max_len;
  1048. {
  1049.   nessus_connection *fp;
  1050.   if (NESSUS_STREAM(fd))
  1051.     {
  1052.       fp = &(connections[fd - NESSUS_FD_OFF]);
  1053.       if (fp->buf != NULL)
  1054. {
  1055.   int l1, l2;
  1056.   if (max_len == 1) min_len = 1; /* avoid "magic read" later */
  1057.   l2 = max_len > fp->bufcnt ? fp->bufcnt : max_len;
  1058.   if (l2 > 0)
  1059.     {
  1060.       memcpy(buf0, fp->buf + fp->bufptr, l2);
  1061.       fp->bufcnt -= l2;
  1062.       if (fp->bufcnt == 0)
  1063. {
  1064.   fp->bufptr = 0;
  1065.   fp->buf[0] = ''; /* debug */
  1066. }
  1067.       else
  1068. fp->bufptr += l2;
  1069.       if (l2 >= min_len || l2 >= max_len)
  1070. return l2;
  1071.       max_len -= l2;
  1072.       min_len -= l2;
  1073.     }
  1074.   if (min_len > fp->bufsz)
  1075.     {
  1076.       l1 = read_stream_connection_unbuffered(fd, (char*)buf0 + l2,
  1077.      min_len, max_len);
  1078.       if (l1 > 0)
  1079. return l1 + l2;
  1080.       else
  1081. return l2;
  1082.     }
  1083.   /* Fill buffer */
  1084.   l1 = read_stream_connection_unbuffered(fd, fp->buf, min_len, fp->bufsz);
  1085.   if (l1 <= 0)
  1086.     return l2;
  1087.   
  1088.   fp->bufcnt = l1;
  1089.   l1 = max_len > fp->bufcnt ? fp->bufcnt : max_len;
  1090.   memcpy((char*)buf0 + l2, fp->buf + fp->bufptr, l1);
  1091.   fp->bufcnt -= l1;
  1092.   if (fp->bufcnt == 0)
  1093.     fp->bufptr = 0;
  1094.   else
  1095.     fp->bufptr += l1;
  1096.   return l1 + l2;
  1097. }
  1098.     }
  1099.   return read_stream_connection_unbuffered(fd, buf0, min_len, max_len);
  1100. }
  1101. ExtFunc int 
  1102. read_stream_connection(fd, buf0, len)
  1103.  int fd;
  1104.  void* buf0;
  1105.  int len;
  1106. {
  1107.  return read_stream_connection_min(fd, buf0, -1, len);
  1108. }
  1109. static int
  1110. write_stream_connection4(fd, buf0, n, i_opt) 
  1111.  int fd;
  1112.  void * buf0;
  1113.  int n;
  1114.  int i_opt;
  1115. {
  1116.   int err, ret, count;
  1117.  unsigned char* buf = (unsigned char*)buf0;
  1118.  nessus_connection * fp;
  1119.   fd_set fdr, fdw;
  1120.   struct timeval tv;
  1121.   int e;
  1122.  if(!NESSUS_STREAM(fd))
  1123.    {
  1124. #if DEBUG_SSL > 0
  1125.      fprintf(stderr, "write_stream_connection: fd <%d> invalidn", fd);
  1126. # if 0
  1127.      abort();
  1128. # endif
  1129. #endif
  1130.      errno = EINVAL;
  1131.      return -1;
  1132.     }
  1133.  fp = &(connections[fd - NESSUS_FD_OFF]);
  1134.  fp->last_err = 0;
  1135.  
  1136. #if DEBUG_SSL > 8
  1137.  fprintf(stderr, "> write_stream_connection(%d, 0x%x, %d, 0x%x) tE=%d 0=0x%xn",
  1138.  fd, buf, n, i_opt, fp->transport, fp->options);
  1139. #endif
  1140.  switch(fp->transport)
  1141.  {
  1142.   case NESSUS_ENCAPS_IP:
  1143.    for(count = 0; count < n;)
  1144.    {
  1145.      if ((fp->options & NESSUS_CNX_IDS_EVASION_SEND_MASK) != 0)
  1146.      {
  1147.       if(fp->options & NESSUS_CNX_IDS_EVASION_SPLIT)
  1148.        /* IDS evasion */
  1149.        ret = send(fp->fd, buf + count, 1, i_opt);
  1150.      else 
  1151.        /* i_opt ignored for ids_send */
  1152.       ret = ids_send(fp->fd, buf + count, n - count, fp->options);
  1153.      }
  1154.      else
  1155.        ret = send(fp->fd, buf + count, n - count, i_opt);
  1156.     if(ret <= 0)
  1157.       {
  1158.        if ( ret < 0 ) fp->last_err = errno;
  1159.        else fp->last_err = EPIPE;
  1160.        break;
  1161.       }
  1162.      
  1163.      count += ret;
  1164.     }
  1165.     break;
  1166. #ifdef HAVE_SSL
  1167.   case NESSUS_ENCAPS_SSLv2:
  1168.   case NESSUS_ENCAPS_SSLv23:
  1169.   case NESSUS_ENCAPS_SSLv3:
  1170.   case NESSUS_ENCAPS_TLSv1:
  1171.       FD_ZERO(&fdr); FD_ZERO(&fdw); 
  1172.       FD_SET(fp->fd, & fdr); FD_SET(fp->fd, & fdw);
  1173.       /* i_opt ignored for SSL */
  1174.     for(count = 0; count < n;)
  1175.     { 
  1176.      ret = SSL_write(fp->ssl, buf + count, n - count);
  1177.   if (ret > 0)
  1178.     count += ret;
  1179.   else
  1180.     {
  1181.       fp->last_ssl_err = err = SSL_get_error(fp->ssl, ret);
  1182.       FD_ZERO(&fdw); FD_ZERO(&fdr); 
  1183.       if (err == SSL_ERROR_WANT_WRITE)
  1184. {
  1185.   FD_SET(fp->fd, &fdw);
  1186. #if DEBUG_SSL > 2
  1187.   fprintf(stderr, "SSL_write[%d]: SSL_ERROR_WANT_WRITEn", getpid());
  1188. #endif    
  1189.      }
  1190.       else if (err == SSL_ERROR_WANT_READ)
  1191. {
  1192. #if DEBUG_SSL > 2
  1193.   fprintf(stderr, "SSL_write[%d]: SSL_ERROR_WANT_READn", getpid());
  1194. #endif
  1195.   FD_SET(fp->fd, &fdr);
  1196. }
  1197.       else
  1198.      { 
  1199. #if DEBUG_SSL > 0
  1200.   sslerror2("SSL_write", err);
  1201. #endif      
  1202.   fp->last_err = EPIPE;
  1203.    break;
  1204.      }
  1205.       if (fp->timeout >= 0)
  1206. tv.tv_sec = fp->timeout;
  1207.      else 
  1208. tv.tv_sec = TIMEOUT;
  1209.       tv.tv_usec = 0;
  1210.         do {
  1211.         errno = 0;
  1212.       e = select(fp->fd+1, &fdr, &fdw, NULL, &tv);
  1213.         } while ( e < 0 && errno == EINTR );
  1214.     if ( e <= 0 )
  1215. {
  1216. #if DEBUG_SSL > 0
  1217.   nessus_perror("select");
  1218. #endif
  1219.   fp->last_err = ETIMEDOUT;
  1220.   break;
  1221. }
  1222.     }
  1223.      }
  1224.     break;
  1225. #endif
  1226.    default:
  1227.      if (fp->transport != -1 || fp->fd != 0)
  1228.        fprintf(stderr, "Severe bug! Unhandled transport layer %d (fd=%d)n",
  1229.        fp->transport, fd);
  1230.      else
  1231.        fprintf(stderr, "read_stream_connection_unbuffered: fd=%d is closedn", fd);
  1232.      errno =EINVAL;
  1233.      return -1;
  1234.   }
  1235.   
  1236.   
  1237.   if(count == 0 && n > 0)
  1238.    return -1;
  1239.   else 
  1240.    return count;
  1241. }
  1242. ExtFunc int
  1243. write_stream_connection(fd, buf0, n) 
  1244.  int fd;
  1245.  void * buf0;
  1246.  int n;
  1247. {
  1248.   return write_stream_connection4(fd, buf0, n, 0);
  1249. }
  1250. ExtFunc int
  1251. nsend (fd, data, length, i_opt)
  1252.  int fd;
  1253.  void * data;
  1254.  int length, i_opt;
  1255. {
  1256.   int n = 0;
  1257.  if(NESSUS_STREAM(fd))
  1258.  {
  1259.   if(connections[fd - NESSUS_FD_OFF].fd < 0)
  1260.    fprintf(stderr, "Nessus file descriptor %d closed ?!n", fd);
  1261.   else 
  1262.     return write_stream_connection4(fd, data, length, i_opt);
  1263.  }
  1264. #if DEBUG_SSL > 1
  1265.  else
  1266.    fprintf(stderr, "nsend[%d]: fd=%dn", getpid(), fd);
  1267. #endif
  1268. #if 0
  1269.    for (i = 0; i < NESSUS_FD_MAX; i ++)
  1270.      if (connections[i].fd == fd && connections[i].transport > 0)
  1271.        {
  1272.  /* Fixing a severe bug! */
  1273.  fprintf(stderr, "nsend: fd=%d used by Nessus FD %dn",
  1274.  fd, i + NESSUS_FD_OFF);
  1275.  return write_stream_connection4(i + NESSUS_FD_OFF, data, length, i_opt);
  1276.        }
  1277. #endif
  1278.  /* Trying OS's send() */
  1279.    block_socket(fd); /* ??? */
  1280.    do
  1281.  {
  1282.        struct timeval tv = {0,5};
  1283.        fd_set wr;
  1284.        int e;
  1285.        
  1286.        FD_ZERO(&wr);
  1287.        FD_SET(fd, &wr);
  1288.        
  1289.        errno = 0;
  1290.        e  = select(fd + 1, NULL, &wr, NULL, &tv);
  1291.        if ( e > 0 )
  1292.         n = os_send(fd, data, length, i_opt);
  1293.        else if ( e < 0 && errno == EINTR ) continue;
  1294.        else break;
  1295.      }
  1296.    while (n <= 0 && errno == EINTR);
  1297.    if (n < 0)
  1298.      fprintf(stderr, "[%d] nsend():send %sn", getpid(), strerror(errno));
  1299.    return n;
  1300.  }
  1301.  
  1302. ExtFunc int
  1303. nrecv (fd, data, length, i_opt)
  1304.  int fd;
  1305.  void * data;
  1306.  int length, i_opt;
  1307. {
  1308.   int e;
  1309. #if DEBUG_SSL > 8
  1310.    fprintf(stderr, "nrecv: fd=%d len=%dn", fd, length);
  1311. #endif
  1312.  if(NESSUS_STREAM(fd))
  1313.  {
  1314.   if(connections[fd - NESSUS_FD_OFF].fd < 0)
  1315.    fprintf(stderr, "Nessus file descriptor %d closed ?!n", fd);
  1316.   else 
  1317.     return read_stream_connection(fd, data, length);
  1318.  }
  1319.  /* Trying OS's recv() 
  1320.   *
  1321.   * Do *NOT* use os_recv() here, as it will be blocking until the exact
  1322.   * amount of requested data arrives
  1323.   */
  1324.  block_socket(fd);
  1325.  do {
  1326. e = recv(fd, data, length, i_opt);
  1327.  } while ( e < 0 && errno == EINTR );
  1328.  return e;
  1329. }
  1330.  
  1331. ExtFunc int
  1332. close_stream_connection(fd)
  1333.  int fd;
  1334. {
  1335. #if DEBUG_SSL > 2
  1336.  nessus_connection * fp;
  1337.  if(!NESSUS_STREAM(fd))
  1338.     {
  1339.      errno = EINVAL;
  1340.      return -1;
  1341.     }
  1342.   fp = &(connections[fd - NESSUS_FD_OFF]);
  1343.   fprintf(stderr, "close_stream_connection TCP:%dn", fp->port);
  1344. #endif
  1345.   if(!NESSUS_STREAM(fd)) /* Will never happen if debug is on! */
  1346.    {
  1347.     if ( fd < 0 || fd > 1024 )
  1348.     {
  1349.    errno = EINVAL;
  1350.    return -1;
  1351.     }
  1352.    shutdown(fd, 2);
  1353.    return socket_close(fd);
  1354.    }
  1355.   else
  1356.    return release_connection_fd(fd);
  1357. }
  1358. ExtFunc int
  1359. get_encaps(fd)
  1360.  int fd;
  1361. {
  1362.  if(!NESSUS_STREAM(fd))
  1363.  {
  1364.    fprintf(stderr, "get_encaps() : bad argumentn");
  1365.    return -1;
  1366.  }
  1367.  return connections[fd - NESSUS_FD_OFF].transport;
  1368. }
  1369.  
  1370. ExtFunc const char *
  1371. get_encaps_name(code)
  1372.  int code;
  1373. {
  1374.  static char str[100];
  1375.  switch(code)
  1376.  {
  1377.   case NESSUS_ENCAPS_IP:
  1378.    return "IP";
  1379.   case NESSUS_ENCAPS_SSLv2:
  1380.     return "SSLv2";
  1381.   case NESSUS_ENCAPS_SSLv23:
  1382.     return "SSLv23";
  1383.   case NESSUS_ENCAPS_SSLv3:
  1384.     return "SSLv3";
  1385.   case NESSUS_ENCAPS_TLSv1:
  1386.     return "TLSv1";
  1387.   default:
  1388.    snprintf(str, sizeof(str), "[unknown transport layer - code %d (0x%x)]", code, code);
  1389.    return str;
  1390.  }
  1391. }
  1392. ExtFunc  const char *
  1393. get_encaps_through(code)
  1394.  int code;
  1395. {
  1396.  static char str[100];
  1397.  switch(code)
  1398.  {
  1399.   case NESSUS_ENCAPS_IP:
  1400.    return "";
  1401.   case NESSUS_ENCAPS_SSLv2:
  1402.   case NESSUS_ENCAPS_SSLv23:
  1403.   case NESSUS_ENCAPS_SSLv3:
  1404.   case NESSUS_ENCAPS_TLSv1:
  1405.     return " through SSL";
  1406.   default:
  1407.     snprintf(str, sizeof(str), " through unknown transport layer - code %d (0x%x)", code, code);
  1408.     return str;
  1409.  }
  1410. }
  1411. static int
  1412. open_socket(struct sockaddr_in *paddr, 
  1413.     int port, int type, int protocol, int timeout)
  1414. {
  1415.   fd_set fd_w;
  1416.   struct timeval to;
  1417.   int soc, x;
  1418.   int opt;
  1419.   unsigned int opt_sz;
  1420.   __port_closed = 0;
  1421.   if ((soc = socket(AF_INET, type, protocol)) < 0)
  1422.     {
  1423.       nessus_perror("socket");
  1424.       return -1;
  1425.     }
  1426.   if (timeout == -2)
  1427.     timeout = TIMEOUT;
  1428.   if (timeout > 0)
  1429.     if (unblock_socket(soc) < 0)
  1430.       {
  1431. closesocket(soc);
  1432. return -1;
  1433.       }
  1434.   set_socket_source_addr(soc, 0);
  1435. #if defined NESSUS_CNX_LOCK
  1436.   if (lock_cnt == 0)
  1437. {
  1438.       lock_fd = open(NESSUS_CNX_LOCK, O_RDWR|O_CREAT);
  1439.       if (lock_fd < 0)
  1440. nessus_perror(NESSUS_CNX_LOCK);
  1441.       else
  1442. {
  1443.   time_t t1 = time(NULL), t2;
  1444.   if (flock(lock_fd, LOCK_EX) < 0)
  1445.     nessus_perror(NESSUS_CNX_LOCK);
  1446.   else
  1447.     {
  1448.       lock_cnt ++;
  1449.       t2 = time(NULL);
  1450. #if 1
  1451.       if (t2 - t1 > 0)
  1452. fprintf(stderr, "[%d] open_socket: " NESSUS_CNX_LOCK " locked in %d sn", getpid(), t2 - t1);
  1453. #endif
  1454.     }
  1455. }
  1456.     }
  1457.   else
  1458.     {
  1459. #if 1
  1460.       fprintf(stderr, "[%d] open_socket: sleeping 1 secondn", getpid());
  1461. #endif
  1462.       sleep(1);
  1463.     }
  1464. #endif  
  1465.   
  1466.   if (connect(soc, (struct sockaddr*) paddr, sizeof(*paddr)) < 0)
  1467.     {
  1468. #if debug_SSL > 2
  1469.       nessus_perror("connect");
  1470. #endif
  1471. again:
  1472.       switch (errno)
  1473. {
  1474. case EINPROGRESS:
  1475. case EAGAIN:
  1476.   FD_ZERO(&fd_w);
  1477.   FD_SET(soc, &fd_w);
  1478.   to.tv_sec = timeout;
  1479.   to.tv_usec = 0;
  1480.   x = select(soc + 1, NULL, &fd_w, NULL, &to);
  1481.   if (x == 0)
  1482.     {
  1483. #if debug_SSL > 2
  1484.       nessus_perror("connect->select: timeout");
  1485. #endif
  1486.       socket_close(soc);
  1487.       errno = ETIMEDOUT;
  1488.       return -1;
  1489.     }
  1490.   else if (x < 0)
  1491.     {
  1492.       if ( errno == EINTR )
  1493.                {
  1494.    errno = EAGAIN;
  1495.  goto again;
  1496.        }
  1497.       nessus_perror("select");
  1498.       socket_close(soc);
  1499.       return -1;
  1500.             }
  1501.  
  1502.   opt = 0; opt_sz = sizeof(opt);
  1503.   if (getsockopt(soc, SOL_SOCKET, SO_ERROR, &opt, &opt_sz) < 0)
  1504.     {
  1505.       nessus_perror("getsockopt");
  1506.       socket_close(soc);
  1507.       return -1;
  1508.     }
  1509.   if (opt == 0)
  1510.     break;
  1511. #if DEBUG_SSL > 2
  1512.   errno = opt;
  1513.   nessus_perror("SO_ERROR");
  1514. #endif
  1515.   /* no break; go on */   
  1516. default:
  1517.   __port_closed = 1;
  1518.   socket_close(soc);
  1519.   return  -1;
  1520. }
  1521.     }
  1522.   block_socket(soc);
  1523.   return soc;
  1524. }
  1525. ExtFunc 
  1526. int open_sock_opt_hn(hostname, port, type, protocol, timeout)
  1527.  const char * hostname; 
  1528.  unsigned int port; 
  1529.  int type;
  1530.  int protocol;
  1531.  int timeout;
  1532. {
  1533.  struct sockaddr_in addr;
  1534.   
  1535.   bzero((void*)&addr, sizeof(addr));
  1536.   addr.sin_family=AF_INET;
  1537.   addr.sin_port=htons((unsigned short)port);
  1538.   addr.sin_addr = nn_resolve(hostname);
  1539.   if (addr.sin_addr.s_addr == INADDR_NONE || addr.sin_addr.s_addr == 0)
  1540.     {
  1541.       fprintf(stderr, "open_sock_opt_hn: invalid socket addressn");
  1542.       return  -1;
  1543.     }
  1544.    
  1545.   return open_socket(&addr, port, type, protocol, timeout);
  1546. }
  1547. ExtFunc
  1548. int open_sock_tcp_hn(hostname, port)
  1549.  const char * hostname;
  1550.  unsigned int port;
  1551. {
  1552.   return open_sock_opt_hn(hostname, port, SOCK_STREAM, IPPROTO_TCP, TIMEOUT);
  1553. }
  1554. ExtFunc
  1555. int open_sock_tcp(args, port, timeout)
  1556.  struct arglist * args; 
  1557.  unsigned int port;
  1558.  int timeout;
  1559. {
  1560.   char name[32];
  1561.   int ret;
  1562.   int type;
  1563.   
  1564.   /*
  1565.    * If we timed out against this port in the past, there's no need
  1566.    * to scan it again
  1567.    */
  1568.   snprintf(name, sizeof(name), "/tmp/ConnectTimeout/TCP/%d", port);
  1569.   if ( plug_get_key ( args, name, &type ) ) 
  1570. return -1;
  1571.   errno = 0;
  1572.   ret  = open_sock_option(args, port, SOCK_STREAM,IPPROTO_TCP, timeout);
  1573.   if ( ret < 0 && errno == ETIMEDOUT )
  1574.     plug_set_key( args, name, ARG_INT, (void*)1); 
  1575.   return ret;
  1576. }
  1577. ExtFunc
  1578. int open_sock_udp(args, port)
  1579.  struct arglist * args;
  1580.  unsigned int port;
  1581. {
  1582.   return open_sock_option(args, port, SOCK_DGRAM, IPPROTO_UDP, 0);
  1583. }
  1584. ExtFunc 
  1585. struct in_addr _socket_get_next_source_addr(struct in_addr * addr)
  1586. {
  1587.   static struct in_addr * src_addrs = NULL;
  1588.   static int current_src_addr = 0;
  1589.   static pid_t current_src_addr_pid = 0;
  1590.   static int num_addrs = 0;
  1591.   struct in_addr ret;
  1592.   pid_t mypid;
  1593.   
  1594.   if( current_src_addr < 0 )
  1595.   {
  1596.    ret.s_addr = INADDR_ANY;
  1597.    return ret;
  1598.   }
  1599.   
  1600.   
  1601.   
  1602.   if ( src_addrs == NULL && current_src_addr == 0 )
  1603.   {
  1604.     src_addrs = addr;
  1605.     if( src_addrs == NULL ) 
  1606.     {
  1607.      ret.s_addr = INADDR_ANY;
  1608.      current_src_addr = -1;
  1609.      return ret;
  1610.     }    
  1611.    
  1612.    num_addrs = -1;
  1613.    while(src_addrs[++num_addrs].s_addr != 0 ) ;
  1614.   }
  1615.   
  1616.   
  1617.   mypid = getpid();
  1618.   if ( current_src_addr_pid != mypid )
  1619.    {
  1620.     current_src_addr_pid = mypid;
  1621.     current_src_addr = lrand48() % ( num_addrs ) ;
  1622.     if ( src_addrs[current_src_addr].s_addr == 0 ) current_src_addr = 0;
  1623.    }
  1624.   
  1625.   return src_addrs[current_src_addr];
  1626. }
  1627. ExtFunc
  1628. struct in_addr socket_get_next_source_addr()
  1629. {
  1630.  return _socket_get_next_source_addr(NULL);
  1631. }
  1632. ExtFunc 
  1633. int set_socket_source_addr(int soc, int port)
  1634.   struct sockaddr_in bnd;
  1635.   int opt = 1;  
  1636.   
  1637.   struct in_addr src = _socket_get_next_source_addr(NULL);
  1638.   
  1639.   if( src.s_addr == INADDR_ANY && port == 0 ) /* No need to bind() */
  1640.    return 0;
  1641.    
  1642.   setsockopt(soc, SOL_SOCKET, SO_REUSEADDR, (void*)&opt, sizeof(int));
  1643.   bzero(&bnd, sizeof(bnd));
  1644.   
  1645.    
  1646.    
  1647.    bnd.sin_port = htons(port);
  1648.    bnd.sin_addr = src;
  1649.    bnd.sin_family = AF_INET;
  1650.   
  1651.   if( bind(soc, (struct sockaddr*)&bnd, sizeof(bnd)) < 0 )
  1652.   { 
  1653.    return -1;
  1654.   }
  1655.   
  1656.   return 0;
  1657. }
  1658. ExtFunc  void socket_source_init(struct in_addr * addr)
  1659. {
  1660.  (void) _socket_get_next_source_addr(addr);
  1661. }
  1662. ExtFunc
  1663. int open_sock_option(args, port, type, protocol, timeout)
  1664.  struct arglist * args;
  1665.  unsigned int port;
  1666.  int type;
  1667.  int protocol;
  1668.  int timeout;
  1669. {
  1670.   struct sockaddr_in addr;
  1671.   struct in_addr * t;
  1672. #if 0
  1673.   /* 
  1674.    * MA 2004-08-15: IMHO, as this is often (always?) tested in the NASL scripts
  1675.    * this should not be here. 
  1676.    * If it has to be somewhere else, I'd rather put it in libnasl (and add
  1677.    * a parameter to "force" the connection)
  1678.    */
  1679.   if(host_get_port_state(args, port)<=0)return(-1);
  1680. #endif
  1681.   bzero((void*)&addr, sizeof(addr));
  1682.   addr.sin_family=AF_INET;
  1683.   addr.sin_port=htons((unsigned short)port);
  1684.   t = plug_get_host_ip(args);
  1685.   if(!t)
  1686.   {
  1687.    fprintf(stderr, "ERROR ! NO ADDRESS ASSOCIATED WITH NAMEn");
  1688.    arg_dump(args, 0);
  1689.    return(-1);
  1690.   }
  1691.   addr.sin_addr = *t;
  1692.   if (addr.sin_addr.s_addr == INADDR_NONE)
  1693.     return(-1);
  1694.     
  1695.   return open_socket(&addr, port, type, protocol, timeout);
  1696. }
  1697. /* This function reads a text from the socket stream into the
  1698.    argument buffer, always appending a '' byte.  The return
  1699.    value is the number of bytes read, without the trailing ''.
  1700.  */
  1701. ExtFunc
  1702. int recv_line(soc, buf, bufsiz)
  1703.  int soc;
  1704.  char * buf;
  1705.  size_t bufsiz;
  1706. {
  1707.   int n, ret = 0;
  1708.   
  1709.   /*
  1710.    * Dirty SSL hack
  1711.    */
  1712.   if(NESSUS_STREAM(soc))
  1713.   {
  1714.    buf[0] = '';
  1715.    
  1716.    do
  1717.    {
  1718.     n = read_stream_connection_min (soc, buf + ret, 1, 1);
  1719.     switch (n)
  1720.     {
  1721.      case -1 :
  1722.        if(ret == 0)
  1723.         return -1;
  1724.        else 
  1725.         return ret;
  1726.        break;
  1727.      
  1728.      case 0:
  1729.        return ret;
  1730.        break;
  1731.       
  1732.       default :
  1733.        ret ++;
  1734.     }
  1735.    }
  1736.    while (buf [ret-1] != '' && buf [ret-1] != 'n' && ret < bufsiz) ;
  1737.    
  1738.    if(ret > 0 )
  1739.    {
  1740.    if (buf[ret - 1] != '')
  1741. {
  1742. if ( ret < bufsiz ) 
  1743. buf[ ret ] = '';
  1744. else 
  1745. buf [ bufsiz - 1 ] = '';
  1746. }
  1747.    }
  1748.    return ret;  
  1749.   }
  1750.   else
  1751.   {
  1752.    fd_set rd;
  1753.    struct timeval tv;
  1754.    
  1755.    do
  1756.    {
  1757.       int e;
  1758.  again:
  1759.       errno = 0;
  1760.       FD_ZERO(&rd);
  1761.       FD_SET(soc, &rd);
  1762.       tv.tv_sec = 5;
  1763.       tv.tv_usec = 0;
  1764.       e = select(soc+1, &rd, NULL, NULL, &tv); 
  1765.       if( e < 0 && errno == EINTR) goto again;
  1766.       if( e > 0 )
  1767.       {
  1768.        n = recv(soc, buf + ret, 1, 0);
  1769.        switch(n)
  1770.        {
  1771.         case -1 :
  1772.  if ( errno == EINTR ) continue;
  1773.  if(ret == 0)
  1774.   return -1;
  1775.  else
  1776.   return ret;
  1777.  break;  
  1778.        case 0 :
  1779.          return ret;
  1780.          break;
  1781.        default:
  1782.          ret ++;
  1783.        }
  1784.       } 
  1785.       else break;
  1786.       tv.tv_sec = 1;
  1787.       tv.tv_usec = 0;
  1788.     } while(buf[ret -1 ] != '' && buf[ret -1 ] != 'n' && ret < bufsiz);
  1789.     
  1790.     if(ret > 0)
  1791.     {
  1792.     if(buf[ret - 1] != '')
  1793.       {
  1794. if ( ret < bufsiz )
  1795.        buf[ret] = '';
  1796. else
  1797. buf[bufsiz - 1] = '';
  1798.       }
  1799.     }
  1800.   }
  1801.   return ret;
  1802. ExtFunc int
  1803. socket_close(soc)
  1804. int soc;
  1805. {
  1806. #if defined NESSUS_CNX_LOCK
  1807.   if (lock_cnt > 0)
  1808.     if (-- lock_cnt == 0)
  1809.       {
  1810. if (flock(lock_fd, LOCK_UN) < 0)
  1811.   nessus_perror(NESSUS_CNX_LOCK);
  1812. if (close(lock_fd) < 0)
  1813.   nessus_perror(NESSUS_CNX_LOCK);
  1814. lock_fd = -1;
  1815.       }
  1816. #endif  
  1817.   return closesocket(soc);
  1818. }
  1819. /*
  1820.  * auth_printf()
  1821.  *
  1822.  * Writes data to the global socket of the thread
  1823.  */
  1824. ExtFunc void 
  1825. auth_printf(struct arglist * globals, char * data, ...)
  1826. {
  1827.   va_list param;
  1828.   char buffer[65535];
  1829.   
  1830.   bzero(buffer, sizeof(buffer));
  1831.   va_start(param, data);
  1832.   vsnprintf(buffer, sizeof(buffer) - 1, data, param);
  1833.   
  1834.   va_end(param);
  1835.   auth_send(globals, buffer);
  1836. }                    
  1837. ExtFunc void
  1838. auth_send(struct arglist * globals, char * data)
  1839. {
  1840.  int soc = (int)arg_get_value(globals, "global_socket");
  1841.  int confirm = (int)arg_get_value(globals, "confirm");
  1842.  int n = 0;
  1843.  int length;
  1844.  int sent = 0;
  1845.  if(soc < 0)
  1846.   return;
  1847. #ifndef NESSUSNT
  1848.  signal(SIGPIPE, _exit);
  1849. #endif
  1850.  length = strlen(data);
  1851.  while(sent < length)
  1852.  {
  1853.  n = nsend(soc, data+sent, length-sent, 0);
  1854.  if(n < 0)
  1855.  {
  1856.   if((errno == ENOMEM)
  1857. #ifdef ENOBUFS  
  1858.    ||(errno==ENOBUFS)
  1859. #endif   
  1860.    )
  1861.    n = 0;
  1862.   else
  1863.    {
  1864.    nessus_perror("nsend");
  1865.    goto out;
  1866.    }
  1867.  }
  1868.  else sent+=n;
  1869.  }
  1870.  
  1871.  if(confirm)
  1872.  {
  1873.   /*
  1874.    * If confirm is set, then we are a son
  1875.    * trying to report some message to our busy
  1876.    * father. So we wait until he told us he
  1877.    * took care of it
  1878.    */
  1879.   char n;
  1880.   read_stream_connection_min(soc, &n, 1, 1);
  1881.  }
  1882. out:
  1883. #ifndef NESSUSNT
  1884.   signal(SIGPIPE, SIG_IGN);
  1885. #else
  1886.  ;
  1887. #endif
  1888. }
  1889. /*
  1890.  * auth_gets()
  1891.  *
  1892.  * Reads data from the global socket of the thread
  1893.  */
  1894. ExtFunc char * 
  1895. auth_gets(globals, buf, bufsiz)
  1896.      struct arglist * globals;
  1897.      char * buf;
  1898.      size_t bufsiz;
  1899. {
  1900.   int soc = (int)arg_get_value(globals, "global_socket");
  1901.   int n;
  1902.   /* bzero(buf, bufsiz); */
  1903.   n = recv_line(soc, buf, bufsiz);
  1904.   if(n <= 0)
  1905.   return NULL;
  1906.   
  1907.   return(buf);
  1908. }
  1909. /*
  1910.  * Select() routines
  1911.  */
  1912.  
  1913. ExtFunc int
  1914. stream_zero(set)
  1915.  fd_set * set;
  1916.  FD_ZERO(set);
  1917.  return 0;
  1918. }
  1919. ExtFunc int
  1920. stream_set(fd, set)
  1921.  int fd;
  1922.  fd_set * set;
  1923. {
  1924.  int soc = nessus_get_socket_from_connection(fd);
  1925.  if(soc >= 0)
  1926.   FD_SET(soc, set);
  1927.  return soc;
  1928. }
  1929. ExtFunc int
  1930. stream_isset(fd, set)
  1931.  int fd;
  1932.  fd_set * set;
  1933. {
  1934.  return FD_ISSET(nessus_get_socket_from_connection(fd), set);
  1935. }
  1936. ExtFunc int
  1937. fd_is_stream(fd)
  1938.      int fd;
  1939. {
  1940.   return NESSUS_STREAM(fd); /* Should probably be smarter... */
  1941. }
  1942. ExtFunc int 
  1943. stream_get_buffer_sz ( int fd )
  1944. {
  1945.   nessus_connection *p;
  1946.   if (! NESSUS_STREAM(fd))
  1947.     return -1;
  1948.   p = &(connections[fd - NESSUS_FD_OFF]);
  1949.   return p->bufsz;
  1950. }
  1951. ExtFunc int
  1952. stream_set_buffer(fd, sz)
  1953.      int fd, sz;
  1954. {
  1955.   nessus_connection *p;
  1956.   char *b;
  1957.   if (! NESSUS_STREAM(fd))
  1958.     return -1;
  1959.   p = &(connections[fd - NESSUS_FD_OFF]);
  1960.   if (sz < p->bufcnt)
  1961.       return -1; /* Do not want to lose data */
  1962.   if (sz == 0)
  1963.     {
  1964.       efree(&p->buf);
  1965.       p->bufsz = 0;
  1966.       return 0;
  1967.     }
  1968.   else if (p->buf == 0)
  1969.     {
  1970.       p->buf = malloc(sz);
  1971.       if (p->buf == NULL)
  1972. return -1;
  1973.       p->bufsz = sz;
  1974.       p->bufptr = 0;
  1975.       p->bufcnt = 0;
  1976.       return 0;
  1977.     }
  1978.   else
  1979.     {
  1980.       if (p->bufcnt > 0)
  1981. {
  1982.   memmove(p->buf, p->buf + p->bufptr, p->bufcnt);
  1983.   p->bufptr = 0;
  1984. }
  1985.       b = realloc(p->buf, sz);
  1986.       if (b == NULL)
  1987. return -1;
  1988.       p->bufsz = sz;
  1989.       return 0;
  1990.     }
  1991.   /*NOTREACHED*/
  1992. }
  1993. /*------------------------------------------------------------------*/
  1994. int os_send(int soc, void * buf, int len, int opt )
  1995. {
  1996.  char * buf0 = (char*)buf;
  1997.  int e, n;
  1998.  for ( n = 0 ; n < len ; ) 
  1999.  {
  2000.   errno = 0;
  2001.   e = send(soc, buf0 + n , len -  n, opt);
  2002.   if ( e < 0 && errno == EINTR ) continue; 
  2003.   else if ( e <= 0 ) return -1;
  2004.   else n += e;
  2005.  }
  2006.  return n;
  2007. }
  2008. int os_recv(int soc, void * buf, int len, int opt )
  2009. {
  2010.  char * buf0 = (char*)buf;
  2011.  int e, n;
  2012.  for ( n = 0 ; n < len ; ) 
  2013.  {
  2014.   errno = 0;
  2015.   e = recv(soc, buf0 + n , len -  n, opt);
  2016.   if ( e < 0 && errno == EINTR ) continue; 
  2017.   else if ( e <= 0 ) return -1;
  2018.   else n += e;
  2019.  }
  2020.  return n;
  2021. }
  2022. /* 
  2023.  * internal_send() / internal_recv() :
  2024.  *
  2025.  * When processes are passing messages to each other, the format is
  2026.  * <length><msg>, with <length> being a long integer. The functions
  2027.  * internal_send() and internal_recv() encapsulate and decapsulate
  2028.  * the messages themselves. 
  2029.  */
  2030. int internal_send(int soc, char * data, int msg_type )
  2031. {
  2032.  int len;
  2033.  int e;
  2034.  int ack;
  2035.  fd_set rd;
  2036.  struct timeval tv;
  2037.  
  2038.  if ( data == NULL )
  2039. data = "";
  2040.  e = os_send(soc, &msg_type, sizeof(len), 0 );
  2041.  if ( e < 0 ) return -1;
  2042.  if ( (msg_type & INTERNAL_COMM_MSG_TYPE_CTRL) == 0 )
  2043.   {
  2044.  len = strlen(data);
  2045.  e = os_send(soc, &len, sizeof(len), 0 );
  2046.  if ( e < 0 ) return -1;
  2047.  e = os_send(soc, data, len, 0 );
  2048.  if ( e < 0 ) return -1;
  2049.  }
  2050.  e = os_recv(soc, &ack, sizeof(ack), 0);
  2051.  if ( e < 0 ){
  2052. fprintf(stderr, "internal_send->os_recv(%d): %sn",soc, strerror(errno));
  2053. return -1;
  2054. }
  2055.  return 0;
  2056. }
  2057. int internal_recv(int soc, char ** data, int * data_sz, int * msg_type )
  2058. {
  2059.  int len = 0;
  2060.  int e;
  2061.  char * buf = *data;
  2062.  int    sz  = *data_sz;
  2063.  fd_set rd;
  2064.  struct timeval tv;
  2065.  int type;
  2066.  int ack;
  2067.  
  2068.  if ( buf == NULL )
  2069.  {
  2070.   sz = 65535;
  2071.   buf = emalloc ( sz );
  2072.  }
  2073.    
  2074.  e = os_recv(soc, &type, sizeof(type), 0 );
  2075.  if ( e < 0 ) goto error;
  2076.  if ( (type & INTERNAL_COMM_MSG_TYPE_CTRL) == 0 )
  2077.  {
  2078.  e = os_recv(soc, &len, sizeof(len), 0);
  2079.  if ( e < 0 ) goto error;
  2080.  
  2081.  if ( len >= sz )
  2082.  {
  2083.   sz = len + 1;
  2084.   buf = erealloc( buf, sz );
  2085.  }
  2086.  if ( len > 0 )
  2087.  {
  2088.  e = os_recv(soc, buf,len, 0);
  2089.  if ( e < 0 ) goto error;
  2090.  buf[len] = '';
  2091.  }
  2092.  if ( data != NULL )
  2093.   *data = buf;
  2094.  if ( data_sz != NULL )
  2095.   *data_sz = sz;
  2096.  }
  2097.  
  2098.  *msg_type = type;
  2099.  ack = INTERNAL_COMM_MSG_TYPE_CTRL | INTERNAL_COMM_CTRL_ACK;
  2100.  e = os_send(soc, &ack, sizeof(ack), 0);
  2101.  if ( e < 0 ) goto error;
  2102.  
  2103.  return len;
  2104. error:
  2105.  efree(&buf);
  2106.  *data = NULL;
  2107.  *data_sz = 0;
  2108.  return -1;
  2109. }
  2110. ExtFunc int stream_pending(int fd)
  2111. {
  2112.   nessus_connection * fp;
  2113.  if ( ! NESSUS_STREAM(fd) )
  2114.  {
  2115.   errno = EINVAL;
  2116.   return -1;
  2117.  }
  2118.  fp = &(connections[fd - NESSUS_FD_OFF]);
  2119.  if ( fp->bufcnt )
  2120.         return fp->bufcnt;
  2121. #ifdef HAVE_SSL
  2122.  else if ( fp->transport != NESSUS_ENCAPS_IP )
  2123.         return SSL_pending(fp->ssl);
  2124. #endif
  2125.  return 0;
  2126. }