Commit 95df797b authored by ntfreak's avatar ntfreak
Browse files

- add search paths via new arg -s (-search). Thanks Ted Roth

- updated docs for new command

git-svn-id: svn://svn.berlios.de/openocd/trunk@312 b42882b7-edfa-0310-969c-e2dbd0fdcd60
parent ee340df8
...@@ -159,6 +159,10 @@ locations, i.e. /usr/include, /usr/lib. ...@@ -159,6 +159,10 @@ locations, i.e. /usr/include, /usr/lib.
@node Running @node Running
@chapter Running @chapter Running
@cindex running openocd @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). 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. 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 ...@@ -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 only informational messages, warnings and errors. You can also change this setting
from within a telnet or gdb session (@option{debug_level <n>}). 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 @node Configuration
@chapter Configuration @chapter Configuration
......
INCLUDES = $(all_includes) INCLUDES = $(all_includes)
METASOURCES = AUTO METASOURCES = AUTO
AM_CPPFLAGS = -DPKGDATADIR=\"$(pkgdatadir)\" @CPPFLAGS@
noinst_LIBRARIES = libhelper.a noinst_LIBRARIES = libhelper.a
libhelper_a_SOURCES = binarybuffer.c configuration.c log.c interpreter.c command.c time_support.c \ libhelper_a_SOURCES = binarybuffer.c configuration.c log.c interpreter.c command.c time_support.c \
replacements.c fileio.c replacements.c fileio.c
......
...@@ -29,8 +29,13 @@ ...@@ -29,8 +29,13 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <getopt.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; static int help_flag;
...@@ -40,6 +45,7 @@ static struct option long_options[] = ...@@ -40,6 +45,7 @@ static struct option long_options[] =
{"debug", optional_argument, 0, 'd'}, {"debug", optional_argument, 0, 'd'},
{"file", required_argument, 0, 'f'}, {"file", required_argument, 0, 'f'},
{"search", required_argument, 0, 's'},
{"log_output", required_argument, 0, 'l'}, {"log_output", required_argument, 0, 'l'},
{0, 0, 0, 0} {0, 0, 0, 0}
...@@ -52,17 +58,38 @@ int configuration_output_handler(struct command_context_s *context, char* line) ...@@ -52,17 +58,38 @@ int configuration_output_handler(struct command_context_s *context, char* line)
return ERROR_OK; 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 parse_cmdline_args(struct command_context_s *cmd_ctx, int argc, char *argv[])
{ {
int c; int c;
char command_buffer[128]; char command_buffer[128];
/* Always search relative to current working dir first. */
add_script_search_dir(".");
while (1) while (1)
{ {
/* getopt_long stores the option index here. */ /* getopt_long stores the option index here. */
int option_index = 0; 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. */ /* Detect the end of the options. */
if (c == -1) if (c == -1)
...@@ -76,7 +103,10 @@ int parse_cmdline_args(struct command_context_s *cmd_ctx, int argc, char *argv[] ...@@ -76,7 +103,10 @@ int parse_cmdline_args(struct command_context_s *cmd_ctx, int argc, char *argv[]
help_flag = 1; help_flag = 1;
break; break;
case 'f': /* --file | -f */ case 'f': /* --file | -f */
config_file_name = optarg; add_config_file_name(optarg);
break;
case 's': /* --search | -s */
add_script_search_dir(optarg);
break; break;
case 'd': /* --debug | -d */ case 'd': /* --debug | -d */
if (optarg) if (optarg)
...@@ -100,32 +130,68 @@ int parse_cmdline_args(struct command_context_s *cmd_ctx, int argc, char *argv[] ...@@ -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("Open On-Chip Debugger\n(c) 2005 by Dominic Rath\n\n");
printf("--help | -h\tdisplay this help\n"); printf("--help | -h\tdisplay this help\n");
printf("--file | -f\tuse configuration file <name>\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("--debug | -d\tset debug level <0-3>\n");
printf("--log_output | -l\tredirect log output to file <name>\n"); printf("--log_output | -l\tredirect log output to file <name>\n");
exit(-1); 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; 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) int parse_config_file(struct command_context_s *cmd_ctx)
{ {
char **cfg;
FILE *config_file; FILE *config_file;
if (!config_file_name) if (!config_file_names)
config_file_name = "openocd.cfg"; add_config_file_name ("openocd.cfg");
config_file = fopen(config_file_name, "r"); cfg = config_file_names;
if (!config_file)
while (*cfg)
{ {
ERROR("couldn't open config file"); config_file = open_file_from_path(cmd_ctx, *cfg, "r");
return ERROR_NO_CONFIG_FILE; 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; return ERROR_OK;
} }
...@@ -26,6 +26,6 @@ ...@@ -26,6 +26,6 @@
extern int parse_cmdline_args(struct command_context_s *cmd_ctx, int argc, char *argv[]); 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 parse_config_file(struct command_context_s *cmd_ctx);
extern int configuration_output_handler(struct command_context_s *context, char* line); 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 */ #endif /* CONFIGURATION_H */
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#endif #endif
#include "interpreter.h" #include "interpreter.h"
#include "configuration.h"
#include "binarybuffer.h" #include "binarybuffer.h"
#include <stdlib.h> #include <stdlib.h>
...@@ -221,7 +222,8 @@ int handle_script_command(struct command_context_s *cmd_ctx, char *cmd, char **a ...@@ -221,7 +222,8 @@ int handle_script_command(struct command_context_s *cmd_ctx, char *cmd, char **a
if (argc != 1) if (argc != 1)
command_print(cmd_ctx, "usage: script <file>"); 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) if (!script_file)
{ {
command_print(cmd_ctx, "couldn't open script file %s", args[0]); command_print(cmd_ctx, "couldn't open script file %s", args[0]);
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "breakpoints.h" #include "breakpoints.h"
#include "flash.h" #include "flash.h"
#include "target_request.h" #include "target_request.h"
#include "configuration.h"
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
...@@ -539,7 +540,7 @@ int gdb_program_handler(struct target_s *target, enum target_event event, void * ...@@ -539,7 +540,7 @@ int gdb_program_handler(struct target_s *target, enum target_event event, void *
if (target->gdb_program_script) 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) if (!script)
{ {
ERROR("couldn't open script file %s", target->gdb_program_script); ERROR("couldn't open script file %s", target->gdb_program_script);
......
...@@ -224,7 +224,7 @@ int target_init_handler(struct target_s *target, enum target_event event, void * ...@@ -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); 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) if (!script)
{ {
ERROR("couldn't open script file %s", target->reset_script); ERROR("couldn't open script file %s", target->reset_script);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment