CELIX-417: Refactors CMake usage for the RSA bundles
Project: http://git-wip-us.apache.org/repos/asf/celix/repo Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/27a2aa75 Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/27a2aa75 Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/27a2aa75 Branch: refs/heads/develop Commit: 27a2aa756025018dd2406cc5b423d2ff5e38cf87 Parents: 2a670f2 Author: Pepijn Noltes <[email protected]> Authored: Fri Nov 24 11:38:49 2017 +0100 Committer: Pepijn Noltes <[email protected]> Committed: Fri Nov 24 11:38:49 2017 +0100 ---------------------------------------------------------------------- cmake/cmake_celix/BundlePackaging.cmake | 6 +- cmake/cmake_celix/DeployPackaging.cmake | 2 +- dfi/CMakeLists.txt | 41 +- framework/src/bundle_context.c | 2 +- log_service/loghelper_include/log_helper.h | 1 + log_writer/CMakeLists.txt | 2 +- remote_services/CMakeLists.txt | 2 + remote_services/civetweb/CMakeLists.txt | 23 + remote_services/civetweb/include/civetweb.h | 657 ++ remote_services/civetweb/src/civetweb.c | 7907 ++++++++++++++++++ remote_services/civetweb/src/md5.inl | 461 + remote_services/discovery_common/CMakeLists.txt | 18 +- .../discovery_common/include/civetweb.h | 657 -- .../discovery_common/include/discovery.h | 23 +- .../discovery_common/include/discovery_type.h | 27 + .../include/endpoint_discovery_poller.h | 9 +- .../include/endpoint_discovery_server.h | 11 +- remote_services/discovery_common/src/civetweb.c | 7907 ------------------ .../discovery_common/src/discovery.c | 1 - .../src/endpoint_discovery_poller.c | 7 +- .../src/endpoint_discovery_server.c | 20 +- remote_services/discovery_common/src/md5.inl | 461 - .../discovery_configured/CMakeLists.txt | 10 +- .../discovery_configured/src/discovery_impl.c | 4 +- .../discovery_configured/src/discovery_impl.h | 28 +- remote_services/discovery_etcd/CMakeLists.txt | 16 +- .../discovery_etcd/src/discovery_impl.c | 44 +- .../discovery_etcd/src/discovery_impl.h | 16 +- .../discovery_etcd/src/etcd_watcher.h | 1 + remote_services/discovery_shm/CMakeLists.txt | 6 +- .../discovery_shm/src/discovery_impl.c | 42 +- .../discovery_shm/src/discovery_impl.h | 21 +- .../discovery_shm/src/discovery_shmWatcher.c | 19 +- .../discovery_shm/src/discovery_shmWatcher.h | 1 + .../remote_service_admin_common/CMakeLists.txt | 4 +- .../remote_service_admin_dfi/CMakeLists.txt | 32 +- .../remote_service_admin_dfi/rsa/CMakeLists.txt | 34 - .../rsa/src/dfi_utils.c | 98 - .../rsa/src/dfi_utils.h | 30 - .../rsa/src/export_registration_dfi.c | 251 - .../rsa/src/export_registration_dfi.h | 38 - .../rsa/src/import_registration_dfi.c | 402 - .../rsa/src/import_registration_dfi.h | 44 - .../rsa/src/remote_service_admin_activator.c | 124 - .../rsa/src/remote_service_admin_dfi.c | 775 -- .../rsa/src/remote_service_admin_dfi.h | 57 - .../rsa_tst/CMakeLists.txt | 52 - .../rsa_tst/bundle/CMakeLists.txt | 29 - .../rsa_tst/bundle/tst_activator.c | 153 - .../rsa_tst/bundle/tst_service.h | 32 - .../rsa_tst/client.properties.in | 8 - .../rsa_tst/config.properties.in | 20 - .../rsa_tst/rsa_client_server_tests.cpp | 133 - .../rsa_tst/rsa_tests.cpp | 234 - .../rsa_tst/run_tests.cpp | 25 - .../rsa_tst/server.properties.in | 23 - .../remote_service_admin_dfi/src/dfi_utils.c | 108 + .../remote_service_admin_dfi/src/dfi_utils.h | 30 + .../src/export_registration_dfi.c | 251 + .../src/export_registration_dfi.h | 38 + .../src/import_registration_dfi.c | 402 + .../src/import_registration_dfi.h | 44 + .../src/remote_service_admin_activator.c | 124 + .../src/remote_service_admin_dfi.c | 771 ++ .../src/remote_service_admin_dfi.h | 57 + .../test/CMakeLists.txt | 61 + .../test/client.properties.in | 8 + .../test/config.properties.in | 20 + .../test/server.properties.in | 23 + .../test/src/rsa_client_server_tests.cpp | 133 + .../test/src/rsa_tests.cpp | 234 + .../test/src/run_tests.cpp | 25 + .../test/src/tst_activator.c | 162 + .../test/src/tst_service.h | 32 + .../topology_manager/src/topology_manager.h | 1 + .../topology_manager/tms_tst/CMakeLists.txt | 20 +- .../tms_tst/bundle/CMakeLists.txt | 2 +- .../tms_tst/disc_mock/CMakeLists.txt | 8 +- .../tms_tst/disc_mock/disc_mock_activator.c | 1 - 79 files changed, 11847 insertions(+), 11759 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/celix/blob/27a2aa75/cmake/cmake_celix/BundlePackaging.cmake ---------------------------------------------------------------------- diff --git a/cmake/cmake_celix/BundlePackaging.cmake b/cmake/cmake_celix/BundlePackaging.cmake index c5d75d6..205bec1 100644 --- a/cmake/cmake_celix/BundlePackaging.cmake +++ b/cmake/cmake_celix/BundlePackaging.cmake @@ -145,14 +145,14 @@ function(add_bundle) set_library_version(${BUNDLE_TARGET_NAME} ${BUNDLE_VERSION}) set_target_properties(${BUNDLE_TARGET_NAME} PROPERTIES "BUNDLE_TARGET_IS_LIB" TRUE - "BUNDLE_BUILD_BUNDLE_TARGET" "${BUNDLE_TARGET_NAME}_bundle" + "BUNDLE_TARGET" "${BUNDLE_TARGET_NAME}_bundle" ) target_link_libraries(${BUNDLE_TARGET_NAME} PRIVATE Celix::framework) else() add_custom_target(${BUNDLE_TARGET_NAME}) set_target_properties(${BUNDLE_TARGET_NAME} PROPERTIES "BUNDLE_TARGET_IS_LIB" FALSE - "BUNDLE_BUILD_BUNDLE_TARGET" "${BUNDLE_TARGET_NAME}_bundle" + "BUNDLE_TARGET" "${BUNDLE_TARGET_NAME}_bundle" ) endif() add_custom_target(${BUNDLE_TARGET_NAME}_bundle @@ -213,7 +213,7 @@ function(add_bundle) ############################# #alreadyer set # BUNDLE_TARGET_IS_LIB -> true (can be use to test if target is bundle target - # BUNDLE_BUILD_BUNDLE_TARGET -> refers to the _bundle target which is responsible for building the zip file + # BUNDLE_TARGET -> refers to the _bundle target which is responsible for building the zip file #internal use set_target_properties(${BUNDLE_TARGET_NAME} PROPERTIES "BUNDLE_IS_BUNDLE_TARGET" TRUE) #indicate that this is a bundle target set_target_properties(${BUNDLE_TARGET_NAME} PROPERTIES "BUNDLE_DEPEND_TARGETS" "") #bundle target dependencies. Note can be extended after the add_bundle call http://git-wip-us.apache.org/repos/asf/celix/blob/27a2aa75/cmake/cmake_celix/DeployPackaging.cmake ---------------------------------------------------------------------- diff --git a/cmake/cmake_celix/DeployPackaging.cmake b/cmake/cmake_celix/DeployPackaging.cmake index e7f8dc6..dfef9dd 100644 --- a/cmake/cmake_celix/DeployPackaging.cmake +++ b/cmake/cmake_celix/DeployPackaging.cmake @@ -227,7 +227,7 @@ function(celix_container_bundles_dir) COMMENT "Copying bundle '${BUNDLE}' to '${CONTAINER_LOC}/${BD_DIR_NAME}'" DEPENDS $<TARGET_PROPERTY:${BUNDLE},BUNDLE_BUILD_BUNDLE_TARGET> ) - get_target_property(BUILD_BUNDLE_TARGET ${BUNDLE} BUNDLE_BUILD_BUNDLE_TARGET) + get_target_property(BUILD_BUNDLE_TARGET ${BUNDLE} BUNDLE_TARGET) add_dependencies(${CONTAINER_TARGET} ${BUILD_BUNDLE_TARGET}) #ensure the the deploy depends on the _bundle target, custom_command depends on add_library endif() http://git-wip-us.apache.org/repos/asf/celix/blob/27a2aa75/dfi/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/dfi/CMakeLists.txt b/dfi/CMakeLists.txt index ad3a41f..642ac68 100644 --- a/dfi/CMakeLists.txt +++ b/dfi/CMakeLists.txt @@ -18,36 +18,37 @@ find_package(FFI REQUIRED) find_package(Jansson REQUIRED) -add_library(dfi SHARED - src/dyn_common.c - src/dyn_type.c - src/dyn_function.c - src/dyn_interface.c - src/dyn_message.c - src/json_serializer.c - src/json_rpc.c -) -set_target_properties(dfi PROPERTIES OUTPUT_NAME "celix_dfi") - -target_include_directories(dfi PUBLIC - include - ${JANSSON_INCLUDE_DIRS} -) -target_include_directories(dfi PRIVATE - src - ${FFI_INCLUDE_DIRS} +set(SOURCES + src/dyn_common.c + src/dyn_type.c + src/dyn_function.c + src/dyn_interface.c + src/dyn_message.c + src/json_serializer.c + src/json_rpc.c ) +add_library(dfi SHARED ${SOURCES}) +set_target_properties(dfi PROPERTIES OUTPUT_NAME "celix_dfi") +target_include_directories(dfi PUBLIC include ${JANSSON_INCLUDE_DIRS}) +target_include_directories(dfi PRIVATE src ${FFI_INCLUDE_DIRS}) target_link_libraries(dfi PUBLIC ${JANSSON_LIBRARY}) target_link_libraries(dfi PRIVATE Celix::utils ${FFI_LIBRARIES}) - set_target_properties(dfi PROPERTIES "SOVERSION" 1) -install(TARGETS dfi DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT framework) +add_library(dfi_static STATIC ${SOURCES}) +set_target_properties(dfi_static PROPERTIES OUTPUT_NAME "celix_dfi_static") +target_include_directories(dfi_static PUBLIC include ${JANSSON_INCLUDE_DIRS}) +target_include_directories(dfi_static PRIVATE src ${FFI_INCLUDE_DIRS}) +target_link_libraries(dfi_static PUBLIC ${JANSSON_LIBRARY}) +target_link_libraries(dfi_static PRIVATE Celix::utils ${FFI_LIBRARIES}) + +install(TARGETS dfi dfi_static DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT framework) #Alias setup to match external usage add_library(Celix::dfi ALIAS dfi) +add_library(Celix::dfi_static ALIAS dfi_static) if (ENABLE_TESTING) find_package(CppUTest REQUIRED) http://git-wip-us.apache.org/repos/asf/celix/blob/27a2aa75/framework/src/bundle_context.c ---------------------------------------------------------------------- diff --git a/framework/src/bundle_context.c b/framework/src/bundle_context.c index face85d..928a7a4 100644 --- a/framework/src/bundle_context.c +++ b/framework/src/bundle_context.c @@ -222,7 +222,7 @@ celix_status_t bundleContext_ungetServiceReference(bundle_context_pt context, se celix_status_t bundleContext_getService(bundle_context_pt context, service_reference_pt reference, void** service_instance) { celix_status_t status = CELIX_SUCCESS; - if (context != NULL && reference != NULL && *service_instance == NULL) { + if (context != NULL && reference != NULL && service_instance != NULL) { /*NOTE argument service_instance should be considerd a 'const void**'. To ensure backwards compatiblity a cast is made instead. */ http://git-wip-us.apache.org/repos/asf/celix/blob/27a2aa75/log_service/loghelper_include/log_helper.h ---------------------------------------------------------------------- diff --git a/log_service/loghelper_include/log_helper.h b/log_service/loghelper_include/log_helper.h index 04e4bb2..2ae9d83 100644 --- a/log_service/loghelper_include/log_helper.h +++ b/log_service/loghelper_include/log_helper.h @@ -24,6 +24,7 @@ #include "bundle_context.h" #include "log_service.h" +typedef struct log_helper log_helper_t; typedef struct log_helper* log_helper_pt; celix_status_t logHelper_create(bundle_context_pt context, log_helper_pt* log_helper); http://git-wip-us.apache.org/repos/asf/celix/blob/27a2aa75/log_writer/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/log_writer/CMakeLists.txt b/log_writer/CMakeLists.txt index 340af15..e44ef65 100644 --- a/log_writer/CMakeLists.txt +++ b/log_writer/CMakeLists.txt @@ -23,5 +23,5 @@ if (LOG_WRITER) #Setup target aliases to match external usage add_library(Celix::log_writer_stdout ALIAS log_writer_stdout) - add_library(Celix::log_writer_syslog ALIAS log_writer_syslog) + #add_library(Celix::log_writer_syslog ALIAS log_writer_syslog) endif (LOG_WRITER) http://git-wip-us.apache.org/repos/asf/celix/blob/27a2aa75/remote_services/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/remote_services/CMakeLists.txt b/remote_services/CMakeLists.txt index 7ca1c44..4e1f5b3 100644 --- a/remote_services/CMakeLists.txt +++ b/remote_services/CMakeLists.txt @@ -22,6 +22,8 @@ if (REMOTE_SERVICE_ADMIN) add_subdirectory(topology_manager) + add_subdirectory(civetweb) + add_subdirectory(discovery_common) add_subdirectory(discovery_configured) add_subdirectory(discovery_etcd) http://git-wip-us.apache.org/repos/asf/celix/blob/27a2aa75/remote_services/civetweb/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/remote_services/civetweb/CMakeLists.txt b/remote_services/civetweb/CMakeLists.txt new file mode 100644 index 0000000..e9e272e --- /dev/null +++ b/remote_services/civetweb/CMakeLists.txt @@ -0,0 +1,23 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + + +add_library(civetweb OBJECT + src/civetweb.c + src/md5.inl +) +target_include_directories(civetweb PUBLIC include) \ No newline at end of file http://git-wip-us.apache.org/repos/asf/celix/blob/27a2aa75/remote_services/civetweb/include/civetweb.h ---------------------------------------------------------------------- diff --git a/remote_services/civetweb/include/civetweb.h b/remote_services/civetweb/include/civetweb.h new file mode 100644 index 0000000..61a8e98 --- /dev/null +++ b/remote_services/civetweb/include/civetweb.h @@ -0,0 +1,657 @@ +/* Copyright (c) 2013-2014 the Civetweb developers + * Copyright (c) 2004-2013 Sergey Lyubka + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef CIVETWEB_HEADER_INCLUDED +#define CIVETWEB_HEADER_INCLUDED + +#ifndef CIVETWEB_VERSION +#define CIVETWEB_VERSION "1.7" +#endif + +#ifndef CIVETWEB_API + #if defined(_WIN32) + #if defined(CIVETWEB_DLL_EXPORTS) + #define CIVETWEB_API __declspec(dllexport) + #elif defined(CIVETWEB_DLL_IMPORTS) + #define CIVETWEB_API __declspec(dllimport) + #else + #define CIVETWEB_API + #endif + #else + #define CIVETWEB_API + #endif +#endif + +#include <stdio.h> +#include <stddef.h> + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +struct mg_context; /* Handle for the HTTP service itself */ +struct mg_connection; /* Handle for the individual connection */ + + +/* This structure contains information about the HTTP request. */ +struct mg_request_info { + const char *request_method; /* "GET", "POST", etc */ + const char *uri; /* URL-decoded URI */ + const char *http_version; /* E.g. "1.0", "1.1" */ + const char *query_string; /* URL part after '?', not including '?', or + NULL */ + const char *remote_user; /* Authenticated user, or NULL if no auth + used */ + char remote_addr[48]; /* Client's IP address as a string. */ + long remote_ip; /* Client's IP address. Deprecated: use remote_addr instead */ + + long long content_length; /* Length (in bytes) of the request body, + can be -1 if no length was given. */ + int remote_port; /* Client's port */ + int is_ssl; /* 1 if SSL-ed, 0 if not */ + void *user_data; /* User data pointer passed to mg_start() */ + void *conn_data; /* Connection-specific user data */ + + int num_headers; /* Number of HTTP headers */ + struct mg_header { + const char *name; /* HTTP header name */ + const char *value; /* HTTP header value */ + } http_headers[64]; /* Maximum 64 headers */ +}; + + +/* This structure needs to be passed to mg_start(), to let civetweb know + which callbacks to invoke. For a detailed description, see + https://github.com/bel2125/civetweb/blob/master/docs/UserManual.md */ +struct mg_callbacks { + /* Called when civetweb has received new HTTP request. + If the callback returns one, it must process the request + by sending valid HTTP headers and a body. Civetweb will not do + any further processing. Otherwise it must return zero. + Note that since V1.7 the "begin_request" function is called + before an authorization check. If an authorization check is + required, use a request_handler instead. + Return value: + 0: civetweb will process the request itself. In this case, + the callback must not send any data to the client. + 1: callback already processed the request. Civetweb will + not send any data after the callback returned. */ + int (*begin_request)(struct mg_connection *); + + /* Called when civetweb has finished processing request. */ + void (*end_request)(const struct mg_connection *, int reply_status_code); + + /* Called when civetweb is about to log a message. If callback returns + non-zero, civetweb does not log anything. */ + int (*log_message)(const struct mg_connection *, const char *message); + + /* Called when civetweb initializes SSL library. + Parameters: + user_data: parameter user_data passed when starting the server. + Return value: + 0: civetweb will set up the SSL certificate. + 1: civetweb assumes the callback already set up the certificate. + -1: initializing ssl fails. */ + int (*init_ssl)(void *ssl_context, void *user_data); + + /* Called when websocket request is received, before websocket handshake. + Return value: + 0: civetweb proceeds with websocket handshake. + 1: connection is closed immediately. */ + int (*websocket_connect)(const struct mg_connection *); + + /* Called when websocket handshake is successfully completed, and + connection is ready for data exchange. */ + void (*websocket_ready)(struct mg_connection *); + + /* Called when data frame has been received from the client. + Parameters: + bits: first byte of the websocket frame, see websocket RFC at + http://tools.ietf.org/html/rfc6455, section 5.2 + data, data_len: payload, with mask (if any) already applied. + Return value: + 1: keep this websocket connection open. + 0: close this websocket connection. */ + int (*websocket_data)(struct mg_connection *, int bits, + char *data, size_t data_len); + + /* Called when civetweb is closing a connection. The per-context mutex is + locked when this is invoked. This is primarily useful for noting when + a websocket is closing and removing it from any application-maintained + list of clients. */ + void (*connection_close)(struct mg_connection *); + + /* Called when civetweb tries to open a file. Used to intercept file open + calls, and serve file data from memory instead. + Parameters: + path: Full path to the file to open. + data_len: Placeholder for the file size, if file is served from + memory. + Return value: + NULL: do not serve file from memory, proceed with normal file open. + non-NULL: pointer to the file contents in memory. data_len must be + initilized with the size of the memory block. */ + const char * (*open_file)(const struct mg_connection *, + const char *path, size_t *data_len); + + /* Called when civetweb is about to serve Lua server page, if + Lua support is enabled. + Parameters: + lua_context: "lua_State *" pointer. */ + void (*init_lua)(struct mg_connection *, void *lua_context); + + /* Called when civetweb has uploaded a file to a temporary directory as a + result of mg_upload() call. + Parameters: + file_name: full path name to the uploaded file. */ + void (*upload)(struct mg_connection *, const char *file_name); + + /* Called when civetweb is about to send HTTP error to the client. + Implementing this callback allows to create custom error pages. + Parameters: + status: HTTP error status code. + Return value: + 1: run civetweb error handler. + 0: callback already handled the error. */ + int (*http_error)(struct mg_connection *, int status); + + /* Called after civetweb context has been created, before requests + are processed. + Parameters: + ctx: context handle */ + void (*init_context)(struct mg_context * ctx); + + /* Called when civetweb context is deleted. + Parameters: + ctx: context handle */ + void (*exit_context)(struct mg_context * ctx); +}; + + +/* Start web server. + + Parameters: + callbacks: mg_callbacks structure with user-defined callbacks. + options: NULL terminated list of option_name, option_value pairs that + specify Civetweb configuration parameters. + + Side-effects: on UNIX, ignores SIGCHLD and SIGPIPE signals. If custom + processing is required for these, signal handlers must be set up + after calling mg_start(). + + + Example: + const char *options[] = { + "document_root", "/var/www", + "listening_ports", "80,443s", + NULL + }; + struct mg_context *ctx = mg_start(&my_func, NULL, options); + + Refer to https://github.com/bel2125/civetweb/blob/master/docs/UserManual.md + for the list of valid option and their possible values. + + Return: + web server context, or NULL on error. */ +CIVETWEB_API struct mg_context *mg_start(const struct mg_callbacks *callbacks, + void *user_data, + const char **configuration_options); + + +/* Stop the web server. + + Must be called last, when an application wants to stop the web server and + release all associated resources. This function blocks until all Civetweb + threads are stopped. Context pointer becomes invalid. */ +CIVETWEB_API void mg_stop(struct mg_context *); + + +/* mg_request_handler + + Called when a new request comes in. This callback is URI based + and configured with mg_set_request_handler(). + + Parameters: + conn: current connection information. + cbdata: the callback data configured with mg_set_request_handler(). + Returns: + 0: the handler could not handle the request, so fall through. + 1: the handler processed the request. */ +typedef int (* mg_request_handler)(struct mg_connection *conn, void *cbdata); + + +/* mg_set_request_handler + + Sets or removes a URI mapping for a request handler. + + URI's are ordered and prefixed URI's are supported. For example, + consider two URIs: /a/b and /a + /a matches /a + /a/b matches /a/b + /a/c matches /a + + Parameters: + ctx: server context + uri: the URI to configure + handler: the callback handler to use when the URI is requested. + If NULL, the URI will be removed. + cbdata: the callback data to give to the handler when it s requested. */ +CIVETWEB_API void mg_set_request_handler(struct mg_context *ctx, const char *uri, mg_request_handler handler, void *cbdata); + + +/* Get the value of particular configuration parameter. + The value returned is read-only. Civetweb does not allow changing + configuration at run time. + If given parameter name is not valid, NULL is returned. For valid + names, return value is guaranteed to be non-NULL. If parameter is not + set, zero-length string is returned. */ +CIVETWEB_API const char *mg_get_option(const struct mg_context *ctx, const char *name); + + +/* Get context from connection. */ +CIVETWEB_API struct mg_context *mg_get_context(struct mg_connection *conn); + + +/* Get user data passed to mg_start from context. */ +CIVETWEB_API void *mg_get_user_data(struct mg_context *ctx); + + +#if defined(MG_LEGACY_INTERFACE) +/* Return array of strings that represent valid configuration options. + For each option, option name and default value is returned, i.e. the + number of entries in the array equals to number_of_options x 2. + Array is NULL terminated. */ +/* Deprecated: Use mg_get_valid_options instead. */ +CIVETWEB_API const char **mg_get_valid_option_names(void); +#endif + + +struct mg_option { + const char * name; + int type; + const char * default_value; +}; + +enum { + CONFIG_TYPE_UNKNOWN = 0x0, + CONFIG_TYPE_NUMBER = 0x1, + CONFIG_TYPE_STRING = 0x2, + CONFIG_TYPE_FILE = 0x3, + CONFIG_TYPE_DIRECTORY = 0x4, + CONFIG_TYPE_BOOLEAN = 0x5, + CONFIG_TYPE_EXT_PATTERN = 0x6 +}; + + +/* Return array of struct mg_option, representing all valid configuration + options of civetweb.c. + The array is terminated by a NULL name option. */ +CIVETWEB_API const struct mg_option *mg_get_valid_options(void); + + +/* Get the list of ports that civetweb is listening on. + size is the size of the ports int array and ssl int array to fill. + It is the caller's responsibility to make sure ports and ssl each + contain at least size int elements worth of memory to write into. + Return value is the number of ports and ssl information filled in. + The value returned is read-only. Civetweb does not allow changing + configuration at run time. */ +CIVETWEB_API size_t mg_get_ports(const struct mg_context *ctx, size_t size, int* ports, int* ssl); + + +/* Add, edit or delete the entry in the passwords file. + + This function allows an application to manipulate .htpasswd files on the + fly by adding, deleting and changing user records. This is one of the + several ways of implementing authentication on the server side. For another, + cookie-based way please refer to the examples/chat in the source tree. + + If password is not NULL, entry is added (or modified if already exists). + If password is NULL, entry is deleted. + + Return: + 1 on success, 0 on error. */ +CIVETWEB_API int mg_modify_passwords_file(const char *passwords_file_name, + const char *domain, + const char *user, + const char *password); + + +/* Return information associated with the request. */ +CIVETWEB_API struct mg_request_info *mg_get_request_info(struct mg_connection *); + + +/* Send data to the client. + Return: + 0 when the connection has been closed + -1 on error + >0 number of bytes written on success */ +CIVETWEB_API int mg_write(struct mg_connection *, const void *buf, size_t len); + + +/* Send data to a websocket client wrapped in a websocket frame. Uses mg_lock + to ensure that the transmission is not interrupted, i.e., when the + application is proactively communicating and responding to a request + simultaneously. + + Send data to a websocket client wrapped in a websocket frame. + This function is available when civetweb is compiled with -DUSE_WEBSOCKET + + Return: + 0 when the connection has been closed + -1 on error + >0 number of bytes written on success */ +CIVETWEB_API int mg_websocket_write(struct mg_connection* conn, int opcode, + const char *data, size_t data_len); + + +/* Blocks until unique access is obtained to this connection. Intended for use + with websockets only. + Invoke this before mg_write or mg_printf when communicating with a + websocket if your code has server-initiated communication as well as + communication in direct response to a message. */ +CIVETWEB_API void mg_lock_connection(struct mg_connection* conn); +CIVETWEB_API void mg_unlock_connection(struct mg_connection* conn); + +#if defined(MG_LEGACY_INTERFACE) +#define mg_lock mg_lock_connection +#define mg_unlock mg_unlock_connection +#endif + +/* Lock server context. This lock may be used to protect ressources + that are shared between different connection/worker threads. */ +CIVETWEB_API void mg_lock_context(struct mg_context* ctx); +CIVETWEB_API void mg_unlock_context(struct mg_context* ctx); + + +/* Opcodes, from http://tools.ietf.org/html/rfc6455 */ +enum { + WEBSOCKET_OPCODE_CONTINUATION = 0x0, + WEBSOCKET_OPCODE_TEXT = 0x1, + WEBSOCKET_OPCODE_BINARY = 0x2, + WEBSOCKET_OPCODE_CONNECTION_CLOSE = 0x8, + WEBSOCKET_OPCODE_PING = 0x9, + WEBSOCKET_OPCODE_PONG = 0xa +}; + + +/* Macros for enabling compiler-specific checks forprintf-like arguments. */ +#undef PRINTF_FORMAT_STRING +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#include <sal.h> +#if defined(_MSC_VER) && _MSC_VER > 1400 +#define PRINTF_FORMAT_STRING(s) _Printf_format_string_ s +#else +#define PRINTF_FORMAT_STRING(s) __format_string s +#endif +#else +#define PRINTF_FORMAT_STRING(s) s +#endif + +#ifdef __GNUC__ +#define PRINTF_ARGS(x, y) __attribute__((format(printf, x, y))) +#else +#define PRINTF_ARGS(x, y) +#endif + +/* Send data to the client usingprintf() semantics. + Works exactly like mg_write(), but allows to do message formatting. */ +CIVETWEB_API int mg_printf(struct mg_connection *, + PRINTF_FORMAT_STRING(const char *fmt), ...) PRINTF_ARGS(2, 3); + + +/* Send contents of the entire file together with HTTP headers. */ +CIVETWEB_API void mg_send_file(struct mg_connection *conn, const char *path); + + +/* Read data from the remote end, return number of bytes read. + Return: + 0 connection has been closed by peer. No more data could be read. + < 0 read error. No more data could be read from the connection. + > 0 number of bytes read into the buffer. */ +CIVETWEB_API int mg_read(struct mg_connection *, void *buf, size_t len); + + +/* Get the value of particular HTTP header. + + This is a helper function. It traverses request_info->http_headers array, + and if the header is present in the array, returns its value. If it is + not present, NULL is returned. */ +CIVETWEB_API const char *mg_get_header(const struct mg_connection *, const char *name); + + +/* Get a value of particular form variable. + + Parameters: + data: pointer to form-uri-encoded buffer. This could be either POST data, + or request_info.query_string. + data_len: length of the encoded data. + var_name: variable name to decode from the buffer + dst: destination buffer for the decoded variable + dst_len: length of the destination buffer + + Return: + On success, length of the decoded variable. + On error: + -1 (variable not found). + -2 (destination buffer is NULL, zero length or too small to hold the + decoded variable). + + Destination buffer is guaranteed to be '\0' - terminated if it is not + NULL or zero length. */ +CIVETWEB_API int mg_get_var(const char *data, size_t data_len, + const char *var_name, char *dst, size_t dst_len); + + +/* Get a value of particular form variable. + + Parameters: + data: pointer to form-uri-encoded buffer. This could be either POST data, + or request_info.query_string. + data_len: length of the encoded data. + var_name: variable name to decode from the buffer + dst: destination buffer for the decoded variable + dst_len: length of the destination buffer + occurrence: which occurrence of the variable, 0 is the first, 1 the + second... + this makes it possible to parse a query like + b=x&a=y&a=z which will have occurrence values b:0, a:0 and a:1 + + Return: + On success, length of the decoded variable. + On error: + -1 (variable not found). + -2 (destination buffer is NULL, zero length or too small to hold the + decoded variable). + + Destination buffer is guaranteed to be '\0' - terminated if it is not + NULL or zero length. */ +CIVETWEB_API int mg_get_var2(const char *data, size_t data_len, + const char *var_name, char *dst, size_t dst_len, size_t occurrence); + + +/* Fetch value of certain cookie variable into the destination buffer. + + Destination buffer is guaranteed to be '\0' - terminated. In case of + failure, dst[0] == '\0'. Note that RFC allows many occurrences of the same + parameter. This function returns only first occurrence. + + Return: + On success, value length. + On error: + -1 (either "Cookie:" header is not present at all or the requested + parameter is not found). + -2 (destination buffer is NULL, zero length or too small to hold the + value). */ +CIVETWEB_API int mg_get_cookie(const char *cookie, const char *var_name, + char *buf, size_t buf_len); + + +/* Download data from the remote web server. + host: host name to connect to, e.g. "foo.com", or "10.12.40.1". + port: port number, e.g. 80. + use_ssl: wether to use SSL connection. + error_buffer, error_buffer_size: error message placeholder. + request_fmt,...: HTTP request. + Return: + On success, valid pointer to the new connection, suitable for mg_read(). + On error, NULL. error_buffer contains error message. + Example: + char ebuf[100]; + struct mg_connection *conn; + conn = mg_download("google.com", 80, 0, ebuf, sizeof(ebuf), + "%s", "GET / HTTP/1.0\r\nHost: google.com\r\n\r\n"); + */ +CIVETWEB_API struct mg_connection *mg_download(const char *host, int port, int use_ssl, + char *error_buffer, size_t error_buffer_size, + PRINTF_FORMAT_STRING(const char *request_fmt), + ...) PRINTF_ARGS(6, 7); + + +/* Close the connection opened by mg_download(). */ +CIVETWEB_API void mg_close_connection(struct mg_connection *conn); + + +/* File upload functionality. Each uploaded file gets saved into a temporary + file and MG_UPLOAD event is sent. + Return number of uploaded files. */ +CIVETWEB_API int mg_upload(struct mg_connection *conn, const char *destination_dir); + + +/* Convenience function -- create detached thread. + Return: 0 on success, non-0 on error. */ +typedef void * (*mg_thread_func_t)(void *); +CIVETWEB_API int mg_start_thread(mg_thread_func_t f, void *p); + + +/* Return builtin mime type for the given file name. + For unrecognized extensions, "text/plain" is returned. */ +CIVETWEB_API const char *mg_get_builtin_mime_type(const char *file_name); + + +/* Return Civetweb version. */ +CIVETWEB_API const char *mg_version(void); + + +/* URL-decode input buffer into destination buffer. + 0-terminate the destination buffer. + form-url-encoded data differs from URI encoding in a way that it + uses '+' as character for space, see RFC 1866 section 8.2.1 + http://ftp.ics.uci.edu/pub/ietf/html/rfc1866.txt + Return: length of the decoded data, or -1 if dst buffer is too small. */ +CIVETWEB_API int mg_url_decode(const char *src, int src_len, char *dst, + int dst_len, int is_form_url_encoded); + + +/* URL-encode input buffer into destination buffer. + returns the length of the resulting buffer or -1 + is the buffer is too small. */ +CIVETWEB_API int mg_url_encode(const char *src, char *dst, size_t dst_len); + + +/* MD5 hash given strings. + Buffer 'buf' must be 33 bytes long. Varargs is a NULL terminated list of + ASCIIz strings. When function returns, buf will contain human-readable + MD5 hash. Example: + char buf[33]; + mg_md5(buf, "aa", "bb", NULL); */ +CIVETWEB_API char *mg_md5(char buf[33], ...); + + +/* Print error message to the opened error log stream. + This utilizes the provided logging configuration. + conn: connection + fmt: format string without the line return + ...: variable argument list + Example: + mg_cry(conn,"i like %s", "logging"); */ +CIVETWEB_API void mg_cry(struct mg_connection *conn, + PRINTF_FORMAT_STRING(const char *fmt), ...) PRINTF_ARGS(2, 3); + + +/* utility method to compare two buffers, case incensitive. */ +CIVETWEB_API int mg_strncasecmp(const char *s1, const char *s2, size_t len); + +/* Connect to a websocket as a client + Parameters: + host: host to connect to, i.e. "echo.websocket.org" or "192.168.1.1" or "localhost" + port: server port + use_ssl: make a secure connection to server + error_buffer, error_buffer_size: buffer for an error message + path: server path you are trying to connect to, i.e. if connection to localhost/app, path should be "/app" + origin: value of the Origin HTTP header + data_func: callback that should be used when data is received from the server + user_data: user supplied argument + + Return: + On success, valid mg_connection object. + On error, NULL. Se error_buffer for details. +*/ + +typedef int (*websocket_data_func)(struct mg_connection *, int bits, + char *data, size_t data_len); + +typedef void (*websocket_close_func)(struct mg_connection *); + +CIVETWEB_API struct mg_connection *mg_connect_websocket_client(const char *host, int port, int use_ssl, + char *error_buffer, size_t error_buffer_size, + const char *path, const char *origin, + websocket_data_func data_func, websocket_close_func close_func, + void * user_data); + +/* Connect to a TCP server as a client (can be used to connect to a HTTP server) + Parameters: + host: host to connect to, i.e. "www.wikipedia.org" or "192.168.1.1" or "localhost" + port: server port + use_ssl: make a secure connection to server + error_buffer, error_buffer_size: buffer for an error message + + Return: + On success, valid mg_connection object. + On error, NULL. Se error_buffer for details. +*/ +CIVETWEB_API struct mg_connection *mg_connect_client(const char *host, int port, int use_ssl, + char *error_buffer, size_t error_buffer_size); + + +enum { + TIMEOUT_INFINITE = -1 +}; + +/* Wait for a response from the server + Parameters: + conn: connection + ebuf, ebuf_len: error message placeholder. + timeout: time to wait for a response in milliseconds (if < 0 then wait forever) + + Return: + On success, >= 0 + On error/timeout, < 0 +*/ +CIVETWEB_API int mg_get_response(struct mg_connection *conn, char *ebuf, size_t ebuf_len, int timeout); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* CIVETWEB_HEADER_INCLUDED */
