/
niceSOFT
/
systemd
Обзор
Документация
Войти
/
niceSOFT
/
systemd
Код
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
v261
src/shared/microhttpd-util.h
152 строки
6 KB
Luca Boccassi
shared: add DLOPEN_* wrapper macros that stamp .note.dlopen on callers
01 июн 2026, 20:24
01 июн 2026, 20:24
590e226
Код
Авторство
О чём код?
/* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once #include "sd-dlopen.h" #include "shared-forward.h" int dlopen_microhttpd(int log_level); #if HAVE_MICROHTTPD #define MICROHTTPD_NOTE(priority) \ SD_ELF_NOTE_DLOPEN("microhttpd", \ "Support for embedded HTTP server via libmicrohttpd", \ priority, \ "libmicrohttpd.so.12") #define DLOPEN_MICROHTTPD(log_level, priority) \ ({ \ MICROHTTPD_NOTE(priority); \ dlopen_microhttpd(log_level); \ }) #include <microhttpd.h> #include "dlfcn-util.h" /* Those defines are added when options are renamed. If the old names * are not '#define'd, then they are not deprecated yet and there are * enum elements with the same name. Hence let's check for the *old* name, * and define the new name by the value of the old name. */ /* Renamed in μhttpd 0.9.51 */ #ifndef MHD_USE_PIPE_FOR_SHUTDOWN # define MHD_USE_ITC MHD_USE_PIPE_FOR_SHUTDOWN #endif /* Renamed in μhttpd 0.9.52 */ #ifndef MHD_USE_EPOLL_LINUX_ONLY # define MHD_USE_EPOLL MHD_USE_EPOLL_LINUX_ONLY #endif /* Renamed in μhttpd 0.9.52 */ #ifndef MHD_USE_SSL # define MHD_USE_TLS MHD_USE_SSL #endif /* Renamed in μhttpd 0.9.53 */ #ifndef MHD_USE_POLL_INTERNALLY # define MHD_USE_POLL_INTERNAL_THREAD MHD_USE_POLL_INTERNALLY #endif /* Both the old and new names are defines, check for the new one. */ /* Compatibility with libmicrohttpd < 0.9.38 */ #ifndef MHD_HTTP_NOT_ACCEPTABLE # define MHD_HTTP_NOT_ACCEPTABLE MHD_HTTP_METHOD_NOT_ACCEPTABLE #endif /* Renamed in μhttpd 0.9.74 (8c644fc1f4d498ea489add8d40a68f5d3e5899fa) */ #ifndef MHD_HTTP_CONTENT_TOO_LARGE # ifdef MHD_HTTP_PAYLOAD_TOO_LARGE # define MHD_HTTP_CONTENT_TOO_LARGE MHD_HTTP_PAYLOAD_TOO_LARGE /* 0.9.53 or newer */ # else # define MHD_HTTP_CONTENT_TOO_LARGE MHD_HTTP_REQUEST_ENTITY_TOO_LARGE # endif #endif #if MHD_VERSION < 0x00094203 # define MHD_create_response_from_fd_at_offset64 MHD_create_response_from_fd_at_offset #endif #if MHD_VERSION >= 0x00097002 # define mhd_result enum MHD_Result #else # define mhd_result int #endif extern DLSYM_PROTOTYPE(MHD_add_response_header); extern DLSYM_PROTOTYPE(MHD_create_response_from_buffer); extern DLSYM_PROTOTYPE(MHD_create_response_from_callback); #if MHD_VERSION < 0x00094203 extern DLSYM_PROTOTYPE(MHD_create_response_from_fd_at_offset); # define sym_MHD_create_response_from_fd_at_offset64 sym_MHD_create_response_from_fd_at_offset #else extern DLSYM_PROTOTYPE(MHD_create_response_from_fd_at_offset64); #endif extern DLSYM_PROTOTYPE(MHD_destroy_response); extern DLSYM_PROTOTYPE(MHD_get_connection_info); extern DLSYM_PROTOTYPE(MHD_get_connection_values); extern DLSYM_PROTOTYPE(MHD_get_daemon_info); extern DLSYM_PROTOTYPE(MHD_get_timeout); extern DLSYM_PROTOTYPE(MHD_lookup_connection_value); extern DLSYM_PROTOTYPE(MHD_queue_response); extern DLSYM_PROTOTYPE(MHD_run); extern DLSYM_PROTOTYPE(MHD_start_daemon); extern DLSYM_PROTOTYPE(MHD_stop_daemon); void microhttpd_logger(void *arg, const char *fmt, va_list ap) _printf_(2, 0); /* respond_oom() must be usable with return, hence this form. */ #define respond_oom(connection) log_oom(), mhd_respond_oom(connection) int mhd_respond_internal( struct MHD_Connection *connection, enum MHD_RequestTerminationCode code, const char *encoding, const char *buffer, size_t size, enum MHD_ResponseMemoryMode mode); #define mhd_respond_with_encoding(connection, code, encoding, message) \ mhd_respond_internal( \ (connection), (code), (encoding), \ message "\n", \ strlen(message) + 1, \ MHD_RESPMEM_PERSISTENT) #define mhd_respond(connection, code, message) \ mhd_respond_with_encoding(connection, code, NULL, message) \ int mhd_respond_oom(struct MHD_Connection *connection); int mhd_respondf_internal( struct MHD_Connection *connection, int error, enum MHD_RequestTerminationCode code, const char *encoding, const char *format, ...) _printf_(5,6); #define mhd_respondf(connection, error, code, format, ...) \ mhd_respondf_internal( \ connection, error, code, NULL, \ format "\n", \ ##__VA_ARGS__) int check_permissions(struct MHD_Connection *connection, int *code, char **hostname); /* Set gnutls internal logging function to a callback which uses our * own logging framework. * * gnutls categories are additionally filtered by our internal log * level, so it should be set fairly high to capture all potentially * interesting events without overwhelming detail. */ int setup_gnutls_logger(char **categories); DEFINE_TRIVIAL_CLEANUP_FUNC_FULL_RENAME(struct MHD_Daemon*, sym_MHD_stop_daemon, MHD_stop_daemonp, NULL); DEFINE_TRIVIAL_CLEANUP_FUNC_FULL_RENAME(struct MHD_Response*, sym_MHD_destroy_response, MHD_destroy_responsep, NULL); #else #define DLOPEN_MICROHTTPD(log_level, priority) dlopen_microhttpd(log_level) #endif