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 }