OpenVAS Manager  7.0.3~git
scanner.c File Reference
#include "scanner.h"
#include "ompd.h"
#include "otp.h"
#include "ovas-mngr-comm.h"
#include "utils.h"
#include <dirent.h>
#include <assert.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/stat.h>
#include <sys/un.h>
#include <fcntl.h>
#include <openvas/misc/openvas_server.h>
Include dependency graph for scanner.c:

Go to the source code of this file.

Macros

#define G_LOG_DOMAIN   "md main"
 GLib log domain. More...
 

Functions

int openvas_scanner_read ()
 Read as much from the server as the from_scanner buffer will. More...
 
int openvas_scanner_full ()
 Check whether the buffer for data from Scanner is full. More...
 
int openvas_scanner_realloc ()
 Reallocates the from_scanner buffer to a higher size. More...
 
int openvas_scanner_write (int nvt_cache_mode)
 Write as much as possible from the to_scanner buffer to the scanner. More...
 
int openvas_scanner_wait ()
 Wait for the scanner socket to be writable. More...
 
int openvas_scanner_close ()
 Finish the connection to the Scanner and free internal buffers. More...
 
void openvas_scanner_fork ()
 Reset Scanner variables after a fork. More...
 
int openvas_scanner_connect_unix ()
 
int openvas_scanner_connect ()
 Create a new connection to the scanner and set it as current scanner. More...
 
void openvas_scanner_free ()
 Free the scanner allocated data. Doesn't close socket and terminate the session. More...
 
int openvas_scanner_fd_isset (fd_set *fd)
 Check if connected to Scanner is set in an fd_set. More...
 
void openvas_scanner_fd_set (fd_set *fd)
 Add connected to Scanner's socket to an fd_set. More...
 
int openvas_scanner_peek ()
 Check if there is any data to receive from connected Scanner socket. More...
 
int openvas_scanner_get_nfds (int socket)
 Get the nfds value to use for a select() call. More...
 
int openvas_scanner_session_peek ()
 Check if there is any data to receive from connected Scanner session. More...
 
int openvas_scanner_connected ()
 Whether we have started a connection to the Scanner using openvas_scanner_connect(). More...
 
int openvas_scanner_init (int cache_mode)
 Initializes the already setup connection with the Scanner. More...
 
int openvas_scanner_set_address (const char *addr, int port)
 Set the scanner's address and port. Will try to resolve addr if it is a hostname. More...
 
int openvas_scanner_set_unix (const char *path)
 Set the scanner's unix socket path. More...
 
void openvas_scanner_set_certs (const char *ca_pub, const char *key_pub, const char *key_priv)
 Set the scanner's CA Certificate, and public/private key pair. More...
 
int openvas_scanner_is_loading ()
 Checks whether the connected to OpenVAS Scanner is still loading plugins. To be called right after openvas_scanner_init(). More...
 

Variables

gnutls_session_t openvas_scanner_session = NULL
 
gnutls_certificate_credentials_t openvas_scanner_credentials = NULL
 
int openvas_scanner_socket = -1
 
struct sockaddr_in openvas_scanner_address
 
char * openvas_scanner_ca_pub = NULL
 
char * openvas_scanner_key_pub = NULL
 
char * openvas_scanner_key_priv = NULL
 
char * openvas_scanner_unix_path = NULL
 
char * from_scanner = NULL
 Buffer of input from the scanner. More...
 
buffer_size_t from_scanner_start = 0
 The start of the data in the from_scanner buffer. More...
 
buffer_size_t from_scanner_end = 0
 The end of the data in the from_scanner buffer. More...
 
buffer_size_t from_scanner_size = 1048576
 The current size of the from_scanner buffer. More...
 
buffer_size_t from_scanner_max_size = 1073741824
 The max size of the from_scanner buffer. More...
 
char to_server []
 
int to_server_end
 
int to_server_start
 

Macro Definition Documentation

◆ G_LOG_DOMAIN

#define G_LOG_DOMAIN   "md main"

GLib log domain.

Definition at line 47 of file scanner.c.

Function Documentation

◆ openvas_scanner_close()

int openvas_scanner_close ( )

Finish the connection to the Scanner and free internal buffers.

Returns
-1 if error, 0 if success.

Definition at line 551 of file scanner.c.

References from_scanner, openvas_scanner_credentials, openvas_scanner_session, openvas_scanner_socket, and openvas_scanner_unix_path.

552 {
553  int rc = 0;
554  if (openvas_scanner_socket == -1)
555  return -1;
557  close (openvas_scanner_socket);
558  else
559  rc = openvas_server_free (openvas_scanner_socket, openvas_scanner_session,
564  g_free (from_scanner);
565  from_scanner = NULL;
566  return rc;
567 }
char * openvas_scanner_unix_path
Definition: scanner.c:57
gnutls_certificate_credentials_t openvas_scanner_credentials
Definition: scanner.c:51
int openvas_scanner_socket
Definition: scanner.c:52
gnutls_session_t openvas_scanner_session
Definition: scanner.c:50
char * from_scanner
Buffer of input from the scanner.
Definition: scanner.c:62

◆ openvas_scanner_connect()

int openvas_scanner_connect ( )

Create a new connection to the scanner and set it as current scanner.

Returns
0 on success, -1 on error.

Definition at line 619 of file scanner.c.

References openvas_scanner_ca_pub, openvas_scanner_connect_unix(), openvas_scanner_credentials, openvas_scanner_key_priv, openvas_scanner_key_pub, openvas_scanner_session, openvas_scanner_socket, and openvas_scanner_unix_path.

620 {
623 
624  openvas_scanner_socket = socket (PF_INET, SOCK_STREAM, 0);
625  if (openvas_scanner_socket == -1)
626  {
627  g_warning ("%s: failed to create scanner socket: %s\n", __FUNCTION__,
628  strerror (errno));
629  return -1;
630  }
631 
632  /* Make the scanner socket. */
633  if (openvas_server_new_mem
637  {
638  close (openvas_scanner_socket);
640  return -1;
641  }
642 
643  if (load_cas (&openvas_scanner_credentials))
644  {
646  return -1;
647  }
648 
649  init_otp_data ();
650 
651  return 0;
652 }
char * openvas_scanner_unix_path
Definition: scanner.c:57
gnutls_certificate_credentials_t openvas_scanner_credentials
Definition: scanner.c:51
int openvas_scanner_connect_unix()
Definition: scanner.c:586
int openvas_scanner_socket
Definition: scanner.c:52
gnutls_session_t openvas_scanner_session
Definition: scanner.c:50
void init_otp_data()
Initialise OTP library data.
Definition: otp.c:342
char * openvas_scanner_ca_pub
Definition: scanner.c:54
char * openvas_scanner_key_priv
Definition: scanner.c:56
char * openvas_scanner_key_pub
Definition: scanner.c:55
int openvas_scanner_close()
Finish the connection to the Scanner and free internal buffers.
Definition: scanner.c:551
Here is the call graph for this function:

◆ openvas_scanner_connect_unix()

int openvas_scanner_connect_unix ( )

Definition at line 586 of file scanner.c.

References init_otp_data(), openvas_scanner_socket, and openvas_scanner_unix_path.

Referenced by openvas_scanner_connect().

587 {
588  struct sockaddr_un addr;
589  int len;
590 
591  openvas_scanner_socket = socket (AF_UNIX, SOCK_STREAM, 0);
592  if (openvas_scanner_socket == -1)
593  {
594  g_warning ("%s: failed to create scanner socket: %s\n", __FUNCTION__,
595  strerror (errno));
596  return -1;
597  }
598 
599  addr.sun_family = AF_UNIX;
600  strncpy (addr.sun_path, openvas_scanner_unix_path, 108);
601  len = strlen (addr.sun_path) + sizeof (addr.sun_family);
602  if (connect (openvas_scanner_socket, (struct sockaddr *) &addr, len) == -1)
603  {
604  g_warning ("%s: Failed to connect to scanner (%s): %s\n", __FUNCTION__,
605  openvas_scanner_unix_path, strerror (errno));
606  return -1;
607  }
608 
609  init_otp_data ();
610  return 0;
611 }
char * openvas_scanner_unix_path
Definition: scanner.c:57
int openvas_scanner_socket
Definition: scanner.c:52
void init_otp_data()
Initialise OTP library data.
Definition: otp.c:342
Here is the call graph for this function:
Here is the caller graph for this function:

◆ openvas_scanner_connected()

int openvas_scanner_connected ( )

Whether we have started a connection to the Scanner using openvas_scanner_connect().

Returns
1 if connected, 0 otherwise.

Definition at line 764 of file scanner.c.

References openvas_scanner_socket.

765 {
766  return openvas_scanner_socket == -1 ? 0 : 1;
767 }
int openvas_scanner_socket
Definition: scanner.c:52

◆ openvas_scanner_fd_isset()

int openvas_scanner_fd_isset ( fd_set *  fd)

Check if connected to Scanner is set in an fd_set.

Parameters
[in]fdFile descriptor set.
Returns
1 if scanner socket in fd_set, 0 if not connected or or not set.

Definition at line 688 of file scanner.c.

References openvas_scanner_socket.

689 {
690  if (openvas_scanner_socket == -1)
691  return 0;
692  return FD_ISSET (openvas_scanner_socket, fd);
693 }
int openvas_scanner_socket
Definition: scanner.c:52

◆ openvas_scanner_fd_set()

void openvas_scanner_fd_set ( fd_set *  fd)

Add connected to Scanner's socket to an fd_set.

Parameters
[in]fdFile Descriptor set.

Definition at line 701 of file scanner.c.

References openvas_scanner_socket.

702 {
703  if (openvas_scanner_socket == -1)
704  return;
705  FD_SET (openvas_scanner_socket, fd);
706 }
int openvas_scanner_socket
Definition: scanner.c:52

◆ openvas_scanner_fork()

void openvas_scanner_fork ( )

Reset Scanner variables after a fork.

This other side of the fork will do the actual cleanup.

Definition at line 575 of file scanner.c.

References from_scanner_end, from_scanner_start, openvas_scanner_credentials, openvas_scanner_session, openvas_scanner_socket, and reset_scanner_states().

576 {
580  from_scanner_start = 0;
581  from_scanner_end = 0;
583 }
buffer_size_t from_scanner_start
The start of the data in the from_scanner buffer.
Definition: scanner.c:67
void reset_scanner_states()
Set the scanner initialisation state, scanner_init_state.
Definition: otp.c:442
gnutls_certificate_credentials_t openvas_scanner_credentials
Definition: scanner.c:51
int openvas_scanner_socket
Definition: scanner.c:52
gnutls_session_t openvas_scanner_session
Definition: scanner.c:50
buffer_size_t from_scanner_end
The end of the data in the from_scanner buffer.
Definition: scanner.c:72
Here is the call graph for this function:

◆ openvas_scanner_free()

void openvas_scanner_free ( )

Free the scanner allocated data. Doesn't close socket and terminate the session.

Definition at line 659 of file scanner.c.

References openvas_scanner_address, openvas_scanner_ca_pub, openvas_scanner_credentials, openvas_scanner_key_priv, openvas_scanner_key_pub, openvas_scanner_session, openvas_scanner_socket, and openvas_scanner_unix_path.

Referenced by openvas_scanner_init(), and openvas_scanner_set_unix().

660 {
661  close (openvas_scanner_socket);
664  gnutls_deinit (openvas_scanner_session);
667  gnutls_certificate_free_credentials (openvas_scanner_credentials);
669  memset (&openvas_scanner_address, '\0', sizeof (openvas_scanner_address));
670  g_free (openvas_scanner_ca_pub);
671  g_free (openvas_scanner_key_pub);
672  g_free (openvas_scanner_key_priv);
673  g_free (openvas_scanner_unix_path);
674  openvas_scanner_ca_pub = NULL;
678 }
char * openvas_scanner_unix_path
Definition: scanner.c:57
gnutls_certificate_credentials_t openvas_scanner_credentials
Definition: scanner.c:51
int openvas_scanner_socket
Definition: scanner.c:52
gnutls_session_t openvas_scanner_session
Definition: scanner.c:50
char * openvas_scanner_ca_pub
Definition: scanner.c:54
char * openvas_scanner_key_priv
Definition: scanner.c:56
struct sockaddr_in openvas_scanner_address
Definition: scanner.c:53
char * openvas_scanner_key_pub
Definition: scanner.c:55
Here is the caller graph for this function:

◆ openvas_scanner_full()

int openvas_scanner_full ( )

Check whether the buffer for data from Scanner is full.

Returns
1 if full, 0 otherwise.

Definition at line 310 of file scanner.c.

References from_scanner_end, and from_scanner_size.

Referenced by openvas_scanner_read().

311 {
313 }
buffer_size_t from_scanner_size
The current size of the from_scanner buffer.
Definition: scanner.c:77
buffer_size_t from_scanner_end
The end of the data in the from_scanner buffer.
Definition: scanner.c:72
Here is the caller graph for this function:

◆ openvas_scanner_get_nfds()

int openvas_scanner_get_nfds ( int  socket)

Get the nfds value to use for a select() call.

Parameters
[in]socketSocket to compare to.
Returns
socket + 1 if socket value is higher then scanner's or not connected to a scanner, scanner socket + 1 otherwise.

Definition at line 732 of file scanner.c.

References openvas_scanner_socket.

733 {
734  if (socket > openvas_scanner_socket)
735  return 1 + socket;
736  else
737  return 1 + openvas_scanner_socket;
738 }
int openvas_scanner_socket
Definition: scanner.c:52

◆ openvas_scanner_init()

int openvas_scanner_init ( int  cache_mode)

Initializes the already setup connection with the Scanner.

Parameters
[in]cache_modeNVT Cache mode if true, which means sending NVT_INFO command to scanner in initial negotiation.
Returns
0 success, -1 error.

Definition at line 778 of file scanner.c.

References from_scanner, from_scanner_size, openvas_scanner_free(), openvas_scanner_socket, openvas_scanner_wait(), and openvas_scanner_write().

779 {
780  int ret;
781 
782  if (openvas_scanner_socket == -1)
783  return -1;
784  from_scanner = g_malloc0 (from_scanner_size);
785  ret = openvas_scanner_write (cache_mode);
786  if (ret != -3)
787  {
789  return -1;
790  }
791  if (openvas_scanner_wait ())
792  return -2;
793 
794  return 0;
795 }
void openvas_scanner_free()
Free the scanner allocated data. Doesn&#39;t close socket and terminate the session.
Definition: scanner.c:659
buffer_size_t from_scanner_size
The current size of the from_scanner buffer.
Definition: scanner.c:77
int openvas_scanner_wait()
Wait for the scanner socket to be writable.
Definition: scanner.c:463
int openvas_scanner_socket
Definition: scanner.c:52
int openvas_scanner_write(int nvt_cache_mode)
Write as much as possible from the to_scanner buffer to the scanner.
Definition: scanner.c:338
char * from_scanner
Buffer of input from the scanner.
Definition: scanner.c:62
Here is the call graph for this function:

◆ openvas_scanner_is_loading()

int openvas_scanner_is_loading ( )

Checks whether the connected to OpenVAS Scanner is still loading plugins. To be called right after openvas_scanner_init().

Returns
1 if loading, 0 if not loading or error.

Definition at line 876 of file scanner.c.

References openvas_scanner_read(), openvas_usleep(), and process_otp_scanner_input().

877 {
878  int attempts = 5;
879  int ret = 0;
880  while (attempts >= 0)
881  {
882  /* Add little delay in case we read before scanner write, as the socket is
883  * non-blocking. */
884  attempts = attempts - 1;
885  openvas_usleep (500000);
887 
888  switch (process_otp_scanner_input (NULL))
889  {
890  case 3:
891  /* Still loading. */
892  return 1;
893  case 5:
894  /* Empty message. Try again. */
895  ret = 1;
896  break;
897  default:
898  return 0;
899  }
900  }
901  return ret;
902 }
int openvas_scanner_read()
Read as much from the server as the from_scanner buffer will.
Definition: scanner.c:233
int openvas_usleep(unsigned int microseconds)
Sleep for some number of microseconds, handling interrupts.
Definition: utils.c:39
int process_otp_scanner_input(void(*progress)())
Process any lines available in from_scanner.
Definition: otp.c:781
Here is the call graph for this function:

◆ openvas_scanner_peek()

int openvas_scanner_peek ( )

Check if there is any data to receive from connected Scanner socket.

Returns
1 if there is data in socket buffer, 0 if no data or not connected to a scanner.

Definition at line 715 of file scanner.c.

References openvas_scanner_socket.

716 {
717  char chr;
718  if (openvas_scanner_socket == -1)
719  return 0;
720  return recv (openvas_scanner_socket, &chr, 1, MSG_PEEK);
721 }
int openvas_scanner_socket
Definition: scanner.c:52

◆ openvas_scanner_read()

int openvas_scanner_read ( )

Read as much from the server as the from_scanner buffer will.

hold.

Returns
0 on reading everything available, -1 on error, -2 if from_scanner buffer is full or -3 on reaching end of file.
Todo:
Rehandshake.

Definition at line 233 of file scanner.c.

References openvas_scanner_full(), and openvas_scanner_socket.

Referenced by openvas_scanner_is_loading().

234 {
235  if (openvas_scanner_socket == -1)
236  return -1;
237 
238  while (!openvas_scanner_full ())
239  {
240  ssize_t count;
241 
243  {
246  if (count < 0)
247  {
248  if (errno == EINTR)
249  continue;
250  else if (errno == EAGAIN)
251  return 0;
252  else
253  {
254  g_warning ("%s: Failed to read from scanner: %s\n", __FUNCTION__,
255  strerror (errno));
256  return -1;
257  }
258  }
259  }
260  else
261  {
262  count = gnutls_record_recv (openvas_scanner_session,
265  if (count < 0)
266  {
267  if (count == GNUTLS_E_AGAIN)
268  /* Got everything available, return to `select'. */
269  return 0;
270  if (count == GNUTLS_E_INTERRUPTED)
271  /* Interrupted, try read again. */
272  continue;
273  if (count == GNUTLS_E_REHANDSHAKE)
274  {
276  g_debug (" should rehandshake\n");
277  continue;
278  }
279  if (gnutls_error_is_fatal (count) == 0
280  && (count == GNUTLS_E_WARNING_ALERT_RECEIVED
281  || count == GNUTLS_E_FATAL_ALERT_RECEIVED))
282  {
283  int alert = gnutls_alert_get (openvas_scanner_session);
284  const char* alert_name = gnutls_alert_get_name (alert);
285  g_warning ("%s: TLS Alert %d: %s\n", __FUNCTION__, alert,
286  alert_name);
287  }
288  g_warning ("%s: failed to read from server: %s\n", __FUNCTION__,
289  gnutls_strerror (count));
290  return -1;
291  }
292  }
293  if (count == 0)
294  /* End of file. */
295  return -3;
296  assert (count > 0);
297  from_scanner_end += count;
298  }
299 
300  /* Buffer full. */
301  return -2;
302 }
buffer_size_t from_scanner_size
The current size of the from_scanner buffer.
Definition: scanner.c:77
char * openvas_scanner_unix_path
Definition: scanner.c:57
int openvas_scanner_full()
Check whether the buffer for data from Scanner is full.
Definition: scanner.c:310
int openvas_scanner_socket
Definition: scanner.c:52
gnutls_session_t openvas_scanner_session
Definition: scanner.c:50
char * alert_name(alert_t alert)
Return the name of an alert.
Definition: manage_sql.c:8362
buffer_size_t from_scanner_end
The end of the data in the from_scanner buffer.
Definition: scanner.c:72
char * from_scanner
Buffer of input from the scanner.
Definition: scanner.c:62
Here is the call graph for this function:
Here is the caller graph for this function:

◆ openvas_scanner_realloc()

int openvas_scanner_realloc ( )

Reallocates the from_scanner buffer to a higher size.

Returns
1 if max size reached, 0 otherwise.

Definition at line 321 of file scanner.c.

References from_scanner, from_scanner_max_size, and from_scanner_size.

322 {
324  return 1;
325  from_scanner_size *= 2;
326  g_warning ("Reallocing to %d", from_scanner_size);
328  return 0;
329 }
buffer_size_t from_scanner_size
The current size of the from_scanner buffer.
Definition: scanner.c:77
buffer_size_t from_scanner_max_size
The max size of the from_scanner buffer.
Definition: scanner.c:82
char * from_scanner
Buffer of input from the scanner.
Definition: scanner.c:62

◆ openvas_scanner_session_peek()

int openvas_scanner_session_peek ( )

Check if there is any data to receive from connected Scanner session.

Returns
1 if there is data in session buffer, 0 if no data or not connected to a scanner.

Definition at line 747 of file scanner.c.

References openvas_scanner_session, openvas_scanner_socket, and openvas_scanner_unix_path.

748 {
749  if (openvas_scanner_socket == -1)
750  return 0;
752  return 0;
753  else
754  return !!gnutls_record_check_pending (openvas_scanner_session);
755 }
char * openvas_scanner_unix_path
Definition: scanner.c:57
int openvas_scanner_socket
Definition: scanner.c:52
gnutls_session_t openvas_scanner_session
Definition: scanner.c:50

◆ openvas_scanner_set_address()

int openvas_scanner_set_address ( const char *  addr,
int  port 
)

Set the scanner's address and port. Will try to resolve addr if it is a hostname.

Parameters
[in]addrScanner address string.
[in]portScanner port.
Returns
0 success, -1 error.

Definition at line 807 of file scanner.c.

References openvas_scanner_address, and openvas_scanner_unix_path.

Referenced by manage_scanner_set().

808 {
810  {
811  g_free (openvas_scanner_unix_path);
813  }
814  if (port < 1 || port > 65535)
815  return -1;
816  memset (&openvas_scanner_address, '\0', sizeof (openvas_scanner_address));
817  openvas_scanner_address.sin_family = AF_INET;
818  openvas_scanner_address.sin_port = htons (port);
819  if (openvas_resolve (addr, &openvas_scanner_address.sin_addr, AF_INET))
820  return -1;
821 
822  return 0;
823 }
char * openvas_scanner_unix_path
Definition: scanner.c:57
struct sockaddr_in openvas_scanner_address
Definition: scanner.c:53
Here is the caller graph for this function:

◆ openvas_scanner_set_certs()

void openvas_scanner_set_certs ( const char *  ca_pub,
const char *  key_pub,
const char *  key_priv 
)

Set the scanner's CA Certificate, and public/private key pair.

Parameters
[in]ca_pubCA Certificate.
[in]key_pubScanner Certificate.
[in]key_privScanner private key.

Definition at line 853 of file scanner.c.

References openvas_scanner_ca_pub, openvas_scanner_key_priv, openvas_scanner_key_pub, and openvas_scanner_unix_path.

Referenced by set_certs().

855 {
857  {
858  g_free (openvas_scanner_unix_path);
860  }
861  if (ca_pub)
862  openvas_scanner_ca_pub = g_strdup (ca_pub);
863  if (key_pub)
864  openvas_scanner_key_pub = g_strdup (key_pub);
865  if (key_priv)
866  openvas_scanner_key_priv = g_strdup (key_priv);
867 }
char * openvas_scanner_unix_path
Definition: scanner.c:57
char * openvas_scanner_ca_pub
Definition: scanner.c:54
char * openvas_scanner_key_priv
Definition: scanner.c:56
char * openvas_scanner_key_pub
Definition: scanner.c:55
Here is the caller graph for this function:

◆ openvas_scanner_set_unix()

int openvas_scanner_set_unix ( const char *  path)

Set the scanner's unix socket path.

Parameters
[in]pathPath to scanner unix socket.
Returns
0 success, -1 error.

Definition at line 833 of file scanner.c.

References openvas_scanner_address, openvas_scanner_free(), and openvas_scanner_unix_path.

Referenced by manage_scanner_set().

834 {
835  if (!path)
836  return -1;
837 
839  memset (&openvas_scanner_address, '\0', sizeof (openvas_scanner_address));
840  openvas_scanner_unix_path = g_strdup (path);
841 
842  return 0;
843 }
void openvas_scanner_free()
Free the scanner allocated data. Doesn&#39;t close socket and terminate the session.
Definition: scanner.c:659
char * openvas_scanner_unix_path
Definition: scanner.c:57
struct sockaddr_in openvas_scanner_address
Definition: scanner.c:53
Here is the call graph for this function:
Here is the caller graph for this function:

◆ openvas_scanner_wait()

int openvas_scanner_wait ( )

Wait for the scanner socket to be writable.

Returns
0 on success, -1 on error.

Definition at line 463 of file scanner.c.

References openvas_scanner_socket.

Referenced by openvas_scanner_init().

464 {
465  if (openvas_scanner_socket == -1)
466  return -1;
467 
468  while (1)
469  {
470  int ret;
471  struct timeval timeout;
472  fd_set writefds;
473 
474  timeout.tv_usec = 0;
475  timeout.tv_sec = 1;
476  FD_ZERO (&writefds);
477  FD_SET (openvas_scanner_socket, &writefds);
478 
479  ret = select (1 + openvas_scanner_socket, NULL, &writefds, NULL, &timeout);
480  if (ret < 0)
481  {
482  if (errno == EINTR)
483  continue;
484  g_warning ("%s: select failed (connect): %s\n", __FUNCTION__,
485  strerror (errno));
486  return -1;
487  }
488 
489  if (FD_ISSET (openvas_scanner_socket, &writefds))
490  break;
491  }
492  return 0;
493 }
int openvas_scanner_socket
Definition: scanner.c:52
Here is the caller graph for this function:

◆ openvas_scanner_write()

int openvas_scanner_write ( int  nvt_cache_mode)

Write as much as possible from the to_scanner buffer to the scanner.

Returns
0 wrote everything, -1 error, -2 wrote as much as scanner accepted, -3 did an initialisation step.

Definition at line 338 of file scanner.c.

References openvas_scanner_address, openvas_scanner_session, openvas_scanner_socket, openvas_scanner_unix_path, SCANNER_INIT_CONNECTED, scanner_init_offset, scanner_init_state, SCANNER_INIT_TOP, and set_scanner_init_state().

Referenced by openvas_scanner_init().

339 {
340  int ret = 0;
341 
342  if (openvas_scanner_socket == -1)
343  return -1;
344  switch (scanner_init_state)
345  {
346  case SCANNER_INIT_TOP:
348  ret = openvas_server_connect (openvas_scanner_socket,
351  switch (ret)
352  {
353  case 0:
355  /* The socket must have O_NONBLOCK set, in case an "asynchronous network
356  * error" removes the data between `select' and `read'. */
357  if (fcntl (openvas_scanner_socket, F_SETFL, O_NONBLOCK) == -1)
358  {
359  g_warning ("%s: failed to set scanner socket flag: %s\n",
360  __FUNCTION__, strerror (errno));
361  return -1;
362  }
363  /* Fall through to SCANNER_INIT_CONNECTED case below, to write
364  * version string. */
365  break;
366  default:
367  return -1;
368  }
369  /* fallthrough */
371  {
372  char* string = "< OTP/2.0 >\n";
373 
374  scanner_init_offset = write_string_to_server
375  (string + scanner_init_offset);
376  if (scanner_init_offset == 0)
378  else if (scanner_init_offset == -1)
379  {
381  return -1;
382  }
383  if (nvt_cache_mode)
384  {
385  string = "CLIENT <|> NVT_INFO <|> CLIENT\n";
386  scanner_init_offset = write_string_to_server
387  (string + scanner_init_offset);
388  if (scanner_init_offset == -1)
389  {
391  return -1;
392  }
393  }
394  break;
395  }
397  return 0;
400  return 0;
402  if (nvt_cache_mode)
403  {
404  static char* const ack = "CLIENT <|> COMPLETE_LIST <|> CLIENT\n";
405  scanner_init_offset = write_string_to_server
406  (ack + scanner_init_offset);
407  if (scanner_init_offset == 0)
408  set_scanner_init_state (nvt_cache_mode == -1
411  else if (scanner_init_offset == -1)
412  {
414  return -1;
415  }
416  break;
417  }
418  /* fallthrough */
420  {
421  static char* const ack = "\n";
422  scanner_init_offset = write_string_to_server
423  (ack + scanner_init_offset);
424  if (scanner_init_offset == 0)
425  {
426  if (nvt_cache_mode == -1)
428  else if (nvt_cache_mode == -2)
430  else
432  }
433  else if (scanner_init_offset == -1)
434  {
436  return -1;
437  }
438  else
439  break;
440  }
441  /* fallthrough */
442  case SCANNER_INIT_DONE:
445  while (1)
446  switch (write_to_server_buffer ())
447  {
448  case 0: return 0;
449  case -1: return -1;
450  case -2: return -2;
451  case -3: continue; /* Interrupted. */
452  }
453  }
454  return -3;
455 }
scanner_init_state_t scanner_init_state
The initialisation state of the scanner.
Definition: otp.c:411
char * openvas_scanner_unix_path
Definition: scanner.c:57
int openvas_scanner_socket
Definition: scanner.c:52
gnutls_session_t openvas_scanner_session
Definition: scanner.c:50
void set_scanner_init_state(scanner_init_state_t state)
Set the scanner initialisation state, scanner_init_state.
Definition: otp.c:432
int scanner_init_offset
Offset into initialisation string being sent to scanner.
Definition: otp.c:416
struct sockaddr_in openvas_scanner_address
Definition: scanner.c:53
Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ from_scanner

char* from_scanner = NULL

Buffer of input from the scanner.

Todo:
As with the OMP version, these should most likely be passed to and from the client in a data structure like an otp_parser_t.

Definition at line 62 of file scanner.c.

Referenced by openvas_scanner_close(), openvas_scanner_init(), openvas_scanner_realloc(), and process_otp_scanner_input().

◆ from_scanner_end

buffer_size_t from_scanner_end = 0

The end of the data in the from_scanner buffer.

Definition at line 72 of file scanner.c.

Referenced by openvas_scanner_fork(), openvas_scanner_full(), and process_otp_scanner_input().

◆ from_scanner_max_size

buffer_size_t from_scanner_max_size = 1073741824

The max size of the from_scanner buffer.

Definition at line 82 of file scanner.c.

Referenced by openvas_scanner_realloc().

◆ from_scanner_size

buffer_size_t from_scanner_size = 1048576

The current size of the from_scanner buffer.

Definition at line 77 of file scanner.c.

Referenced by openvas_scanner_full(), openvas_scanner_init(), and openvas_scanner_realloc().

◆ from_scanner_start

buffer_size_t from_scanner_start = 0

The start of the data in the from_scanner buffer.

Definition at line 67 of file scanner.c.

Referenced by openvas_scanner_fork(), and process_otp_scanner_input().

◆ openvas_scanner_address

struct sockaddr_in openvas_scanner_address

◆ openvas_scanner_ca_pub

char* openvas_scanner_ca_pub = NULL

◆ openvas_scanner_credentials

gnutls_certificate_credentials_t openvas_scanner_credentials = NULL

◆ openvas_scanner_key_priv

char* openvas_scanner_key_priv = NULL

◆ openvas_scanner_key_pub

char* openvas_scanner_key_pub = NULL

◆ openvas_scanner_session

gnutls_session_t openvas_scanner_session = NULL

◆ openvas_scanner_socket

◆ openvas_scanner_unix_path

◆ to_server

char to_server[]

Referenced by sendn_to_server().

◆ to_server_end

int to_server_end

◆ to_server_start

int to_server_start

Referenced by to_server_buffer_space().