chiark / gitweb /
service: make chain of main commands and control commands independent of each other...
[elogind.git] / src / notify.c
index 77978104a71cd9f8789927e8a757606791e14161..a9bc51e2dbcfe0ca971d747a966a44d3e4482f1e 100644 (file)
@@ -1,4 +1,4 @@
-/*-*- Mode: C; c-basic-offset: 8 -*-*/
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
 
 /***
   This file is part of systemd.
 #include "util.h"
 #include "log.h"
 #include "sd-daemon.h"
+#include "sd-readahead.h"
 
 static bool arg_ready = false;
 static pid_t arg_pid = 0;
 static const char *arg_status = NULL;
 static bool arg_booted = false;
+static const char *arg_readahead = NULL;
 
 static int help(void) {
 
-        printf("%s [options] [VARIABLE=VALUE...]\n\n"
+        printf("%s [OPTIONS...] [VARIABLE=VALUE...]\n\n"
                "Notify the init system about service status updates.\n\n"
-               "  -h --help         Show this help\n"
-               "     --ready        Inform the init system about service start-up completion\n"
-               "     --pid[=PID]    Set main pid of daemon\n"
-               "     --status=TEXT  Set status text\n"
-               "     --booted       Returns 0 if the system was booted up with systemd, non-zero otherwise\n",
+               "  -h --help             Show this help\n"
+               "     --ready            Inform the init system about service start-up completion\n"
+               "     --pid[=PID]        Set main pid of daemon\n"
+               "     --status=TEXT      Set status text\n"
+               "     --booted           Returns 0 if the system was booted up with systemd, non-zero otherwise\n"
+               "     --readahead=ACTION Controls read-ahead operations\n",
                program_invocation_short_name);
 
         return 0;
@@ -57,16 +60,18 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_READY = 0x100,
                 ARG_PID,
                 ARG_STATUS,
-                ARG_BOOTED
+                ARG_BOOTED,
+                ARG_READAHEAD
         };
 
         static const struct option options[] = {
-                { "help",      no_argument,       NULL, 'h'         },
-                { "ready",     no_argument,       NULL, ARG_READY   },
-                { "pid",       optional_argument, NULL, ARG_PID     },
-                { "status",    required_argument, NULL, ARG_STATUS  },
-                { "booted",    no_argument,       NULL, ARG_BOOTED  },
-                { NULL,        0,                 NULL, 0           }
+                { "help",      no_argument,       NULL, 'h'           },
+                { "ready",     no_argument,       NULL, ARG_READY     },
+                { "pid",       optional_argument, NULL, ARG_PID       },
+                { "status",    required_argument, NULL, ARG_STATUS    },
+                { "booted",    no_argument,       NULL, ARG_BOOTED    },
+                { "readahead", required_argument, NULL, ARG_READAHEAD },
+                { NULL,        0,                 NULL, 0             }
         };
 
         int c;
@@ -106,6 +111,10 @@ static int parse_argv(int argc, char *argv[]) {
                         arg_booted = true;
                         break;
 
+                case ARG_READAHEAD:
+                        arg_readahead = optarg;
+                        break;
+
                 case '?':
                         return -EINVAL;
 
@@ -115,6 +124,16 @@ static int parse_argv(int argc, char *argv[]) {
                 }
         }
 
+        if (optind >= argc &&
+            !arg_ready &&
+            !arg_status &&
+            !arg_pid &&
+            !arg_booted &&
+            !arg_readahead) {
+                help();
+                return -EINVAL;
+        }
+
         return 1;
 }
 
@@ -122,18 +141,26 @@ int main(int argc, char* argv[]) {
         char* our_env[4], **final_env = NULL;
         unsigned i = 0;
         char *status = NULL, *cpid = NULL, *n = NULL;
-        int r, retval = 1;
+        int r, retval = EXIT_FAILURE;
 
         log_parse_environment();
+        log_open();
 
         if ((r = parse_argv(argc, argv)) <= 0) {
-                retval = r < 0;
+                retval = r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
                 goto finish;
         }
 
         if (arg_booted)
                 return sd_booted() <= 0;
 
+        if (arg_readahead) {
+                if ((r = sd_readahead(arg_readahead)) < 0) {
+                        log_error("Failed to issue read-ahead control command: %s", strerror(-r));
+                        goto finish;
+                }
+        }
+
         if (arg_ready)
                 our_env[i++] = (char*) "READY=1";
 
@@ -163,7 +190,7 @@ int main(int argc, char* argv[]) {
         }
 
         if (strv_length(final_env) <= 0) {
-                retval = 0;
+                retval = EXIT_SUCCESS;
                 goto finish;
         }
 
@@ -177,7 +204,7 @@ int main(int argc, char* argv[]) {
                 goto finish;
         }
 
-        retval = r <= 0;
+        retval = r <= 0 ? EXIT_FAILURE : EXIT_SUCCESS;
 
 finish:
         free(status);