Commit 0608182a authored by Masahiro Yamada's avatar Masahiro Yamada

kconfig: split out useful helpers in confdata.c

Split out helpers:
 is_present() - check if the given path exists
 is_dir() - check if the given path exists and it is a directory
 make_parent_dir() - create the parent directories of the given path

These helpers will be reused in later commits.
Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
parent a2ff4040
...@@ -16,6 +16,64 @@ ...@@ -16,6 +16,64 @@
#include "lkc.h" #include "lkc.h"
/* return true if 'path' exists, false otherwise */
static bool is_present(const char *path)
{
struct stat st;
return !stat(path, &st);
}
/* return true if 'path' exists and it is a directory, false otherwise */
static bool is_dir(const char *path)
{
struct stat st;
if (stat(path, &st))
return 0;
return S_ISDIR(st.st_mode);
}
/*
* Create the parent directory of the given path.
*
* For example, if 'include/config/auto.conf' is given, create 'include/config'.
*/
static int make_parent_dir(const char *path)
{
char tmp[PATH_MAX + 1];
char *p;
strncpy(tmp, path, sizeof(tmp));
tmp[sizeof(tmp) - 1] = 0;
/* Remove the base name. Just return if nothing is left */
p = strrchr(tmp, '/');
if (!p)
return 0;
*(p + 1) = 0;
/* Just in case it is an absolute path */
p = tmp;
while (*p == '/')
p++;
while ((p = strchr(p, '/'))) {
*p = 0;
/* skip if the directory exists */
if (!is_dir(tmp) && mkdir(tmp, 0755))
return -1;
*p = '/';
while (*p == '/')
p++;
}
return 0;
}
struct conf_printer { struct conf_printer {
void (*print_symbol)(FILE *, struct symbol *, const char *, void *); void (*print_symbol)(FILE *, struct symbol *, const char *, void *);
void (*print_comment)(FILE *, const char *, void *); void (*print_comment)(FILE *, const char *, void *);
...@@ -88,7 +146,6 @@ const char *conf_get_autoconfig_name(void) ...@@ -88,7 +146,6 @@ const char *conf_get_autoconfig_name(void)
char *conf_get_default_confname(void) char *conf_get_default_confname(void)
{ {
struct stat buf;
static char fullname[PATH_MAX+1]; static char fullname[PATH_MAX+1];
char *env, *name; char *env, *name;
...@@ -96,7 +153,7 @@ char *conf_get_default_confname(void) ...@@ -96,7 +153,7 @@ char *conf_get_default_confname(void)
env = getenv(SRCTREE); env = getenv(SRCTREE);
if (env) { if (env) {
sprintf(fullname, "%s/%s", env, name); sprintf(fullname, "%s/%s", env, name);
if (!stat(fullname, &buf)) if (is_present(fullname))
return fullname; return fullname;
} }
return name; return name;
...@@ -730,10 +787,9 @@ int conf_write(const char *name) ...@@ -730,10 +787,9 @@ int conf_write(const char *name)
dirname[0] = 0; dirname[0] = 0;
if (name && name[0]) { if (name && name[0]) {
struct stat st;
char *slash; char *slash;
if (!stat(name, &st) && S_ISDIR(st.st_mode)) { if (is_dir(name)) {
strcpy(dirname, name); strcpy(dirname, name);
strcat(dirname, "/"); strcat(dirname, "/");
basename = conf_get_configname(); basename = conf_get_configname();
...@@ -853,7 +909,6 @@ static int conf_split_config(void) ...@@ -853,7 +909,6 @@ static int conf_split_config(void)
char path[PATH_MAX+1]; char path[PATH_MAX+1];
char *s, *d, c; char *s, *d, c;
struct symbol *sym; struct symbol *sym;
struct stat sb;
int res, i, fd; int res, i, fd;
name = conf_get_autoconfig_name(); name = conf_get_autoconfig_name();
...@@ -931,19 +986,11 @@ static int conf_split_config(void) ...@@ -931,19 +986,11 @@ static int conf_split_config(void)
res = 1; res = 1;
break; break;
} }
/*
* Create directory components, if (make_parent_dir(path)) {
* unless they exist already.
*/
d = path;
while ((d = strchr(d, '/'))) {
*d = 0;
if (stat(path, &sb) && mkdir(path, 0755)) {
res = 1; res = 1;
goto out; goto out;
} }
*d++ = '/';
}
/* Try it again. */ /* Try it again. */
fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644); fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd == -1) { if (fd == -1) {
......
Markdown is supported
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