diff options
-rw-r--r-- | doc/openocd.texi | 9 | ||||
-rw-r--r-- | src/helper/Makefile.am | 1 | ||||
-rw-r--r-- | src/helper/configuration.c | 94 | ||||
-rw-r--r-- | src/helper/configuration.h | 2 | ||||
-rw-r--r-- | src/helper/interpreter.c | 4 | ||||
-rw-r--r-- | src/server/gdb_server.c | 3 | ||||
-rw-r--r-- | src/target/target.c | 2 |
7 files changed, 96 insertions, 19 deletions
diff --git a/doc/openocd.texi b/doc/openocd.texi index 9e310f3..d19a09e 100644 --- a/doc/openocd.texi +++ b/doc/openocd.texi @@ -159,6 +159,10 @@ locations, i.e. /usr/include, /usr/lib. @node Running @chapter Running @cindex running openocd +@cindex --configfile +@cindex --debug_level +@cindex --logfile +@cindex --search The OpenOCD runs as a daemon, waiting for connections from clients (Telnet or GDB). Run with @option{--help} or @option{-h} to view the available command line arguments. @@ -172,7 +176,10 @@ the most information, including debug messages. The default setting is "2", outp only informational messages, warnings and errors. You can also change this setting from within a telnet or gdb session (@option{debug_level <n>}). -You can redirect all output from the daemon to a file using the @option{-l <logfile>} switch. +You can redirect all output from the daemon to a file using the @option{-l <logfile>} switch. + +Search paths for config/script files can be added to openocd by using +the @option{-s <search>} switch. @node Configuration @chapter Configuration diff --git a/src/helper/Makefile.am b/src/helper/Makefile.am index 2214146..1e82261 100644 --- a/src/helper/Makefile.am +++ b/src/helper/Makefile.am @@ -1,5 +1,6 @@ INCLUDES = $(all_includes) METASOURCES = AUTO +AM_CPPFLAGS = -DPKGDATADIR=\"$(pkgdatadir)\" @CPPFLAGS@ noinst_LIBRARIES = libhelper.a libhelper_a_SOURCES = binarybuffer.c configuration.c log.c interpreter.c command.c time_support.c \ replacements.c fileio.c diff --git a/src/helper/configuration.c b/src/helper/configuration.c index d48977c..2cb0833 100644 --- a/src/helper/configuration.c +++ b/src/helper/configuration.c @@ -29,8 +29,13 @@ #include <stdio.h> #include <stdlib.h> #include <getopt.h> +#include <string.h> -char* config_file_name; +static size_t num_config_files; +static char** config_file_names; + +static size_t num_script_dirs; +static char** script_search_dirs; static int help_flag; @@ -40,6 +45,7 @@ static struct option long_options[] = {"debug", optional_argument, 0, 'd'}, {"file", required_argument, 0, 'f'}, + {"search", required_argument, 0, 's'}, {"log_output", required_argument, 0, 'l'}, {0, 0, 0, 0} @@ -52,17 +58,38 @@ int configuration_output_handler(struct command_context_s *context, char* line) return ERROR_OK; } +void add_script_search_dir (const char *dir) +{ + num_script_dirs++; + script_search_dirs = (char **)realloc(script_search_dirs, (num_script_dirs+1) * sizeof (char *)); + + script_search_dirs[num_script_dirs-1] = strdup(dir); + script_search_dirs[num_script_dirs] = NULL; +} + +void add_config_file_name (const char *cfg) +{ + num_config_files++; + config_file_names = (char **)realloc(config_file_names, (num_config_files+1) * sizeof (char *)); + + config_file_names[num_config_files-1] = strdup(cfg); + config_file_names[num_config_files] = NULL; +} + int parse_cmdline_args(struct command_context_s *cmd_ctx, int argc, char *argv[]) { int c; char command_buffer[128]; - + + /* Always search relative to current working dir first. */ + add_script_search_dir("."); + while (1) { /* getopt_long stores the option index here. */ int option_index = 0; - c = getopt_long(argc, argv, "hd::l:f:", long_options, &option_index); + c = getopt_long(argc, argv, "hd::l:f:s:", long_options, &option_index); /* Detect the end of the options. */ if (c == -1) @@ -76,7 +103,10 @@ int parse_cmdline_args(struct command_context_s *cmd_ctx, int argc, char *argv[] help_flag = 1; break; case 'f': /* --file | -f */ - config_file_name = optarg; + add_config_file_name(optarg); + break; + case 's': /* --search | -s */ + add_script_search_dir(optarg); break; case 'd': /* --debug | -d */ if (optarg) @@ -100,32 +130,68 @@ int parse_cmdline_args(struct command_context_s *cmd_ctx, int argc, char *argv[] printf("Open On-Chip Debugger\n(c) 2005 by Dominic Rath\n\n"); printf("--help | -h\tdisplay this help\n"); printf("--file | -f\tuse configuration file <name>\n"); + printf("--search | -s\tdir to search for config files and scripts.\n"); printf("--debug | -d\tset debug level <0-3>\n"); printf("--log_output | -l\tredirect log output to file <name>\n"); exit(-1); } + /* Add dir for openocd supplied scripts last so that user can over + ride those scripts if desired. */ + add_script_search_dir(PKGDATADIR); + return ERROR_OK; } +FILE *open_file_from_path (command_context_t *cmd_ctx, char *file, char *mode) +{ + FILE *fp = NULL; + char **search_dirs = script_search_dirs; + char *dir; + char full_path[1024]; + + while (!fp) + { + dir = *search_dirs++; + + if (!dir) + break; + + snprintf(full_path, 1024, "%s/%s", dir, file); + fp = fopen(full_path, mode); + } + + if (fp) + command_print(cmd_ctx, "opened %s", full_path); + + return fp; +} + int parse_config_file(struct command_context_s *cmd_ctx) { + char **cfg; FILE *config_file; - if (!config_file_name) - config_file_name = "openocd.cfg"; + if (!config_file_names) + add_config_file_name ("openocd.cfg"); - config_file = fopen(config_file_name, "r"); - if (!config_file) + cfg = config_file_names; + + while (*cfg) { - ERROR("couldn't open config file"); - return ERROR_NO_CONFIG_FILE; - } + config_file = open_file_from_path(cmd_ctx, *cfg, "r"); + if (!config_file) + { + ERROR("couldn't open config file"); + return ERROR_NO_CONFIG_FILE; + } - command_run_file(cmd_ctx, config_file, COMMAND_CONFIG); + command_run_file(cmd_ctx, config_file, COMMAND_CONFIG); - fclose(config_file); + fclose(config_file); + + cfg++; + } return ERROR_OK; } - diff --git a/src/helper/configuration.h b/src/helper/configuration.h index cd96e2f..ec6e553 100644 --- a/src/helper/configuration.h +++ b/src/helper/configuration.h @@ -26,6 +26,6 @@ extern int parse_cmdline_args(struct command_context_s *cmd_ctx, int argc, char *argv[]); extern int parse_config_file(struct command_context_s *cmd_ctx); extern int configuration_output_handler(struct command_context_s *context, char* line); +extern FILE *open_file_from_path (command_context_t *cmd_ctx, char *file, char *mode); -extern char* config_file_name; #endif /* CONFIGURATION_H */ diff --git a/src/helper/interpreter.c b/src/helper/interpreter.c index e5ce0f0..c5c38b8 100644 --- a/src/helper/interpreter.c +++ b/src/helper/interpreter.c @@ -22,6 +22,7 @@ #endif #include "interpreter.h" +#include "configuration.h" #include "binarybuffer.h" #include <stdlib.h> @@ -221,7 +222,8 @@ int handle_script_command(struct command_context_s *cmd_ctx, char *cmd, char **a if (argc != 1) command_print(cmd_ctx, "usage: script <file>"); - script_file = fopen(args[0], "r"); + script_file = open_file_from_path(cmd_ctx, args[0], "r"); + if (!script_file) { command_print(cmd_ctx, "couldn't open script file %s", args[0]); diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c index c256c24..71f82dd 100644 --- a/src/server/gdb_server.c +++ b/src/server/gdb_server.c @@ -32,6 +32,7 @@ #include "breakpoints.h" #include "flash.h" #include "target_request.h" +#include "configuration.h" #include <string.h> #include <errno.h> @@ -539,7 +540,7 @@ int gdb_program_handler(struct target_s *target, enum target_event event, void * if (target->gdb_program_script) { - script = fopen(target->gdb_program_script, "r"); + script = open_file_from_path(cmd_ctx, target->gdb_program_script, "r"); if (!script) { ERROR("couldn't open script file %s", target->gdb_program_script); diff --git a/src/target/target.c b/src/target/target.c index 4d6ffe3..ab8a161 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -224,7 +224,7 @@ int target_init_handler(struct target_s *target, enum target_event event, void * { target_unregister_event_callback(target_init_handler, priv); - script = fopen(target->reset_script, "r"); + script = open_file_from_path(cmd_ctx, target->reset_script, "r"); if (!script) { ERROR("couldn't open script file %s", target->reset_script); |