]> git.ozlabs.org Git - petitboot/blobdiff - discover/paths.c
discover/paths: Add stdout callback parameter for load_url_async()
[petitboot] / discover / paths.c
index aa977fdba1f3d0bcbdbf84356a854877c202a17d..ad42b5b7760858e7cd3ab6d7217d855e91b72f15 100644 (file)
@@ -1,9 +1,13 @@
-#define _GNU_SOURCE
+#if defined(HAVE_CONFIG_H)
+#include "config.h"
+#endif
 
 #include <assert.h>
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
 
 #include <talloc/talloc.h>
 #include <system/system.h>
@@ -43,18 +47,24 @@ char *join_paths(void *alloc_ctx, const char *a, const char *b)
        return full_path;
 }
 
+#ifndef PETITBOOT_TEST
 
 static char *local_name(void *ctx)
 {
-       char *tmp, *ret;
+       char *ret, tmp[] = "/tmp/pb-XXXXXX";
+       mode_t oldmask;
+       int fd;
 
-       tmp = tempnam(NULL, "pb-");
+       oldmask = umask(0644);
+       fd = mkstemp(tmp);
+       umask(oldmask);
 
-       if (!tmp)
+       if (fd < 0)
                return NULL;
 
+       close(fd);
+
        ret = talloc_strdup(ctx, tmp);
-       free(tmp);
 
        return ret;
 }
@@ -82,7 +92,7 @@ static void load_url_process_exit(struct process *process)
 
        if (result->status == LOAD_CANCELLED) {
                load_url_result_cleanup_local(result);
-       } else if (process->exit_status == 0) {
+       } else if (process_exit_ok(process)) {
                result->status = LOAD_OK;
        } else {
                result->status = LOAD_ERROR;
@@ -127,7 +137,10 @@ static void load_process_to_local_file(struct load_task *task,
                task->result->status = rc ? LOAD_ERROR : LOAD_ASYNC;
        } else {
                rc = process_run_sync(task->process);
-               task->result->status = rc ? LOAD_ERROR : LOAD_OK;
+               if (rc || !process_exit_ok(task->process))
+                       task->result->status = LOAD_ERROR;
+               else
+                       task->result->status = LOAD_OK;
                process_release(task->process);
                task->process = NULL;
        }
@@ -213,14 +226,16 @@ static enum tftp_type check_tftp_type(void *ctx)
        const char *argv[] = { pb_system_apps.tftp, "-V", NULL };
        struct process *process;
        enum tftp_type type;
+       int rc;
 
        process = process_create(ctx);
        process->path = pb_system_apps.tftp;
        process->argv = argv;
        process->keep_stdout = true;
-       process_run_sync(process);
+       process->add_stderr = true;
+       rc = process_run_sync(process);
 
-       if (!process->stdout_buf || process->stdout_len == 0) {
+       if (rc || !process->stdout_buf || process->stdout_len == 0) {
                pb_log("Can't check TFTP client type!\n");
                type = TFTP_TYPE_BROKEN;
 
@@ -302,8 +317,9 @@ static void load_wget(struct load_task *task, int flags)
                pb_system_apps.wget,
                "-O",
                NULL, /* 2: local file */
-               NULL,
-               NULL,
+               NULL, /* 3 (optional): --quiet */
+               NULL, /* 4 (optional): --no-check-certificate */
+               NULL, /* 5: URL */
                NULL,
        };
        int i;
@@ -354,7 +370,8 @@ static void load_local(struct load_task *task)
  */
 
 struct load_url_result *load_url_async(void *ctx, struct pb_url *url,
-               load_url_complete async_cb, void *async_data)
+               load_url_complete async_cb, void *async_data,
+               waiter_cb stdout_cb, void *stdout_data)
 {
        struct load_url_result *result;
        struct load_task *task;
@@ -367,12 +384,21 @@ struct load_url_result *load_url_async(void *ctx, struct pb_url *url,
        task->async = async_cb != NULL;
        task->result = talloc_zero(ctx, struct load_url_result);
        task->result->task = task;
+       task->result->url = url;
        task->process = process_create(task);
        if (task->async) {
                task->async_cb = async_cb;
                task->async_data = async_data;
                task->process->exit_cb = load_url_process_exit;
                task->process->data = task;
+               task->process->stdout_cb = stdout_cb;
+               task->process->stdout_data = stdout_data;
+       }
+
+       /* Make sure we save output for any task that has a custom handler */
+       if (task->process->stdout_cb) {
+               task->process->add_stderr = true;
+               task->process->keep_stdout = true;
        }
 
        switch (url->scheme) {
@@ -413,7 +439,7 @@ struct load_url_result *load_url_async(void *ctx, struct pb_url *url,
 
 struct load_url_result *load_url(void *ctx, struct pb_url *url)
 {
-       return load_url_async(ctx, url, NULL, NULL);
+       return load_url_async(ctx, url, NULL, NULL, NULL, NULL);
 }
 
 void load_url_async_cancel(struct load_url_result *res)
@@ -434,3 +460,33 @@ void load_url_async_cancel(struct load_url_result *res)
        res->status = LOAD_CANCELLED;
        process_stop_async(task->process);
 }
+
+#else
+
+static void __attribute__((unused)) load_local(
+               struct load_task *task __attribute__((unused)))
+{
+}
+static void __attribute__((unused)) load_wget(
+               struct load_task *task __attribute__((unused)),
+               int flags __attribute__((unused)))
+{
+}
+static void __attribute__((unused)) load_tftp(
+               struct load_task *task __attribute__((unused)))
+{
+}
+static void __attribute__((unused)) load_sftp(
+               struct load_task *task __attribute__((unused)))
+{
+}
+static void __attribute__((unused)) load_nfs(
+               struct load_task *task __attribute__((unused)))
+{
+}
+static void __attribute__((unused)) load_url_process_exit(
+               struct process *process __attribute__((unused)))
+{
+}
+
+#endif