fsnotifier: meaningful exit codes
authorRoman Shevchenko <roman.shevchenko@jetbrains.com>
Mon, 17 Jun 2013 16:00:27 +0000 (20:00 +0400)
committerRoman Shevchenko <roman.shevchenko@jetbrains.com>
Mon, 17 Jun 2013 16:01:07 +0000 (20:01 +0400)
bin/linux/fsnotifier
bin/linux/fsnotifier64
native/fsNotifier/linux/main.c

index 134573032b57faa6bade55415eeda2fc13211b2c..37430c7dc6754bac9969c0af98ce032784394756 100755 (executable)
Binary files a/bin/linux/fsnotifier and b/bin/linux/fsnotifier differ
index 0fae80c30ceda372578fca3fe3a01b7588849cd7..1bd81797640c477f59bcaf23331d309c80e0fa8b 100755 (executable)
Binary files a/bin/linux/fsnotifier64 and b/bin/linux/fsnotifier64 differ
index 5b9ee0933b3d122a193fd300a8151487355ad4bd..3cd65e28fc549b38cea2b7c0342b3a82fc6d946c 100644 (file)
@@ -36,7 +36,7 @@
 #define LOG_ENV_ERROR "error"
 #define LOG_ENV_OFF "off"
 
-#define VERSION "20130617.1827"
+#define VERSION "20130617.1935"
 #define VERSION_MSG "fsnotifier " VERSION "\n"
 
 #define USAGE_MSG \
@@ -73,8 +73,8 @@ static bool self_test = false;
 
 static void init_log();
 static void run_self_test();
-static void main_loop();
-static bool read_input();
+static bool main_loop();
+static int read_input();
 static bool update_roots(array* new_roots);
 static void unregister_roots();
 static bool register_roots(array* new_roots, array* unwatchable, array* mounts);
@@ -116,12 +116,15 @@ int main(int argc, char** argv) {
 
   setvbuf(stdin, NULL, _IONBF, 0);
 
+  int rv = 0;
   roots = array_create(20);
-  if (init_inotify() && roots != NULL) {
+  if (roots != NULL && init_inotify()) {
     set_inotify_callback(&inotify_callback);
 
     if (!self_test) {
-      main_loop();
+      if (!main_loop()) {
+        rv = 3;
+      }
     }
     else {
       run_self_test();
@@ -131,14 +134,15 @@ int main(int argc, char** argv) {
   }
   else {
     output("GIVEUP\n");
+    rv = 2;
   }
   close_inotify();
   array_delete(roots);
 
-  userlog(LOG_INFO, "finished");
+  userlog(LOG_INFO, "finished (%d)", rv);
   closelog();
 
-  return 0;
+  return rv;
 }
 
 
@@ -216,7 +220,7 @@ static void run_self_test() {
 }
 
 
-static void main_loop() {
+static bool main_loop() {
   int input_fd = fileno(stdin), inotify_fd = get_inotify_fd();
   int nfds = (inotify_fd > input_fd ? inotify_fd : input_fd) + 1;
   fd_set rfds;
@@ -233,14 +237,16 @@ static void main_loop() {
     if (select(nfds, &rfds, NULL, NULL, &timeout) < 0) {
       if (errno != EINTR) {
         userlog(LOG_ERR, "select: %s", strerror(errno));
-        break;
+        return false;
       }
     }
     else if (FD_ISSET(input_fd, &rfds)) {
-      if (!read_input()) break;
+      int result = read_input();
+      if (result == 0) return true;
+      else if (result != ERR_CONTINUE) return false;
     }
     else if (FD_ISSET(inotify_fd, &rfds)) {
-      if (!process_inotify_input()) break;
+      if (!process_inotify_input()) return false;
     }
     else {
       check_missing_roots();
@@ -249,24 +255,24 @@ static void main_loop() {
 }
 
 
-static bool read_input() {
+static int read_input() {
   char* line = read_line(stdin);
   userlog(LOG_DEBUG, "input: %s", (line ? line : "<null>"));
 
   if (line == NULL || strcmp(line, "EXIT") == 0) {
     userlog(LOG_INFO, "exiting: %s", line);
-    return false;
+    return 0;
   }
 
   if (strcmp(line, "ROOTS") == 0) {
     array* new_roots = array_create(20);
-    CHECK_NULL(new_roots, false);
+    CHECK_NULL(new_roots, ERR_ABORT);
 
     while (1) {
       line = read_line(stdin);
       userlog(LOG_DEBUG, "input: %s", (line ? line : "<null>"));
       if (line == NULL || strlen(line) == 0) {
-        return false;
+        return 0;
       }
       else if (strcmp(line, "#") == 0) {
         break;
@@ -274,15 +280,15 @@ static bool read_input() {
       else {
         int l = strlen(line);
         if (l > 1 && line[l-1] == '/')  line[l-1] = '\0';
-        CHECK_NULL(array_push(new_roots, strdup(line)), false);
+        CHECK_NULL(array_push(new_roots, strdup(line)), ERR_ABORT);
       }
     }
 
-    return update_roots(new_roots);
+    return update_roots(new_roots) ? ERR_CONTINUE : ERR_ABORT;
   }
 
-  userlog(LOG_INFO, "unrecognised command: %s", line);
-  return true;
+  userlog(LOG_WARNING, "unrecognised command: %s", line);
+  return ERR_CONTINUE;
 }