install/dracut-install.c: support find_binary for <src> <dst>

also factor out find_binary()
master
Harald Hoyer 2012-09-26 11:34:38 +02:00
parent 2cae00be9e
commit 868eba13f2
1 changed files with 83 additions and 44 deletions

View File

@ -666,6 +666,81 @@ static int resolve_lazy(int argc, char **argv)
return ret; return ret;
} }


static char *find_binary(const char *src)
{
char *path;
char *p, *q;
bool end = false;
char *newsrc = NULL;
path = getenv("PATH");

if (path == NULL) {
log_error("PATH is not set");
exit(EXIT_FAILURE);
}
path = strdup(path);
p = path;
log_debug("PATH=%s", path);

do {
struct stat sb;

for (q = p; *q && *q != ':'; q++) ;

if (*q == '\0')
end = true;
else
*q = '\0';

asprintf(&newsrc, "%s/%s", p, src);
p = q + 1;

if (stat(newsrc, &sb) != 0) {
log_debug("stat(%s) != 0", newsrc);
free(newsrc);
newsrc = NULL;
continue;
}

end = true;

} while (!end);

free(path);
if (newsrc)
log_debug("find_binary(%s) == %s", src, newsrc);
return newsrc;
}

static int install_one(const char *src, const char *dst)
{
int r = 0;
int ret;

if (strchr(src, '/') == NULL) {
char *newsrc = find_binary(src);
if (newsrc) {
log_debug("dracut_install '%s' '%s'", newsrc, dst);
ret = dracut_install(newsrc, dst, arg_createdir, arg_resolvedeps, true);
if (ret == 0) {
log_debug("dracut_install '%s' '%s' OK", newsrc, dst);
}
free(newsrc);
} else {
ret = -1;
}
} else {
ret = dracut_install(src, dst, arg_createdir, arg_resolvedeps, true);
}

if ((ret != 0) && (!arg_optional)) {
log_error("ERROR: installing '%s' to '%s'", src, dst);
r = EXIT_FAILURE;
}

return r;
}

static int install_all(int argc, char **argv) static int install_all(int argc, char **argv)
{ {
int r = 0; int r = 0;
@ -675,50 +750,18 @@ static int install_all(int argc, char **argv)
log_debug("Handle '%s'", argv[i]); log_debug("Handle '%s'", argv[i]);


if (strchr(argv[i], '/') == NULL) { if (strchr(argv[i], '/') == NULL) {
char *path; char *newsrc = find_binary(argv[i]);
char *p, *q; if (newsrc) {
bool end = false;
path = getenv("PATH");
if (path == NULL) {
log_error("PATH is not set");
exit(EXIT_FAILURE);
}
path = strdup(path);
p = path;
log_debug("PATH=%s", path);
do {
char *newsrc = NULL;
char *dest;
struct stat sb;

for (q = p; *q && *q != ':'; q++) ;

if (*q == '\0')
end = true;
else
*q = '\0';

asprintf(&newsrc, "%s/%s", p, argv[i]);
p = q + 1;

if (stat(newsrc, &sb) != 0) {
free(newsrc);
ret = -1;
continue;
}

dest = strdup(newsrc);

log_debug("dracut_install '%s'", newsrc); log_debug("dracut_install '%s'", newsrc);
ret = dracut_install(newsrc, dest, arg_createdir, arg_resolvedeps, true); ret = dracut_install(newsrc, newsrc, arg_createdir, arg_resolvedeps, true);
if (ret == 0) { if (ret == 0) {
end = true;
log_debug("dracut_install '%s' OK", newsrc); log_debug("dracut_install '%s' OK", newsrc);
} }
free(newsrc); free(newsrc);
free(dest); } else {
} while (!end); ret = -1;
free(path); }

} else { } else {
char *dest = strdup(argv[i]); char *dest = strdup(argv[i]);
ret = dracut_install(argv[i], dest, arg_createdir, arg_resolvedeps, true); ret = dracut_install(argv[i], dest, arg_createdir, arg_resolvedeps, true);
@ -805,11 +848,7 @@ int main(int argc, char **argv)
r = install_all(argc - optind, &argv[optind]); r = install_all(argc - optind, &argv[optind]);
} else { } else {
/* simple "inst src dst" */ /* simple "inst src dst" */
r = dracut_install(argv[optind], argv[optind + 1], arg_createdir, arg_resolvedeps, true); r = install_one(argv[optind], argv[optind + 1]);
if ((r != 0) && (!arg_optional)) {
log_error("ERROR: installing '%s' to '%s'", argv[optind], argv[optind + 1]);
r = EXIT_FAILURE;
}
} }


if (arg_optional) if (arg_optional)