1 /***************************************************************************
2 * Copyright (C) 2004, 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * Copyright (C) 2007,2008 Øyvind Harboe *
6 * oyvind.harboe@zylin.com *
8 * This program is free software; you can redistribute it and/or modify *
9 * it under the terms of the GNU General Public License as published by *
10 * the Free Software Foundation; either version 2 of the License, or *
11 * (at your option) any later version. *
13 * This program is distributed in the hope that it will be useful, *
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16 * GNU General Public License for more details. *
18 * You should have received a copy of the GNU General Public License *
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
20 ***************************************************************************/
25 #include "configuration.h"
28 static size_t num_config_files
;
29 static char **config_file_names
;
31 static size_t num_script_dirs
;
32 static char **script_search_dirs
;
34 void add_script_search_dir(const char *dir
)
37 script_search_dirs
= realloc(script_search_dirs
, (num_script_dirs
+ 1) * sizeof(char *));
39 script_search_dirs
[num_script_dirs
-1] = strdup(dir
);
40 script_search_dirs
[num_script_dirs
] = NULL
;
42 LOG_DEBUG("adding %s", dir
);
45 void add_config_command(const char *cfg
)
48 config_file_names
= realloc(config_file_names
, (num_config_files
+ 1) * sizeof(char *));
50 config_file_names
[num_config_files
-1] = strdup(cfg
);
51 config_file_names
[num_config_files
] = NULL
;
54 void free_config(void)
56 while (num_config_files
)
57 free(config_file_names
[--num_config_files
]);
59 free(config_file_names
);
60 config_file_names
= NULL
;
62 while (num_script_dirs
)
63 free(script_search_dirs
[--num_script_dirs
]);
65 free(script_search_dirs
);
66 script_search_dirs
= NULL
;
69 /* return full path or NULL according to search rules */
70 char *find_file(const char *file
)
73 char **search_dirs
= script_search_dirs
;
75 char const *mode
= "r";
78 /* Check absolute and relative to current working dir first.
79 * This keeps full_path reporting belowing working. */
80 full_path
= alloc_printf("%s", file
);
81 fp
= fopen(full_path
, mode
);
91 full_path
= alloc_printf("%s/%s", dir
, file
);
92 fp
= fopen(full_path
, mode
);
97 LOG_DEBUG("found %s", full_path
);
106 FILE *open_file_from_path(const char *file
, const char *mode
)
109 return fopen(file
, mode
);
111 char *full_path
= find_file(file
);
112 if (full_path
== NULL
)
115 fp
= fopen(full_path
, mode
);
121 int parse_config_file(struct command_context
*cmd_ctx
)
126 if (!config_file_names
) {
127 command_run_line(cmd_ctx
, "script openocd.cfg");
131 cfg
= config_file_names
;
134 retval
= command_run_line(cmd_ctx
, *cfg
);
135 if (retval
!= ERROR_OK
)
147 char *get_home_dir(const char *append_path
)
149 char *home
= getenv("HOME");
154 home
= getenv("USERPROFILE");
158 char homepath
[MAX_PATH
];
159 char *drive
= getenv("HOMEDRIVE");
160 char *path
= getenv("HOMEPATH");
162 snprintf(homepath
, MAX_PATH
, "%s/%s", drive
, path
);
167 struct passwd
*pwd
= getpwuid(getuid());
180 home_path
= alloc_printf("%s/%s", home
, append_path
);
182 home_path
= alloc_printf("%s", home
);