mirror of
				https://github.com/espressif/esp-protocols.git
				synced 2025-11-04 00:21:37 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			244 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			244 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * SPDX-FileCopyrightText: 2024 Roger Light <roger@atchoo.org>
 | 
						|
 *
 | 
						|
 * 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;
 | 
						|
}
 |