diff --git a/src/include/d_options.rec b/src/include/d_options.rec index 787379c3..ec6f4f81 100644 --- a/src/include/d_options.rec +++ b/src/include/d_options.rec @@ -37,8 +37,11 @@ Type: struct MHD_DaemonOptionValueLog Argument1: MHD_LoggingCallback log_cb Description1: the callback to use for logging, + NULL to disable logging -Argument2: void *lob_cb_cls +Argument2: void *log_cb_cls Description2: the closure for the logging callback +# Note: CG does not exactly like this... +CustomSetter: /* Note: set directly to the daemon */ ++ daemon->log_params = option->val.log_callback; # Listen socket @@ -69,6 +72,20 @@ Argument1: size_t sa_len Description1: the size of the socket address pointed by @a sa. Argument2: const struct sockaddr *sa Description2: the address to bind to; can be IPv4 (AF_INET), IPv6 (AF_INET6) or even a UNIX domain socket (AF_UNIX) +CustomSetter: /* custom setter */ ++ if (0 != option->val.bind_sa.v_sa_len) ++ { ++ if (NULL != settings->bind_sa.v_sa) ++ free (settings->bind_sa.v_sa); ++ settings->bind_sa.v_sa = malloc (option->val.bind_sa.v_sa_len); ++ if (NULL == settings->bind_sa.v_sa) ++ return MHD_SC_DAEMON_MALLOC_FAILURE; ++ memcpy (settings->bind_sa.v_sa, ++ option->val.bind_sa.v_sa, ++ option->val.bind_sa.v_sa_len); ++ settings->bind_sa.v_sa_len = option->val.bind_sa.v_sa_len; ++ settings->bind_sa.v_dual = option->val.bind_sa.v_dual; ++ } Name: listen_socket Value: 82 @@ -78,7 +95,7 @@ Comment: Accept connections from the given socket. Socket + Does not work with #MHD_D_OPTION_BIND_PORT() or #MHD_D_OPTION_BIND_SA(). + + If no listen socket optins (#MHD_D_OPTION_BIND_PORT(), #MHD_D_OPTION_BIND_SA(), #MHD_D_OPTION_LISTEN_SOCKET()) are used, MHD does not listen for incoming connection. -Argument1: MHD_socket listen_fd +Argument1: MHD_Socket listen_fd Description1: the listen socket to use, ignored if set to #MHD_INVALID_SOCKET Name: listen_addr_reuse @@ -276,7 +293,7 @@ Comment: The the maximum FD value. + Useful if application uses select() for polling the sockets, system FD_SETSIZE is good value for this option in such case. + Does not work with #MHD_D_OPTION_WM_WORKER_THREADS() or #MHD_D_OPTION_WM_THREAD_PER_CONNECTION(). + Does not work on W32 (WinSock sockets). -Argument1: MHD_socket max_fd +Argument1: MHD_Socket max_fd Description1: FIXME # MHD optimisations @@ -360,6 +377,22 @@ Argument1: size_t buf_size Description1: the size of the buffer Argument2: const void *buf Description2: the buffer with strong random data, the content will be copied by MHD +CustomSetter: /* custom setter */ ++ if (0 != option->val.random_entropy.v_buf_size) ++ { ++ if (NULL != settings->random_entropy.v_buf) ++ free (settings->random_entropy.v_buf); ++ settings->random_entropy.v_buf ++ = malloc (option->val.random_entropy.v_buf_size); ++ if (NULL == settings->random_entropy.v_buf) ++ return MHD_SC_DAEMON_MALLOC_FAILURE; ++ memcpy (settings->random_entropy.v_buf, ++ option->val.random_entropy.v_buf, ++ option->val.random_entropy.v_buf_size); ++ settings->random_entropy.v_buf_size ++ = option->val.random_entropy.v_buf_size; ++ } + Name: dauth_map_size Value: 401 diff --git a/src/include/microhttpd2_generated_daemon_options.h b/src/include/microhttpd2_generated_daemon_options.h index 27123cf9..70ddcf36 100644 --- a/src/include/microhttpd2_generated_daemon_options.h +++ b/src/include/microhttpd2_generated_daemon_options.h @@ -1,5 +1,3 @@ -/* EDITED MANUALLY */ - /** * The options (parameters) for MHD daemon */ @@ -869,16 +867,16 @@ struct MHD_DaemonOptionAndValue * Set a callback to use for logging * @param log_cb the callback to use for logging, * NULL to disable logging - * @param lob_cb_cls the closure for the logging callback + * @param log_cb_cls the closure for the logging callback * @return structure with the requested setting */ -# define MHD_D_OPTION_LOG_CALLBACK(log_cb,lob_cb_cls) \ +# define MHD_D_OPTION_LOG_CALLBACK(log_cb,log_cb_cls) \ MHD_NOWARN_COMPOUND_LITERALS_ \ (const struct MHD_DaemonOptionAndValue) \ { \ .opt = MHD_D_O_LOG_CALLBACK, \ .val.log_callback.v_log_cb = (log_cb), \ - .val.log_callback.v_lob_cb_cls = (lob_cb_cls) \ + .val.log_callback.v_log_cb_cls = (log_cb_cls) \ } \ MHD_RESTORE_WARN_COMPOUND_LITERALS_ /** @@ -1522,20 +1520,20 @@ MHD_D_OPTION_POLL_SYSCALL ( * Set a callback to use for logging * @param log_cb the callback to use for logging, * NULL to disable logging - * @param lob_cb_cls the closure for the logging callback + * @param log_cb_cls the closure for the logging callback * @return structure with the requested setting */ static MHD_INLINE struct MHD_daemonOptionAndValue MHD_D_OPTION_LOG_CALLBACK ( MHD_LoggingCallback log_cb, - void *lob_cb_cls + void *log_cb_cls ) { struct MHD_DaemonOptionAndValue opt_val; opt_val.opt = MHD_D_O_LOG_CALLBACK; opt_val.val.log_callback.v_log_cb = log_cb; - opt_val.val.log_callback.v_lob_cb_cls = lob_cb_cls; + opt_val.val.log_callback.v_log_cb_cls = log_cb_cls; return opt_val; } diff --git a/src/include/options-generator.c b/src/include/options-generator.c index f0376a28..93b157e1 100644 --- a/src/include/options-generator.c +++ b/src/include/options-generator.c @@ -38,6 +38,7 @@ struct Option unsigned int value; char *type; char *comment; + char *custom_setter; unsigned int argc; char *arguments[MAX_ARGS]; unsigned int desc; @@ -55,6 +56,7 @@ typedef void const char *comment, const char *type, const char *conditional, + const char *custom_setter, unsigned int argc, char **arguments, unsigned int desc, @@ -75,6 +77,7 @@ iterate (struct Option *head, o->comment, o->type, o->conditional, + o->custom_setter, o->argc, o->arguments, o->desc, @@ -89,6 +92,7 @@ check (const char *name, const char *comment, const char *type, const char *conditional, + const char *custom_setter, unsigned int argc, char **arguments, unsigned int desc, @@ -203,6 +207,7 @@ dump_enum (const char *name, const char *comment, const char *type, const char *conditional, + const char *custom_setter, unsigned int argc, char **arguments, unsigned int desc, @@ -234,6 +239,7 @@ dump_union_members (const char *name, const char *comment, const char *type, const char *conditional, + const char *custom_setter, unsigned int argc, char **arguments, unsigned int desct, @@ -271,6 +277,7 @@ dump_union (const char *name, const char *comment, const char *type, const char *conditional, + const char *custom_setter, unsigned int argc, char **arguments, unsigned int desc, @@ -319,6 +326,7 @@ dump_struct (const char *name, const char *comment, const char *type, const char *conditional, + const char *custom_setter, unsigned int argc, char **arguments, unsigned int desc, @@ -333,6 +341,7 @@ dump_struct (const char *name, comment, type, conditional, + custom_setter, argc, arguments, desc, @@ -351,6 +360,7 @@ dump_option_macros (const char *name, const char *comment, const char *type, const char *conditional, + const char *custom_setter, unsigned int argc, char **arguments, unsigned int desct, @@ -430,6 +440,7 @@ dump_option_static_functions (const char *name, const char *comment, const char *type, const char *conditional, + const char *custom_setter, unsigned int argc, char **arguments, unsigned int desct, @@ -514,6 +525,7 @@ dump_option_documentation_functions (const char *name, const char *comment, const char *type, const char *conditional, + const char *custom_setter, unsigned int argc, char **arguments, unsigned int desct, @@ -573,6 +585,7 @@ dump_option_set_switch (const char *name, const char *comment, const char *type, const char *conditional, + const char *custom_setter, unsigned int argc, char **arguments, unsigned int desc, @@ -583,35 +596,46 @@ dump_option_set_switch (const char *name, "#ifdef HAVE_%s", uppercase (conditional)); fprintf (f, - " case MHD_%c_OPTION_%s:\n", + " case MHD_%c_O_%s:\n", (char) toupper (*category), uppercase (name)); - if (0 == argc) + if (NULL != custom_setter) + { fprintf (f, - " %s->settings.%s = option->val.%s;\n", - category, - lowercase (name), - lowercase (name)); + " %s\n", + indent (" ", + custom_setter)); + } else - for (unsigned int i = 0; isettings.%s.v_%s = option->val.%s.v_%s;\n", - category, - lowercase (name), - vn, - lowercase (name), - vn); - else - fprintf (f, - " %s->settings.%s = option->val.%s;\n", - category, - lowercase (name), - lowercase (name)); + fprintf (f, + " settings->%s = option->val.%s;\n", + lowercase (name), + lowercase (name)); } + else + { + for (unsigned int i = 0; i%s.v_%s = option->val.%s.v_%s;\n", + lowercase (name), + vn, + lowercase (name), + vn); + else + fprintf (f, + " settings->%s = option->val.%s;\n", + lowercase (name), + lowercase (name)); + } + } + } fprintf (f, " continue;\n"); if (NULL != conditional) @@ -748,6 +772,10 @@ TOP: "Conditional: ", line))) continue; + if (NULL != (larg = parse (&last->custom_setter, + "CustomSetter: ", + line))) + continue; if (0 == strncasecmp (line, "Value: ", strlen ("Value: "))) @@ -891,7 +919,8 @@ TOP: printf ( "#else /* !MHD_USE_COMPOUND_LITERALS || !MHD_USE_DESIG_NEST_INIT */\n"); printf ("MHD_NOWARN_UNUSED_FUNC_"); - iterate (head, &dump_option_static_functions); + iterate (head, + &dump_option_static_functions); printf ("\n/**\n" " * Terminate the list of the options\n" " * @return the terminating object of struct MHD_%sOptionAndValue\n" @@ -959,15 +988,24 @@ TOP: return 2; } fprintf (f, - "/* This is generated code, it is still under LGPLv3+.\n" + "/* This is generated code, it is still under LGPLv2.1+.\n" " Do not edit directly! */\n" "/* *INDENT-OFF* */\n" "/**\n" - "/* @file %s_set_options.c\n" - "/* @author %s-options-generator.c\n" - " */\n\n" - "#include \"microhttpd2.h\"\n" - "#include \"internal.h\"\n\n" + " * @file %s_set_options.c\n" + " * @author %s-options-generator.c\n" + " */\n" + "\n" + "#include \"mhd_sys_options.h\"\n" + "#include \"sys_base_types.h\"\n" + "#include \"sys_malloc.h\"\n" + "#include \n" + "#include \"mhd_daemon.h\"\n" + "#include \"mhd_response.h\"\n" + "#include \"%s_options.h\"\n" + "#include \"mhd_public_api.h\"\n" + "\n" + "MHD_FN_PAR_NONNULL_ALL_ MHD_EXTERN_\n" "enum MHD_StatusCode\n" "MHD_%s_set_options (\n" " struct MHD_%s *%s,\n" @@ -977,18 +1015,38 @@ TOP: category, category, category, + category, capitalize (category), category, capitalize (category)); fprintf (f, - " for (size_t i=0;isettings;\n" + " size_t i;\n" + "\n" + " if (%s->frozen)\n" + " return MHD_SC_TOO_LATE;\n" + "\n" + " for (i=0;iopt) {\n", + capitalize (category), + category, + category, + capitalize (category)); + fprintf (f, + " case MHD_%c_O_END:\n" + " return MHD_SC_OK;\n", + (char) toupper (*category)); iterate (head, &dump_option_set_switch); + fprintf (f, + " case MHD_%c_O_SENTINEL:\n" + " break;\n", + (char) toupper (*category)); fprintf (f, " }\n" - " return MHD_SC_OPTION_UNSUPPORTED;\n" + " return MHD_SC_OPTION_UNKNOWN;\n" " }\n" " return MHD_SC_OK;\n"); fprintf (f, @@ -1015,23 +1073,32 @@ TOP: return 2; } fprintf (f, - "/* This is generated code, it is still under LGPLv3+.\n" + "/* This is generated code, it is still under LGPLv2.1+.\n" " Do not edit directly! */\n" "/* *INDENT-OFF* */\n" "/**\n" "/* @file %s_options.h\n" "/* @author %s-options-generator.c\n" " */\n\n" - "#include \"microhttpd2.h\"\n" - "#include \"internal.h\"\n\n" + "#ifndef MHD_%s_OPTIONS_H\n" + "#define MHD_%s_OTPIONS_H 1\n" + "\n" + "#include \"mhd_sys_options.h\"\n" + "#include \"mhd_public_api.h\"\n" + "\n" "struct %sOptions {\n", category, category, + uppercase (category), + uppercase (category), capitalize (category)); iterate (head, &dump_struct); fprintf (f, - "};\n"); + "};\n" + "\n" + "#endif /* ! MHD_%s_OPTIONS_H */\n", + uppercase (category)); fclose (f); chmod (do_h, S_IRUSR | S_IRGRP | S_IROTH); free (do_h); diff --git a/src/mhd2/daemon_options.h b/src/mhd2/daemon_options.h index 973f5ab4..009cf56b 100644 --- a/src/mhd2/daemon_options.h +++ b/src/mhd2/daemon_options.h @@ -2,20 +2,16 @@ Do not edit directly! */ /* *INDENT-OFF* */ /** - * @file daemon_options.h - * @author daemon-options-generator.c +/* @file daemon_options.h +/* @author daemon-options-generator.c */ -/* EDITED MANUALLY */ - #ifndef MHD_DAEMON_OPTIONS_H -#define MHD_DAEMON_OPTIONS_H 1 +#define MHD_DAEMON_OTPIONS_H 1 #include "mhd_sys_options.h" - #include "mhd_public_api.h" - struct DaemonOptions { /** * Value for #MHD_D_O_WORK_MODE. diff --git a/src/mhd2/daemon_set_options.c b/src/mhd2/daemon_set_options.c index 52cc2cf3..abe41e6f 100644 --- a/src/mhd2/daemon_set_options.c +++ b/src/mhd2/daemon_set_options.c @@ -6,26 +6,26 @@ * @author daemon-options-generator.c */ -/* EDITED MANUALLY */ - #include "mhd_sys_options.h" #include "sys_base_types.h" #include "sys_malloc.h" #include #include "mhd_daemon.h" +#include "mhd_response.h" #include "daemon_options.h" #include "mhd_public_api.h" - -MHD_FN_PAR_NONNULL_ALL_ MHD_EXTERN_ enum MHD_StatusCode -MHD_daemon_set_options (struct MHD_Daemon *daemon, - const struct MHD_DaemonOptionAndValue *options, - size_t options_max_num) +MHD_FN_PAR_NONNULL_ALL_ MHD_EXTERN_ +enum MHD_StatusCode +MHD_daemon_set_options ( + struct MHD_Daemon *daemon, + const struct MHD_DaemonOptionAndValue *options, + size_t options_max_num) { struct DaemonOptions *const settings = daemon->settings; size_t i; - if (mhd_DAEMON_STATE_NOT_STARTED != daemon->state) + if (daemon->frozen) return MHD_SC_TOO_LATE; for (i=0;ipoll_syscall = option->val.poll_syscall; continue; case MHD_D_O_LOG_CALLBACK: - /* Note: set directly to the daemon! */ + /* Note: set directly to the daemon */ daemon->log_params = option->val.log_callback; continue; case MHD_D_O_BIND_PORT: @@ -49,17 +49,16 @@ MHD_daemon_set_options (struct MHD_Daemon *daemon, settings->bind_port.v_port = option->val.bind_port.v_port; continue; case MHD_D_O_BIND_SA: - /* The is not an easy for automatic generations */ + /* custom setter */ if (0 != option->val.bind_sa.v_sa_len) { if (NULL != settings->bind_sa.v_sa) free (settings->bind_sa.v_sa); - settings->bind_sa.v_sa = malloc (option->val.bind_sa.v_sa_len); if (NULL == settings->bind_sa.v_sa) return MHD_SC_DAEMON_MALLOC_FAILURE; - - memcpy (settings->bind_sa.v_sa, option->val.bind_sa.v_sa, + memcpy (settings->bind_sa.v_sa, + option->val.bind_sa.v_sa, option->val.bind_sa.v_sa_len); settings->bind_sa.v_sa_len = option->val.bind_sa.v_sa_len; settings->bind_sa.v_dual = option->val.bind_sa.v_dual; @@ -166,22 +165,20 @@ MHD_daemon_set_options (struct MHD_Daemon *daemon, settings->notify_stream.v_cls = option->val.notify_stream.v_cls; continue; case MHD_D_O_RANDOM_ENTROPY: - /* The is not an easy for automatic generations */ + /* custom setter */ if (0 != option->val.random_entropy.v_buf_size) { if (NULL != settings->random_entropy.v_buf) free (settings->random_entropy.v_buf); - - settings->random_entropy.v_buf = - malloc (option->val.random_entropy.v_buf_size); + settings->random_entropy.v_buf + = malloc (option->val.random_entropy.v_buf_size); if (NULL == settings->random_entropy.v_buf) return MHD_SC_DAEMON_MALLOC_FAILURE; - memcpy (settings->random_entropy.v_buf, option->val.random_entropy.v_buf, option->val.random_entropy.v_buf_size); - settings->random_entropy.v_buf_size = - option->val.random_entropy.v_buf_size; + settings->random_entropy.v_buf_size + = option->val.random_entropy.v_buf_size; } continue; case MHD_D_O_DAUTH_MAP_SIZE: @@ -197,7 +194,6 @@ MHD_daemon_set_options (struct MHD_Daemon *daemon, settings->dauth_def_max_nc = option->val.dauth_def_max_nc; continue; case MHD_D_O_SENTINEL: - default: break; } return MHD_SC_OPTION_UNKNOWN;