libmicrohttpd2

HTTP server C library (MHD 2.x, alpha)
Log | Files | Refs | README | LICENSE

daemon_set_options.c (11997B)


      1 /* This is generated code, it is still under LGPLv2.1+.
      2    Do not edit directly! */
      3 /* *INDENT-OFF* */
      4 /**
      5  * @file daemon_set_options.c
      6  * @author options-generator.c
      7  */
      8 
      9 #include "mhd_sys_options.h"
     10 #include "sys_base_types.h"
     11 #include "sys_malloc.h"
     12 #include <string.h>
     13 #include "mhd_daemon.h"
     14 #include "daemon_options.h"
     15 #include "mhd_public_api.h"
     16 
     17 
     18 MHD_FN_PAR_NONNULL_ALL_ MHD_EXTERN_
     19 enum MHD_StatusCode
     20 MHD_daemon_set_options (
     21   struct MHD_Daemon *MHD_RESTRICT daemon,
     22   const struct MHD_DaemonOptionAndValue *MHD_RESTRICT options,
     23   size_t options_max_num)
     24 {
     25   struct DaemonOptions *restrict settings = daemon->settings;
     26   enum MHD_StatusCode res = MHD_SC_OK;
     27   size_t i;
     28 
     29   if (mhd_DAEMON_STATE_NOT_STARTED != daemon->state)
     30     return MHD_SC_TOO_LATE;
     31 
     32   for (i = 0; i < options_max_num; i++)
     33   {
     34     const struct MHD_DaemonOptionAndValue *const option
     35       = options + i;
     36     switch (option->opt)
     37     {
     38     case MHD_D_O_END:
     39       i = options_max_num - 1;
     40       break;
     41     case MHD_D_O_WORK_MODE:
     42       settings->work_mode = option->val.work_mode;
     43       continue;
     44     case MHD_D_O_POLL_SYSCALL:
     45       settings->poll_syscall = option->val.poll_syscall;
     46       continue;
     47     case MHD_D_O_REREGISTER_ALL:
     48       settings->reregister_all = option->val.reregister_all;
     49       continue;
     50     case MHD_D_O_LOG_CALLBACK:
     51       /* Note: set directly to the daemon */
     52       daemon->log_params = option->val.log_callback;
     53       continue;
     54     case MHD_D_O_BIND_PORT:
     55       settings->bind_port.v_af = option->val.bind_port.v_af;
     56       settings->bind_port.v_port = option->val.bind_port.v_port;
     57       continue;
     58     case MHD_D_O_BIND_SA:
     59       /* custom setter */
     60       if (0 != option->val.bind_sa.v_sa_len)
     61       {
     62         if (NULL != settings->bind_sa.v_sa)
     63           free (settings->bind_sa.v_sa);
     64         settings->bind_sa.v_sa = (struct sockaddr *)
     65                                  malloc (option->val.bind_sa.v_sa_len);
     66         if (NULL == settings->bind_sa.v_sa)
     67           return MHD_SC_DAEMON_MEM_ALLOC_FAILURE;
     68         memcpy (settings->bind_sa.v_sa, option->val.bind_sa.v_sa,
     69                 option->val.bind_sa.v_sa_len);
     70         settings->bind_sa.v_sa_len = option->val.bind_sa.v_sa_len;
     71         settings->bind_sa.v_dual = option->val.bind_sa.v_dual;
     72       }
     73       continue;
     74     case MHD_D_O_LISTEN_SOCKET:
     75       settings->listen_socket = option->val.listen_socket;
     76       continue;
     77     case MHD_D_O_LISTEN_ADDR_REUSE:
     78       settings->listen_addr_reuse = option->val.listen_addr_reuse;
     79       continue;
     80     case MHD_D_O_TCP_FASTOPEN:
     81       settings->tcp_fastopen.v_option = option->val.tcp_fastopen.v_option;
     82       settings->tcp_fastopen.v_queue_length = option->val.tcp_fastopen.v_queue_length;
     83       continue;
     84     case MHD_D_O_LISTEN_BACKLOG:
     85       settings->listen_backlog = option->val.listen_backlog;
     86       continue;
     87     case MHD_D_O_SIGPIPE_SUPPRESSED:
     88       settings->sigpipe_suppressed = option->val.sigpipe_suppressed;
     89       continue;
     90     case MHD_D_O_TLS:
     91       settings->tls = option->val.tls;
     92       continue;
     93     case MHD_D_O_TLS_CERT_KEY:
     94       /* custom setter */
     95       if ((NULL == option->val.tls_cert_key.v_mem_cert)
     96           || (NULL == option->val.tls_cert_key.v_mem_key))
     97         return MHD_SC_TLS_CONF_BAD_CERT;
     98       else
     99       {
    100         size_t cert_size;
    101         size_t key_size;
    102         size_t pass_size;
    103         cert_size = strlen (option->val.tls_cert_key.v_mem_cert);
    104         key_size = strlen (option->val.tls_cert_key.v_mem_key);
    105         if ((0 == cert_size)
    106             || (0 == key_size))
    107           return MHD_SC_TLS_CONF_BAD_CERT;
    108         ++cert_size; /* Space for zero-termination */
    109         ++key_size;  /* Space for zero-termination */
    110         if (NULL != option->val.tls_cert_key.v_mem_pass)
    111           pass_size = strlen (option->val.tls_cert_key.v_mem_pass);
    112         else
    113           pass_size = 0;
    114         if (0 != pass_size)
    115           ++pass_size; /* Space for zero-termination */
    116         if (NULL != settings->tls_cert_key.v_mem_cert)
    117           free (settings->tls_cert_key.v_mem_cert); // TODO: Support multiple certificates!!
    118         settings->tls_cert_key.v_mem_cert = (char *) malloc (cert_size
    119                                                              + key_size
    120                                                              + pass_size);
    121         if (NULL == settings->tls_cert_key.v_mem_cert)
    122           return MHD_SC_DAEMON_MEM_ALLOC_FAILURE;
    123         memcpy (settings->tls_cert_key.v_mem_cert,
    124                 option->val.tls_cert_key.v_mem_cert,
    125                 cert_size);
    126         memcpy (settings->tls_cert_key.v_mem_cert + cert_size,
    127                 option->val.tls_cert_key.v_mem_key,
    128                 key_size);
    129         settings->tls_cert_key.v_mem_key =
    130           settings->tls_cert_key.v_mem_cert + cert_size;
    131         if (0 != pass_size)
    132         {
    133           memcpy (settings->tls_cert_key.v_mem_cert + cert_size + key_size,
    134                   option->val.tls_cert_key.v_mem_pass,
    135                   pass_size);
    136           settings->tls_cert_key.v_mem_pass =
    137             settings->tls_cert_key.v_mem_cert + cert_size + key_size;
    138         }
    139         else
    140           settings->tls_cert_key.v_mem_pass = NULL;
    141       }
    142       continue;
    143     case MHD_D_O_TLS_CLIENT_CA:
    144       settings->tls_client_ca = option->val.tls_client_ca;
    145       continue;
    146     case MHD_D_O_TLS_PSK_CALLBACK:
    147       settings->tls_psk_callback.v_psk_cb = option->val.tls_psk_callback.v_psk_cb;
    148       settings->tls_psk_callback.v_psk_cb_cls = option->val.tls_psk_callback.v_psk_cb_cls;
    149       continue;
    150     case MHD_D_O_NO_ALPN:
    151       settings->no_alpn = option->val.no_alpn;
    152       continue;
    153     case MHD_D_O_TLS_APP_NAME:
    154       /* custom setter */
    155       settings->tls_app_name.v_disable_fallback =
    156         option->val.tls_app_name.v_disable_fallback;
    157       if (NULL == option->val.tls_app_name.v_app_name)
    158         return MHD_SC_CONFIGURATION_PARAM_NULL;
    159       else
    160       {
    161         size_t len;
    162         len = strlen (option->val.tls_app_name.v_app_name);
    163         if (128 <= len)
    164           return MHD_SC_CONFIGURATION_PARAM_TOO_LARGE;
    165         settings->tls_app_name.v_app_name = (char *) malloc (len + 1u);
    166         if (NULL == settings->tls_app_name.v_app_name)
    167           return MHD_SC_DAEMON_MEM_ALLOC_FAILURE;
    168         memcpy (settings->tls_app_name.v_app_name,
    169                 option->val.tls_app_name.v_app_name,
    170                 len + 1u);
    171       }
    172       continue;
    173     case MHD_D_O_TLS_OPENSSL_DEF_FILE:
    174       /* custom setter */
    175       settings->tls_openssl_def_file.v_disable_fallback =
    176         option->val.tls_openssl_def_file.v_disable_fallback;
    177       if (NULL == option->val.tls_openssl_def_file.v_pathname)
    178         settings->tls_openssl_def_file.v_pathname = NULL;
    179       else
    180       {
    181         size_t len;
    182         len = strlen (option->val.tls_openssl_def_file.v_pathname);
    183         settings->tls_openssl_def_file.v_pathname = (char *) malloc (len + 1u);
    184         if (NULL == settings->tls_openssl_def_file.v_pathname)
    185           return MHD_SC_DAEMON_MEM_ALLOC_FAILURE;
    186         memcpy (settings->tls_openssl_def_file.v_pathname,
    187                 option->val.tls_openssl_def_file.v_pathname,
    188                 len + 1u);
    189       }
    190       continue;
    191     case MHD_D_O_DEFAULT_TIMEOUT:
    192       settings->default_timeout = option->val.default_timeout;
    193       continue;
    194     case MHD_D_O_GLOBAL_CONNECTION_LIMIT:
    195       settings->global_connection_limit = option->val.global_connection_limit;
    196       continue;
    197     case MHD_D_O_PER_IP_LIMIT:
    198       settings->per_ip_limit = option->val.per_ip_limit;
    199       continue;
    200     case MHD_D_O_ACCEPT_POLICY:
    201       settings->accept_policy.v_apc = option->val.accept_policy.v_apc;
    202       settings->accept_policy.v_apc_cls = option->val.accept_policy.v_apc_cls;
    203       continue;
    204     case MHD_D_O_CONN_BUFF_ZEROING:
    205       settings->conn_buff_zeroing = option->val.conn_buff_zeroing;
    206       continue;
    207     case MHD_D_O_PROTOCOL_STRICT_LEVEL:
    208       settings->protocol_strict_level.v_sl = option->val.protocol_strict_level.v_sl;
    209       settings->protocol_strict_level.v_how = option->val.protocol_strict_level.v_how;
    210       continue;
    211     case MHD_D_O_EARLY_URI_LOGGER:
    212       settings->early_uri_logger.v_cb = option->val.early_uri_logger.v_cb;
    213       settings->early_uri_logger.v_cls = option->val.early_uri_logger.v_cls;
    214       continue;
    215     case MHD_D_O_DISABLE_URI_QUERY_PLUS_AS_SPACE:
    216       settings->disable_uri_query_plus_as_space = option->val.disable_uri_query_plus_as_space;
    217       continue;
    218     case MHD_D_O_SUPPRESS_DATE_HEADER:
    219       settings->suppress_date_header = option->val.suppress_date_header;
    220       continue;
    221     case MHD_D_O_ENABLE_SHOUTCAST:
    222       settings->enable_shoutcast = option->val.enable_shoutcast;
    223       continue;
    224     case MHD_D_O_CONN_MEMORY_LIMIT:
    225       settings->conn_memory_limit = option->val.conn_memory_limit;
    226       continue;
    227     case MHD_D_O_LARGE_POOL_SIZE:
    228       settings->large_pool_size = option->val.large_pool_size;
    229       continue;
    230     case MHD_D_O_STACK_SIZE:
    231       settings->stack_size = option->val.stack_size;
    232       continue;
    233     case MHD_D_O_FD_NUMBER_LIMIT:
    234       settings->fd_number_limit = option->val.fd_number_limit;
    235       continue;
    236     case MHD_D_O_TURBO:
    237       settings->turbo = option->val.turbo;
    238       continue;
    239     case MHD_D_O_DISABLE_THREAD_SAFETY:
    240       settings->disable_thread_safety = option->val.disable_thread_safety;
    241       continue;
    242     case MHD_D_O_DISALLOW_UPGRADE:
    243       settings->disallow_upgrade = option->val.disallow_upgrade;
    244       continue;
    245     case MHD_D_O_DISALLOW_SUSPEND_RESUME:
    246       settings->disallow_suspend_resume = option->val.disallow_suspend_resume;
    247       continue;
    248     case MHD_D_O_DISABLE_COOKIES:
    249       /* custom setter */
    250       /* The is not an easy for automatic generations */
    251       // TODO: remove options generator, put preprocessor directives to
    252       //       the first column
    253       #ifdef MHD_SUPPORT_COOKIES
    254       settings->disable_cookies = option->val.disable_cookies;
    255       #else
    256       if (MHD_NO != option->val.disable_cookies)
    257         return MHD_SC_FEATURE_DISABLED;
    258       #endif
    259       continue;
    260     case MHD_D_O_DAEMON_READY_CALLBACK:
    261       settings->daemon_ready_callback.v_cb = option->val.daemon_ready_callback.v_cb;
    262       settings->daemon_ready_callback.v_cb_cls = option->val.daemon_ready_callback.v_cb_cls;
    263       continue;
    264     case MHD_D_O_NOTIFY_CONNECTION:
    265       settings->notify_connection.v_ncc = option->val.notify_connection.v_ncc;
    266       settings->notify_connection.v_cls = option->val.notify_connection.v_cls;
    267       continue;
    268     case MHD_D_O_NOTIFY_STREAM:
    269       settings->notify_stream.v_nsc = option->val.notify_stream.v_nsc;
    270       settings->notify_stream.v_cls = option->val.notify_stream.v_cls;
    271       continue;
    272     case MHD_D_O_RANDOM_ENTROPY:
    273       /* custom setter */
    274       /* The is not an easy for automatic generations */
    275       if (0 != option->val.random_entropy.v_buf_size)
    276       {
    277         if (NULL != settings->random_entropy.v_buf)
    278           free (settings->random_entropy.v_buf);
    279         settings->random_entropy.v_buf =
    280           malloc (option->val.random_entropy.v_buf_size);
    281         if (NULL == settings->random_entropy.v_buf)
    282           return MHD_SC_DAEMON_MEM_ALLOC_FAILURE;
    283         memcpy (settings->random_entropy.v_buf,
    284                 option->val.random_entropy.v_buf,
    285                 option->val.random_entropy.v_buf_size);
    286         settings->random_entropy.v_buf_size =
    287           option->val.random_entropy.v_buf_size;
    288       }
    289       continue;
    290     case MHD_D_O_AUTH_DIGEST_MAP_SIZE:
    291       settings->auth_digest_map_size = option->val.auth_digest_map_size;
    292       continue;
    293     case MHD_D_O_AUTH_DIGEST_NONCE_TIMEOUT:
    294       settings->auth_digest_nonce_timeout = option->val.auth_digest_nonce_timeout;
    295       continue;
    296     case MHD_D_O_AUTH_DIGEST_DEF_MAX_NC:
    297       settings->auth_digest_def_max_nc = option->val.auth_digest_def_max_nc;
    298       continue;
    299     case MHD_D_O_SENTINEL:
    300     default: /* for -Wswitch-default -Wswitch-enum */
    301       res = MHD_SC_OPTION_UNKNOWN;
    302       i = options_max_num - 1;
    303       break;
    304     }
    305   }
    306   return res;
    307 }