chiark / gitweb /
service: make chain of main commands and control commands independent of each other...
[elogind.git] / src / notify.c
index b914a744208419a464b13a74bfa7a53d598b89cf..a9bc51e2dbcfe0ca971d747a966a44d3e4482f1e 100644 (file)
 #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"
                "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;
 
@@ -119,7 +128,8 @@ static int parse_argv(int argc, char *argv[]) {
             !arg_ready &&
             !arg_status &&
             !arg_pid &&
-            !arg_booted) {
+            !arg_booted &&
+            !arg_readahead) {
                 help();
                 return -EINVAL;
         }
@@ -131,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";
 
@@ -172,7 +190,7 @@ int main(int argc, char* argv[]) {
         }
 
         if (strv_length(final_env) <= 0) {
-                retval = 0;
+                retval = EXIT_SUCCESS;
                 goto finish;
         }
 
@@ -186,7 +204,7 @@ int main(int argc, char* argv[]) {
                 goto finish;
         }
 
-        retval = r <= 0;
+        retval = r <= 0 ? EXIT_FAILURE : EXIT_SUCCESS;
 
 finish:
         free(status);