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