mageni/mageni

View on GitHub
src/backend/api/src/api_get.h

Summary

Maintainability
Test Coverage
/**
 * SPDX-License-Identifier: GPL-2.0-or-later
 * SPDX-FileCopyrightText: Copyright 2018 Greenbone Networks GmbH
 * SPDX-FileComment: Base facilities.
 * SPDX-FileContributor: Matthew Mundell <matthew.mundell@greenbone.net>
 * SPDX-FileContributor: Mageni Security LLC
 * 
 */

#ifndef _GVMD_GMP_GET_H
#define _GVMD_GMP_GET_H

#include "manage.h"

void
get_data_parse_attributes (get_data_t *,
                           const gchar *,
                           const gchar **,
                           const gchar **);

int
init_get (gchar *, get_data_t *, const gchar *, int *);

/**
 * @brief Call init_get for a GET end handler.
 *
 * @param[in]  type     Resource type.
 * @param[in]  capital  Resource type, capitalised.
 */
#define INIT_GET(type, capital)                                   \
  count = 0;                                                      \
  ret = init_get ("get_" G_STRINGIFY (type) "s",                  \
                  &get_##type##s_data->get,                       \
                  G_STRINGIFY (capital) "s",                      \
                  &first);                                        \
  if (ret)                                                        \
    {                                                             \
      switch (ret)                                                \
        {                                                         \
        case 99:                                                  \
          SEND_TO_CLIENT_OR_FAIL (XML_ERROR_SYNTAX (              \
            "get_" G_STRINGIFY (type) "s", "Permission denied")); \
          break;                                                  \
        default:                                                  \
          internal_error_send_to_client (error);                  \
          return;                                                 \
        }                                                         \
      get_##type##s_data_reset (get_##type##s_data);              \
      set_client_state (CLIENT_AUTHENTIC);                        \
      return;                                                     \
    }

int
get_next (iterator_t *,
          get_data_t *,
          int *,
          int *,
          int (*) (iterator_t *, const get_data_t *));

int
send_get_start (const char *, int (*) (const char *, void *), void *);

/**
 * @brief Send start of GET response to client, returning on fail.
 *
 * @param[in]  type  Type of resource.
 * @param[in]  get   GET data.
 */
#define SEND_GET_START(type)                                                  \
  do                                                                          \
    {                                                                         \
      if (send_get_start (                                                    \
            type, gmp_parser->client_writer, gmp_parser->client_writer_data)) \
        {                                                                     \
          error_send_to_client (error);                                       \
          return;                                                             \
        }                                                                     \
    }                                                                         \
  while (0)

int
send_get_common (const char *,
                 get_data_t *,
                 iterator_t *,
                 int (*) (const char *, void *),
                 void *,
                 int,
                 int);

/**
 * @brief Send common part of GET response to client, returning on fail.
 *
 * @param[in]  type      Type of resource.
 * @param[in]  get       GET data.
 * @param[in]  iterator  Iterator.
 */
#define SEND_GET_COMMON(type, get, iterator)                               \
  do                                                                       \
    {                                                                      \
      if (send_get_common (                                                \
            G_STRINGIFY (type),                                            \
            get,                                                           \
            iterator,                                                      \
            gmp_parser->client_writer,                                     \
            gmp_parser->client_writer_data,                                \
            (get)->trash                                                   \
              ? trash_##type##_writable (get_iterator_resource (iterator)) \
              : type##_writable (get_iterator_resource (iterator)),        \
            (get)->trash                                                   \
              ? trash_##type##_in_use (get_iterator_resource (iterator))   \
              : type##_in_use (get_iterator_resource (iterator))))         \
        {                                                                  \
          error_send_to_client (error);                                    \
          return;                                                          \
        }                                                                  \
    }                                                                      \
  while (0)

int
buffer_get_filter_xml (GString *,
                       const char *,
                       const get_data_t *,
                       const char *,
                       const char *);

int
send_get_end (const char *,
              get_data_t *,
              int,
              int,
              int,
              int (*) (const char *, void *),
              void *);

int
send_get_end_no_counts (const char *,
                        get_data_t *,
                        int (*) (const char *, void *),
                        void *);

/**
 * @brief Send end of GET response to client, returning on fail.
 *
 * @param[in]  type  Type of resource.
 * @param[in]  get   GET data.
 */
#define SEND_GET_END(type, get, count, filtered)         \
  do                                                     \
    {                                                    \
      if (send_get_end (type,                            \
                        get,                             \
                        count,                           \
                        filtered,                        \
                        resource_count (type, get),      \
                        gmp_parser->client_writer,       \
                        gmp_parser->client_writer_data)) \
        {                                                \
          error_send_to_client (error);                  \
          return;                                        \
        }                                                \
    }                                                    \
  while (0)

#endif /* not _GVMD_GMP_GET_H */