]> git.ozlabs.org Git - petitboot/blobdiff - lib/system/system.c
lib/util: Move mac_buf from nc code to util library
[petitboot] / lib / system / system.c
index 528e134127f307f17d9dcfaa70b2b1ef60eb7a52..917d44447532361218eb8939b6870edc9a46a16e 100644 (file)
@@ -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);
-}