From 6d9b4efb7e0a200fc3d1e53608fc8f78c64cd558 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 6 Sep 2025 07:41:43 -0400 Subject: [PATCH] v0.2.12 - Command line variables added --- .gitignore | 3 +++ db/c_nostr_relay.db-shm | Bin 32768 -> 32768 bytes db/c_nostr_relay.db-wal | Bin 2282512 -> 2228952 bytes make_and_restart_relay.sh | 26 +++++++++++++------ relay.pid | 2 +- src/config.c | 51 ++++++++++++++++++++++++++++++-------- src/config.h | 2 ++ src/main.c | 35 ++++++++++++++++++++++++-- 8 files changed, 98 insertions(+), 21 deletions(-) diff --git a/.gitignore b/.gitignore index 19c1f3a..6c452ba 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,8 @@ nostr_core_lib/ nips/ build/ relay.log +relay.pid Trash/ src/version.h +dev-config/ +db/ diff --git a/db/c_nostr_relay.db-shm b/db/c_nostr_relay.db-shm index adddebb9c37bb3f17366c41d7b2f9120e8209bec..5a667790c9947c74afed93531d061f0bd6059b2f 100644 GIT binary patch delta 173 zcmZo@U}|V!N|1P@%K!pXftZnjK|q#?fk6|nY3P9E+#?8AjrZG-7 X3f~7*w`%i_Y$XAp@E;~dZLkgi=)^gN delta 262 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 P!Kr$auLZ2)S0eWRd|iaT diff --git a/make_and_restart_relay.sh b/make_and_restart_relay.sh index 3a10fb5..c1ebc99 100755 --- a/make_and_restart_relay.sh +++ b/make_and_restart_relay.sh @@ -35,20 +35,29 @@ if [ "$HELP" = true ]; then echo " --preserve-config, -p Keep existing configuration file (don't regenerate)" echo " --help, -h Show this help message" echo "" + echo "Development Setup:" + echo " Uses local config directory: ./dev-config/" + echo " This avoids conflicts with production instances using ~/.config/c-relay/" + echo "" echo "Default behavior: Automatically regenerates configuration file on each build" echo " for development purposes" exit 0 fi # Handle configuration file and database regeneration -CONFIG_FILE="$HOME/.config/c-relay/c_relay_config_event.json" +# Use local development config directory to avoid conflicts with production +DEV_CONFIG_DIR="./dev-config" +CONFIG_FILE="$DEV_CONFIG_DIR/c_relay_config_event.json" DB_FILE="./db/c_nostr_relay.db" +# Create development config directory if it doesn't exist +mkdir -p "$DEV_CONFIG_DIR" + if [ "$PRESERVE_CONFIG" = false ]; then if [ -f "$CONFIG_FILE" ]; then - echo "Removing old configuration file to trigger regeneration..." + echo "Removing old development configuration file to trigger regeneration..." rm -f "$CONFIG_FILE" - echo "✓ Configuration file removed - will be regenerated with new keys" + echo "✓ Development configuration file removed - will be regenerated with new keys" fi if [ -f "$DB_FILE" ]; then echo "Removing old database to trigger fresh key generation..." @@ -56,9 +65,9 @@ if [ "$PRESERVE_CONFIG" = false ]; then echo "✓ Database removed - will be recreated with embedded schema and new keys" fi elif [ "$PRESERVE_CONFIG" = true ]; then - echo "Preserving existing configuration and database as requested" + echo "Preserving existing development configuration and database as requested" else - echo "No existing configuration or database found - will generate fresh setup" + echo "No existing development configuration or database found - will generate fresh setup" fi # Build the project first @@ -124,8 +133,8 @@ echo "Database will be initialized automatically on startup if needed" echo "Starting relay server..." echo "Debug: Current processes: $(ps aux | grep 'c_relay_' | grep -v grep || echo 'None')" -# Start relay in background and capture its PID -$BINARY_PATH > relay.log 2>&1 & +# Start relay in background and capture its PID with development config directory +$BINARY_PATH --config-dir "$DEV_CONFIG_DIR" > relay.log 2>&1 & RELAY_PID=$! echo "Started with PID: $RELAY_PID" @@ -158,10 +167,11 @@ if ps -p "$RELAY_PID" >/dev/null 2>&1; then fi echo "=== Relay server running in background ===" + echo "Development config: $DEV_CONFIG_DIR/" echo "To kill relay: pkill -f 'c_relay_'" echo "To check status: ps aux | grep c_relay_" echo "To view logs: tail -f relay.log" - echo "Binary: $BINARY_PATH" + echo "Binary: $BINARY_PATH --config-dir $DEV_CONFIG_DIR" echo "Ready for Nostr client connections!" else echo "ERROR: Relay failed to start" diff --git a/relay.pid b/relay.pid index 5607a92..ad7027f 100644 --- a/relay.pid +++ b/relay.pid @@ -1 +1 @@ -905395 +913504 diff --git a/src/config.c b/src/config.c index 254a05e..18b59c6 100644 --- a/src/config.c +++ b/src/config.c @@ -34,16 +34,38 @@ int init_configuration_system(void) { memset(&g_config_manager, 0, sizeof(config_manager_t)); g_config_manager.db = g_db; - // Get XDG configuration directory - if (get_xdg_config_dir(g_config_manager.config_dir_path, sizeof(g_config_manager.config_dir_path)) != 0) { - log_error("Failed to determine XDG configuration directory"); - return -1; + // Check for command line config file override first + const char* config_file_override = getenv(CONFIG_FILE_OVERRIDE_ENV); + if (config_file_override && strlen(config_file_override) > 0) { + // Use specific config file override + strncpy(g_config_manager.config_file_path, config_file_override, + sizeof(g_config_manager.config_file_path) - 1); + g_config_manager.config_file_path[sizeof(g_config_manager.config_file_path) - 1] = '\0'; + + // Extract directory from file path for config_dir_path + char* last_slash = strrchr(g_config_manager.config_file_path, '/'); + if (last_slash) { + size_t dir_len = last_slash - g_config_manager.config_file_path; + strncpy(g_config_manager.config_dir_path, g_config_manager.config_file_path, dir_len); + g_config_manager.config_dir_path[dir_len] = '\0'; + } else { + // File in current directory + strcpy(g_config_manager.config_dir_path, "."); + } + + log_info("Using configuration file from command line override"); + } else { + // Get XDG configuration directory (with --config-dir override support) + if (get_xdg_config_dir(g_config_manager.config_dir_path, sizeof(g_config_manager.config_dir_path)) != 0) { + log_error("Failed to determine configuration directory"); + return -1; + } + + // Build configuration file path + snprintf(g_config_manager.config_file_path, sizeof(g_config_manager.config_file_path), + "%s/%s", g_config_manager.config_dir_path, CONFIG_FILE_NAME); } - // Build configuration file path - snprintf(g_config_manager.config_file_path, sizeof(g_config_manager.config_file_path), - "%s/%s", g_config_manager.config_dir_path, CONFIG_FILE_NAME); - log_info("Configuration directory: %s"); printf(" %s\n", g_config_manager.config_dir_path); log_info("Configuration file: %s"); @@ -273,13 +295,22 @@ int load_config_from_database(void) { // ================================ int get_xdg_config_dir(char* path, size_t path_size) { - const char* xdg_config_home = getenv("XDG_CONFIG_HOME"); + // Priority 1: Command line --config-dir override + const char* config_dir_override = getenv(CONFIG_DIR_OVERRIDE_ENV); + if (config_dir_override && strlen(config_dir_override) > 0) { + strncpy(path, config_dir_override, path_size - 1); + path[path_size - 1] = '\0'; + log_info("Using config directory from command line override"); + return 0; + } + // Priority 2: XDG_CONFIG_HOME environment variable + const char* xdg_config_home = getenv("XDG_CONFIG_HOME"); if (xdg_config_home && strlen(xdg_config_home) > 0) { // Use XDG_CONFIG_HOME if set snprintf(path, path_size, "%s/%s", xdg_config_home, CONFIG_XDG_DIR_NAME); } else { - // Fall back to ~/.config + // Priority 3: Fall back to ~/.config const char* home = getenv("HOME"); if (!home) { log_error("Neither XDG_CONFIG_HOME nor HOME environment variable is set"); diff --git a/src/config.h b/src/config.h index bb80c48..90b3f74 100644 --- a/src/config.h +++ b/src/config.h @@ -14,6 +14,8 @@ #define CONFIG_FILE_NAME "c_relay_config_event.json" #define CONFIG_ADMIN_PRIVKEY_ENV "C_RELAY_ADMIN_PRIVKEY" #define CONFIG_RELAY_PRIVKEY_ENV "C_RELAY_PRIVKEY" +#define CONFIG_DIR_OVERRIDE_ENV "C_RELAY_CONFIG_DIR_OVERRIDE" +#define CONFIG_FILE_OVERRIDE_ENV "C_RELAY_CONFIG_FILE_OVERRIDE" #define NOSTR_PUBKEY_HEX_LENGTH 64 #define NOSTR_PRIVKEY_HEX_LENGTH 64 #define NOSTR_EVENT_ID_HEX_LENGTH 64 diff --git a/src/main.c b/src/main.c index c834f66..01965c8 100644 --- a/src/main.c +++ b/src/main.c @@ -3012,13 +3012,22 @@ void print_usage(const char* program_name) { printf("C Nostr Relay Server\n"); printf("\n"); printf("Options:\n"); - printf(" -p, --port PORT Listen port (default: %d)\n", DEFAULT_PORT); - printf(" -h, --help Show this help message\n"); + printf(" -p, --port PORT Listen port (default: %d)\n", DEFAULT_PORT); + printf(" -c, --config FILE Configuration file path\n"); + printf(" -d, --config-dir DIR Configuration directory path\n"); + printf(" -h, --help Show this help message\n"); + printf("\n"); + printf("Examples:\n"); + printf(" %s --config /path/to/config.json\n", program_name); + printf(" %s --config-dir ~/.config/c-relay-dev\n", program_name); + printf(" %s --port 9999 --config-dir /etc/c-relay\n", program_name); printf("\n"); } int main(int argc, char* argv[]) { int port = DEFAULT_PORT; + char* config_dir_override = NULL; + char* config_file_override = NULL; // Parse command line arguments for (int i = 1; i < argc; i++) { @@ -3042,6 +3051,20 @@ int main(int argc, char* argv[]) { log_error("Port argument requires a value"); return 1; } + } else if (strcmp(argv[i], "-c") == 0 || strcmp(argv[i], "--config") == 0) { + if (i + 1 < argc) { + config_file_override = argv[++i]; + } else { + log_error("Config file argument requires a value"); + return 1; + } + } else if (strcmp(argv[i], "-d") == 0 || strcmp(argv[i], "--config-dir") == 0) { + if (i + 1 < argc) { + config_dir_override = argv[++i]; + } else { + log_error("Config directory argument requires a value"); + return 1; + } } else { log_error("Unknown argument"); print_usage(argv[0]); @@ -3049,6 +3072,14 @@ int main(int argc, char* argv[]) { } } + // Store config overrides in global variables for configuration system access + if (config_dir_override) { + setenv("C_RELAY_CONFIG_DIR_OVERRIDE", config_dir_override, 1); + } + if (config_file_override) { + setenv("C_RELAY_CONFIG_FILE_OVERRIDE", config_file_override, 1); + } + // Set up signal handlers signal(SIGINT, signal_handler); signal(SIGTERM, signal_handler);