]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - src/journal-remote/journal-upload.c
util-lib: split string parsing related calls from util.[ch] into parse-util.[ch]
[thirdparty/systemd.git] / src / journal-remote / journal-upload.c
index e677e133488adc22cf984bb8e30463950aa9cedf..20e2a2f73bdde82037da4a59b5eeeb1f088e9cfb 100644 (file)
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#include <stdio.h>
 #include <curl/curl.h>
-#include <sys/stat.h>
 #include <fcntl.h>
 #include <getopt.h>
+#include <stdio.h>
+#include <sys/stat.h>
 
 #include "sd-daemon.h"
 
-#include "log.h"
-#include "util.h"
-#include "build.h"
-#include "fileio.h"
-#include "mkdir.h"
 #include "conf-parser.h"
+#include "fd-util.h"
+#include "fileio.h"
+#include "formats-util.h"
 #include "journal-upload.h"
+#include "log.h"
+#include "mkdir.h"
+#include "parse-util.h"
+#include "sigbus.h"
+#include "signal-util.h"
+#include "string-util.h"
+#include "util.h"
 
 #define PRIV_KEY_FILE CERTIFICATE_ROOT "/private/journal-upload.pem"
 #define CERT_FILE     CERTIFICATE_ROOT "/certs/journal-upload.pem"
 #define TRUST_FILE    CERTIFICATE_ROOT "/ca/trusted.pem"
 #define DEFAULT_PORT  19532
 
-static const char* arg_url;
-
-static void close_fd_input(Uploader *u);
-
+static const char* arg_url = NULL;
 static const char *arg_key = NULL;
 static const char *arg_cert = NULL;
 static const char *arg_trust = NULL;
-
 static const char *arg_directory = NULL;
 static char **arg_file = NULL;
 static const char *arg_cursor = NULL;
@@ -58,6 +59,8 @@ static bool arg_merge = false;
 static int arg_follow = -1;
 static const char *arg_save_state = NULL;
 
+static void close_fd_input(Uploader *u);
+
 #define SERVER_ANSWER_KEEP 2048
 
 #define STATE_FILE "/var/lib/systemd/journal-upload/state"
@@ -103,18 +106,14 @@ static int check_cursor_updating(Uploader *u) {
                 return 0;
 
         r = mkdir_parents(u->state_file, 0755);
-        if (r < 0) {
-                log_error_errno(r, "Cannot create parent directory of state file %s: %m",
-                                u->state_file);
-                return r;
-        }
+        if (r < 0)
+                return log_error_errno(r, "Cannot create parent directory of state file %s: %m",
+                                       u->state_file);
 
         r = fopen_temporary(u->state_file, &f, &temp_path);
-        if (r < 0) {
-                log_error_errno(r, "Cannot save state to %s: %m",
-                                u->state_file);
-                return r;
-        }
+        if (r < 0)
+                return log_error_errno(r, "Cannot save state to %s: %m",
+                                       u->state_file);
         unlink(temp_path);
 
         return 0;
@@ -130,26 +129,31 @@ static int update_cursor_state(Uploader *u) {
 
         r = fopen_temporary(u->state_file, &f, &temp_path);
         if (r < 0)
-                goto finish;
+                goto fail;
 
         fprintf(f,
                 "# This is private data. Do not parse.\n"
                 "LAST_CURSOR=%s\n",
                 u->last_cursor);
 
-        fflush(f);
+        r = fflush_and_check(f);
+        if (r < 0)
+                goto fail;
 
-        if (ferror(f) || rename(temp_path, u->state_file) < 0) {
+        if (rename(temp_path, u->state_file) < 0) {
                 r = -errno;
-                unlink(u->state_file);
-                unlink(temp_path);
+                goto fail;
         }
 
-finish:
-        if (r < 0)
-                log_error_errno(r, "Failed to save state %s: %m", u->state_file);
+        return 0;
 
-        return r;
+fail:
+        if (temp_path)
+                (void) unlink(temp_path);
+
+        (void) unlink(u->state_file);
+
+        return log_error_errno(r, "Failed to save state %s: %m", u->state_file);
 }
 
 static int load_cursor_state(Uploader *u) {
@@ -164,11 +168,10 @@ static int load_cursor_state(Uploader *u) {
 
         if (r == -ENOENT)
                 log_debug("State file %s is not present.", u->state_file);
-        else if (r < 0) {
-                log_error_errno(r, "Failed to read state file %s: %m",
-                                u->state_file);
-                return r;
-        } else
+        else if (r < 0)
+                return log_error_errno(r, "Failed to read state file %s: %m",
+                                       u->state_file);
+        else
                 log_debug("Last cursor was %s", u->last_cursor);
 
         return 0;
@@ -243,8 +246,9 @@ int start_upload(Uploader *u,
                 easy_setopt(curl, CURLOPT_HTTPHEADER, u->header,
                             LOG_ERR, return -EXFULL);
 
-                /* enable verbose for easier tracing */
-                easy_setopt(curl, CURLOPT_VERBOSE, 1L, LOG_WARNING, );
+                if (_unlikely_(log_get_max_level() >= LOG_DEBUG))
+                        /* enable verbose for easier tracing */
+                        easy_setopt(curl, CURLOPT_VERBOSE, 1L, LOG_WARNING, );
 
                 easy_setopt(curl, CURLOPT_USERAGENT,
                             "systemd-journal-upload " PACKAGE_STRING,
@@ -302,7 +306,7 @@ static size_t fd_input_callback(void *buf, size_t size, size_t nmemb, void *user
                 return 0;
 
         r = read(u->input, buf, size * nmemb);
-        log_debug("%s: allowed %zu, read %zu", __func__, size*nmemb, r);
+        log_debug("%s: allowed %zu, read %zd", __func__, size*nmemb, r);
 
         if (r > 0)
                 return r;
@@ -313,7 +317,7 @@ static size_t fd_input_callback(void *buf, size_t size, size_t nmemb, void *user
                 close_fd_input(u);
                 return 0;
         } else {
-                log_error("Aborting transfer after read error on input: %m.");
+                log_error_errno(errno, "Aborting transfer after read error on input: %m.");
                 return CURL_READFUNC_ABORT;
         }
 }
@@ -362,10 +366,8 @@ static int open_file_for_upload(Uploader *u, const char *filename) {
                 fd = STDIN_FILENO;
         else {
                 fd = open(filename, O_RDONLY|O_CLOEXEC|O_NOCTTY);
-                if (fd < 0) {
-                        log_error("Failed to open %s: %m", filename);
-                        return -errno;
-                }
+                if (fd < 0)
+                        return log_error_errno(errno, "Failed to open %s: %m", filename);
         }
 
         u->input = fd;
@@ -374,10 +376,8 @@ static int open_file_for_upload(Uploader *u, const char *filename) {
                 r = sd_event_add_io(u->events, &u->input_event,
                                     fd, EPOLLIN, dispatch_fd_input, u);
                 if (r < 0) {
-                        if (r != -EPERM || arg_follow > 0) {
-                                log_error_errno(r, "Failed to register input event: %m");
-                                return r;
-                        }
+                        if (r != -EPERM || arg_follow > 0)
+                                return log_error_errno(r, "Failed to register input event: %m");
 
                         /* Normal files should just be consumed without polling. */
                         r = start_upload(u, fd_input_callback, u);
@@ -404,14 +404,11 @@ static int dispatch_sigterm(sd_event_source *event,
 }
 
 static int setup_signals(Uploader *u) {
-        sigset_t mask;
         int r;
 
         assert(u);
 
-        assert_se(sigemptyset(&mask) == 0);
-        sigset_add_many(&mask, SIGINT, SIGTERM, -1);
-        assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
+        assert_se(sigprocmask_many(SIG_SETMASK, NULL, SIGINT, SIGTERM, -1) >= 0);
 
         r = sd_event_add_signal(u->events, &u->sigterm_event, SIGTERM, dispatch_sigterm, u);
         if (r < 0)
@@ -458,16 +455,12 @@ static int setup_uploader(Uploader *u, const char *url, const char *state_file)
         u->state_file = state_file;
 
         r = sd_event_default(&u->events);
-        if (r < 0) {
-                log_error_errno(r, "sd_event_default failed: %m");
-                return r;
-        }
+        if (r < 0)
+                return log_error_errno(r, "sd_event_default failed: %m");
 
         r = setup_signals(u);
-        if (r < 0) {
-                log_error_errno(r, "Failed to set up signals: %m");
-                return r;
-        }
+        if (r < 0)
+                return log_error_errno(r, "Failed to set up signals: %m");
 
         return load_cursor_state(u);
 }
@@ -519,15 +512,15 @@ static int perform_upload(Uploader *u) {
         }
 
         if (status >= 300) {
-                log_error("Upload to %s failed with code %lu: %s",
+                log_error("Upload to %s failed with code %ld: %s",
                           u->url, status, strna(u->answer));
                 return -EIO;
         } else if (status < 200) {
-                log_error("Upload to %s finished with unexpected code %lu: %s",
+                log_error("Upload to %s finished with unexpected code %ld: %s",
                           u->url, status, strna(u->answer));
                 return -EIO;
         } else
-                log_debug("Upload finished successfully with code %lu: %s",
+                log_debug("Upload finished successfully with code %ld: %s",
                           status, strna(u->answer));
 
         free(u->last_cursor);
@@ -545,10 +538,10 @@ static int parse_config(void) {
                 { "Upload",  "TrustedCertificateFile", config_parse_path,   0, &arg_trust  },
                 {}};
 
-        return config_parse(NULL, PKGSYSCONFDIR "/journal-upload.conf", NULL,
-                            "Upload\0",
-                            config_item_table_lookup, items,
-                            false, false, true, NULL);
+        return config_parse_many(PKGSYSCONFDIR "/journal-upload.conf",
+                                 CONF_DIRS_NULSTR("systemd/journal-upload.conf"),
+                                 "Upload\0", config_item_table_lookup, items,
+                                 false, NULL);
 }
 
 static void help(void) {
@@ -629,9 +622,7 @@ static int parse_argv(int argc, char *argv[]) {
                         return 0 /* done */;
 
                 case ARG_VERSION:
-                        puts(PACKAGE_STRING);
-                        puts(SYSTEMD_FEATURES);
-                        return 0 /* done */;
+                        return version();
 
                 case 'u':
                         if (arg_url) {
@@ -701,10 +692,8 @@ static int parse_argv(int argc, char *argv[]) {
 
                 case ARG_FILE:
                         r = glob_extend(&arg_file, optarg);
-                        if (r < 0) {
-                                log_error_errno(r, "Failed to add paths: %m");
-                                return r;
-                        };
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to add paths: %m");
                         break;
 
                 case ARG_CURSOR:
@@ -807,6 +796,8 @@ int main(int argc, char **argv) {
         if (r <= 0)
                 goto finish;
 
+        sigbus_install();
+
         r = setup_uploader(&u, arg_url, arg_save_state);
         if (r < 0)
                 goto cleanup;
@@ -838,7 +829,7 @@ int main(int argc, char **argv) {
                   "READY=1\n"
                   "STATUS=Processing input...");
 
-        while (true) {
+        for (;;) {
                 r = sd_event_get_state(u.events);
                 if (r < 0)
                         break;