/* * SPDX-FileCopyrightText: 2024 Roger Light * * SPDX-License-Identifier: EPL-2.0 * * SPDX-FileContributor: 2024 Espressif Systems (Shanghai) CO LTD */ #include "mosquitto_internal.h" #include "mosquitto_broker.h" #include "memory_mosq.h" #include "mqtt_protocol.h" #include "send_mosq.h" #include "util_mosq.h" #include "utlist.h" #include "lib_load.h" #include "syslog.h" void config__init(struct mosquitto__config *config) { memset(config, 0, sizeof(struct mosquitto__config)); for (int i = 0; i < config->listener_count; i++) { mosquitto__free(config->listeners[i].security_options.acl_file); config->listeners[i].security_options.acl_file = NULL; mosquitto__free(config->listeners[i].security_options.password_file); config->listeners[i].security_options.password_file = NULL; mosquitto__free(config->listeners[i].security_options.psk_file); config->listeners[i].security_options.psk_file = NULL; config->listeners[i].security_options.allow_anonymous = -1; config->listeners[i].security_options.allow_zero_length_clientid = true; config->listeners[i].security_options.auto_id_prefix = NULL; config->listeners[i].security_options.auto_id_prefix_len = 0; } config->local_only = true; config->allow_duplicate_messages = false; mosquitto__free(config->security_options.acl_file); config->security_options.acl_file = NULL; config->security_options.allow_anonymous = -1; config->security_options.allow_zero_length_clientid = true; config->security_options.auto_id_prefix = NULL; config->security_options.auto_id_prefix_len = 0; mosquitto__free(config->security_options.password_file); config->security_options.password_file = NULL; mosquitto__free(config->security_options.psk_file); config->security_options.psk_file = NULL; config->autosave_interval = 1800; config->autosave_on_changes = false; mosquitto__free(config->clientid_prefixes); config->connection_messages = true; config->clientid_prefixes = NULL; config->per_listener_settings = false; if (config->log_fptr) { fclose(config->log_fptr); config->log_fptr = NULL; } mosquitto__free(config->log_file); config->log_file = NULL; config->log_facility = LOG_DAEMON; config->log_dest = MQTT3_LOG_STDERR | MQTT3_LOG_DLT; if (db.verbose) { config->log_type = UINT_MAX; } else { config->log_type = MOSQ_LOG_ERR | MOSQ_LOG_WARNING | MOSQ_LOG_NOTICE | MOSQ_LOG_INFO; } config->log_timestamp = true; mosquitto__free(config->log_timestamp_format); config->log_timestamp_format = NULL; config->max_keepalive = 0; config->max_packet_size = 0; config->max_inflight_messages = 20; config->max_queued_messages = 1000; config->max_inflight_bytes = 0; config->max_queued_bytes = 0; config->persistence = false; mosquitto__free(config->persistence_location); config->persistence_location = NULL; mosquitto__free(config->persistence_file); config->persistence_file = NULL; config->persistent_client_expiration = 0; config->queue_qos0_messages = false; config->retain_available = true; config->set_tcp_nodelay = false; config->sys_interval = 10; config->upgrade_outgoing_qos = false; config->daemon = false; memset(&config->default_listener, 0, sizeof(struct mosquitto__listener)); listener__set_defaults(&config->default_listener); } int config__read(struct mosquitto__config *config, bool reload) { return MOSQ_ERR_SUCCESS; } void config__cleanup(struct mosquitto__config *config) { int i; #ifdef WITH_BRIDGE int j; #endif mosquitto__free(config->clientid_prefixes); mosquitto__free(config->persistence_location); mosquitto__free(config->persistence_file); mosquitto__free(config->persistence_filepath); mosquitto__free(config->security_options.auto_id_prefix); mosquitto__free(config->security_options.acl_file); mosquitto__free(config->security_options.password_file); mosquitto__free(config->security_options.psk_file); mosquitto__free(config->pid_file); mosquitto__free(config->user); mosquitto__free(config->log_timestamp_format); if (config->listeners) { for (i = 0; i < config->listener_count; i++) { mosquitto__free(config->listeners[i].host); mosquitto__free(config->listeners[i].bind_interface); mosquitto__free(config->listeners[i].mount_point); mosquitto__free(config->listeners[i].socks); mosquitto__free(config->listeners[i].security_options.auto_id_prefix); mosquitto__free(config->listeners[i].security_options.acl_file); mosquitto__free(config->listeners[i].security_options.password_file); mosquitto__free(config->listeners[i].security_options.psk_file); #ifdef WITH_TLS mosquitto__free(config->listeners[i].cafile); mosquitto__free(config->listeners[i].capath); mosquitto__free(config->listeners[i].certfile); mosquitto__free(config->listeners[i].keyfile); mosquitto__free(config->listeners[i].ciphers); mosquitto__free(config->listeners[i].ciphers_tls13); mosquitto__free(config->listeners[i].psk_hint); mosquitto__free(config->listeners[i].crlfile); mosquitto__free(config->listeners[i].dhparamfile); mosquitto__free(config->listeners[i].tls_version); mosquitto__free(config->listeners[i].tls_engine); mosquitto__free(config->listeners[i].tls_engine_kpass_sha1); #ifdef WITH_WEBSOCKETS if (!config->listeners[i].ws_context) /* libwebsockets frees its own SSL_CTX */ #endif { SSL_CTX_free(config->listeners[i].ssl_ctx); } #endif #ifdef WITH_WEBSOCKETS mosquitto__free(config->listeners[i].http_dir); #endif } mosquitto__free(config->listeners); } #ifdef WITH_BRIDGE if (config->bridges) { for (i = 0; i < config->bridge_count; i++) { mosquitto__free(config->bridges[i].name); if (config->bridges[i].addresses) { for (j = 0; j < config->bridges[i].address_count; j++) { mosquitto__free(config->bridges[i].addresses[j].address); } mosquitto__free(config->bridges[i].addresses); } mosquitto__free(config->bridges[i].remote_clientid); mosquitto__free(config->bridges[i].remote_username); mosquitto__free(config->bridges[i].remote_password); mosquitto__free(config->bridges[i].local_clientid); mosquitto__free(config->bridges[i].local_username); mosquitto__free(config->bridges[i].local_password); if (config->bridges[i].topics) { for (j = 0; j < config->bridges[i].topic_count; j++) { mosquitto__free(config->bridges[i].topics[j].topic); mosquitto__free(config->bridges[i].topics[j].local_prefix); mosquitto__free(config->bridges[i].topics[j].remote_prefix); mosquitto__free(config->bridges[i].topics[j].local_topic); mosquitto__free(config->bridges[i].topics[j].remote_topic); } mosquitto__free(config->bridges[i].topics); } mosquitto__free(config->bridges[i].notification_topic); #ifdef WITH_TLS mosquitto__free(config->bridges[i].tls_version); mosquitto__free(config->bridges[i].tls_cafile); mosquitto__free(config->bridges[i].tls_alpn); #ifdef FINAL_WITH_TLS_PSK mosquitto__free(config->bridges[i].tls_psk_identity); mosquitto__free(config->bridges[i].tls_psk); #endif #endif } mosquitto__free(config->bridges); } #endif if (config->log_fptr) { fclose(config->log_fptr); config->log_fptr = NULL; } if (config->log_file) { mosquitto__free(config->log_file); config->log_file = NULL; } } const char *mosquitto_client_username(const struct mosquitto *client) { return client->id; } char *misc__trimblanks(char *str) { char *endptr; if (str == NULL) { return NULL; } while (isspace((int)str[0])) { str++; } endptr = &str[strlen(str) - 1]; while (endptr > str && isspace((int)endptr[0])) { endptr[0] = '\0'; endptr--; } return str; } // Dummy definition of fork() to work around IDF warning: " warning: _fork is not implemented and will always fail" // fork() is used in mosquitto.c to deamonize the broker, which we do not call. pid_t fork (void) { abort(); return 0; }