X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=lib%2Fsystem%2Fsystem.c;h=917d44447532361218eb8939b6870edc9a46a16e;hp=528e134127f307f17d9dcfaa70b2b1ef60eb7a52;hb=072847109936bc0e822f8cf67c31eb62183f0db8;hpb=aaa1de0046295cfd1f7a5428f399a5d1f9e1e563 diff --git a/lib/system/system.c b/lib/system/system.c index 528e134..917d444 100644 --- a/lib/system/system.c +++ b/lib/system/system.c @@ -30,11 +30,17 @@ const struct pb_system_apps pb_system_apps = { .udhcpc = HOST_PROG_UDHCPC, }; +#ifndef TFTP_TYPE +#define TFTP_TYPE TFTP_TYPE_UNKNOWN +#endif + +enum tftp_type tftp_type = TFTP_TYPE; + int pb_mkdir_recursive(const char *dir) { struct stat statbuf; + int rc, mode = 0755; char *str, *sep; - int mode = 0755; if (!*dir) return 0; @@ -51,6 +57,8 @@ int pb_mkdir_recursive(const char *dir) str = talloc_strdup(NULL, dir); sep = strchr(*str == '/' ? str + 1 : str, '/'); + rc = 0; + while (1) { /* terminate the path at sep */ @@ -59,7 +67,8 @@ int pb_mkdir_recursive(const char *dir) if (mkdir(str, mode) && errno != EEXIST) { pb_log("mkdir(%s): %s\n", str, strerror(errno)); - return -1; + rc = -1; + break; } if (!sep) @@ -72,7 +81,7 @@ int pb_mkdir_recursive(const char *dir) talloc_free(str); - return 0; + return rc; } int pb_rmdir_recursive(const char *base, const char *dir) @@ -85,12 +94,12 @@ int pb_rmdir_recursive(const char *base, const char *dir) cur = talloc_strdup(NULL, dir); - while (strcmp(base, dir)) { + while (strcmp(base, cur)) { - rmdir(dir); + rmdir(cur); /* null-terminate at the last slash */ - pos = strrchr(dir, '/'); + pos = strrchr(cur, '/'); if (!pos) break; @@ -101,152 +110,3 @@ int pb_rmdir_recursive(const char *base, const char *dir) return 0; } - -static int read_pipe(void *ctx, int fd, char **bufp, int *lenp) -{ - int rc, len, alloc_len; - char *buf; - - alloc_len = 4096; - len = 0; - - buf = talloc_array(ctx, char, alloc_len); - - for (;;) { - rc = read(fd, buf, alloc_len - len - 1); - if (rc <= 0) - break; - - len += rc; - if (len == alloc_len - 1) { - alloc_len *= 2; - buf = talloc_realloc(ctx, buf, char, alloc_len); - } - } - - if (rc < 0) { - talloc_free(buf); - return rc; - } - - buf[len] = '\0'; - *bufp = buf; - *lenp = len; - - return 0; -} - -/** - * pb_run_cmd - Run the supplied command. - * @cmd_argv: An argument list array for execv. - * @wait: Wait for the child process to complete before returning. - * @dry_run: Don't actually fork and exec. - */ - -int pb_run_cmd(const char *const *cmd_argv, int wait, int dry_run) -{ - return pb_run_cmd_pipe(cmd_argv, wait, dry_run, NULL, NULL, NULL); -} - -int pb_run_cmd_pipe(const char *const *cmd_argv, int wait, int dry_run, - void *ctx, char **stdout_buf, int *stdout_buf_len) -{ -#if defined(DEBUG) - enum {do_debug = 1}; -#else - enum {do_debug = 0}; -#endif - int status, pipefd[2]; - pid_t pid; - - assert(!stdout_buf || wait); - assert(!stdout_buf || ctx); - assert(!stdout_buf || stdout_buf_len); - - if (do_debug) { - const char *const *p = cmd_argv; - - pb_log("%s: %s", __func__, (dry_run ? "(dry-run) " : "")); - - while (*p) { - pb_log("%s ", *p); - p++; - } - pb_log("\n"); - } else - pb_log("%s: %s%s\n", __func__, (dry_run ? "(dry-run) " : ""), - cmd_argv[0]); - - if (stdout_buf) { - *stdout_buf = NULL; - *stdout_buf_len = 0; - } - - if (dry_run) - return 0; - - if (stdout_buf) { - status = pipe(pipefd); - if (status) { - pb_log("pipe failed"); - return -1; - } - } - - pid = fork(); - - if (pid == -1) { - pb_log("%s: fork failed: %s\n", __func__, strerror(errno)); - return -1; - } - - - if (pid == 0) { - int log = fileno(pb_log_get_stream()); - - /* Redirect child output to log. */ - - if (stdout_buf) { - status = dup2(pipefd[1], STDOUT_FILENO); - } else { - status = dup2(log, STDOUT_FILENO); - } - assert(status != -1); - - status = dup2(log, STDERR_FILENO); - assert(status != -1); - - execvp(cmd_argv[0], (char *const *)cmd_argv); - pb_log("%s: exec failed: %s\n", __func__, strerror(errno)); - exit(EXIT_FAILURE); - } - - if (!wait && !waitpid(pid, &status, WNOHANG)) - return 0; - - if (stdout_buf) { - close(pipefd[1]); - status = read_pipe(ctx, pipefd[0], stdout_buf, stdout_buf_len); - if (status) - return -1; - } - - if (waitpid(pid, &status, 0) == -1) { - pb_log("%s: waitpid failed: %s\n", __func__, - strerror(errno)); - return -1; - } - - if (do_debug && WIFSIGNALED(status) && WTERMSIG(status) == SIGINT) - pb_log("%s: signaled\n", __func__); - - if (!WIFEXITED(status)) { - pb_log("%s: %s failed\n", __func__, cmd_argv[0]); - return -1; - } - - if (WEXITSTATUS(status)) - pb_log("%s: WEXITSTATUS %d\n", __func__, WEXITSTATUS(status)); - - return WEXITSTATUS(status); -}