]> git.tuebingen.mpg.de Git - dss.git/commitdiff
Merge branch 't/unconditional_hooks'
authorAndre Noll <maan@systemlinux.org>
Wed, 12 May 2010 09:04:36 +0000 (11:04 +0200)
committerAndre Noll <maan@systemlinux.org>
Wed, 12 May 2010 09:04:36 +0000 (11:04 +0200)
1  2 
dss.c

diff --combined dss.c
index 9f601ceb8365552719b001caad98fdd3efef1b30,c996d47313c4673010e87f6042c9009901224b69..531beb60508045a3f40e983b80edc7102a3f4c26
--- 1/dss.c
--- 2/dss.c
+++ b/dss.c
@@@ -214,10 -214,6 +214,6 @@@ static int pre_create_hook(void
        assert(snapshot_creation_status == HS_READY);
        /* make sure that the next snapshot time will be recomputed */
        invalidate_next_snapshot_time();
-       if (!conf.pre_create_hook_given) {
-               snapshot_creation_status = HS_PRE_SUCCESS;
-               return 0;
-       }
        DSS_DEBUG_LOG("executing %s\n", conf.pre_create_hook_arg);
        ret = dss_exec_cmdline_pid(&create_pid,
                conf.pre_create_hook_arg, fds);
@@@ -243,10 -239,6 +239,6 @@@ static int pre_remove_hook(struct snaps
        *snapshot_currently_being_removed = *s;
        snapshot_currently_being_removed->name = dss_strdup(s->name);
  
-       if (!conf.pre_remove_hook_given) {
-               snapshot_removal_status = HS_PRE_SUCCESS;
-               return 0;
-       }
        cmd = make_message("%s %s/%s", conf.pre_remove_hook_arg,
                conf.dest_dir_arg, s->name);
        DSS_DEBUG_LOG("executing %s\n", cmd);
@@@ -502,11 -494,6 +494,6 @@@ static int post_create_hook(void
        int ret, fds[3] = {0, 0, 0};
        char *cmd;
  
-       if (!conf.post_create_hook_given) {
-               create_pid = 0;
-               snapshot_creation_status = HS_READY;
-               return 0;
-       }
        cmd = make_message("%s %s/%s", conf.post_create_hook_arg,
                conf.dest_dir_arg, path_to_last_complete_snapshot);
        DSS_NOTICE_LOG("executing %s\n", cmd);
@@@ -526,10 -513,6 +513,6 @@@ static int post_remove_hook(void
  
        assert(s);
  
-       if (!conf.post_remove_hook_given) {
-               snapshot_removal_status = HS_READY;
-               return 0;
-       }
        cmd = make_message("%s %s/%s", conf.post_remove_hook_arg,
                conf.dest_dir_arg, s->name);
        DSS_NOTICE_LOG("executing %s\n", cmd);
        return ret;
  }
  
 -static void kill_process(pid_t pid)
 +static void dss_kill(pid_t pid, int sig, const char *msg)
  {
 -      if (!pid)
 +      const char *signame, *process_name;
 +
 +      if (pid == 0)
 +              return;
 +      switch (sig) {
 +      case SIGTERM: signame = "TERM"; break;
 +      case SIGSTOP: signame = "STOP"; break;
 +      case SIGCONT: signame = "CONT"; break;
 +      default: signame = "????";
 +      }
 +
 +      if (pid == create_pid)
 +              process_name = "create";
 +      else if (pid == remove_pid)
 +              process_name = "remove";
 +      else process_name = "??????";
 +
 +      if (msg)
 +              DSS_INFO_LOG("%s\n", msg);
 +      DSS_DEBUG_LOG("sending signal %d (%s) to pid %d (%s process)\n",
 +              sig, signame, (int)pid, process_name);
 +      if (kill(pid, sig) >= 0)
                return;
 -      DSS_WARNING_LOG("sending SIGTERM to pid %d\n", (int)pid);
 -      kill(pid, SIGTERM);
 +      DSS_INFO_LOG("failed to send signal %d (%s) to pid %d (%s process)\n",
 +              sig, signame, (int)pid, process_name);
  }
  
  static void stop_create_process(void)
  {
 -      if (!create_pid || create_process_stopped)
 +      if (create_process_stopped)
                return;
 -      DSS_INFO_LOG("suspending create process %d\n", (int)create_pid);
 -      kill(SIGSTOP, create_pid);
 +      dss_kill(create_pid, SIGSTOP, "suspending create process");
        create_process_stopped = 1;
  }
  
  static void restart_create_process(void)
  {
 -      if (!create_pid || !create_process_stopped)
 +      if (!create_process_stopped)
                return;
 -      DSS_INFO_LOG("resuming create process %d\n", (int)create_pid);
 -      kill (SIGCONT, create_pid);
 +      dss_kill(create_pid, SIGCONT, "resuming create process");
        create_process_stopped = 0;
  }
  
@@@ -627,7 -591,8 +610,7 @@@ static int wait_for_process(pid_t pid, 
                        }
                }
                /* SIGINT or SIGTERM */
 -              DSS_WARNING_LOG("sending SIGTERM to pid %d\n", (int)pid);
 -              kill(pid, SIGTERM);
 +              dss_kill(pid, SIGTERM, "killing child process");
        }
        if (ret < 0)
                DSS_ERROR_LOG("failed to wait for process %d\n", (int)pid);
@@@ -657,10 -622,7 +640,7 @@@ static int handle_rm_exit(int status
                snapshot_removal_status = HS_READY;
                return -E_BAD_EXIT_CODE;
        }
-       if (conf.post_remove_hook_given)
-               snapshot_removal_status = HS_SUCCESS;
-       else
-               snapshot_removal_status = HS_READY;
+       snapshot_removal_status = HS_SUCCESS;
        return 1;
  }
  
@@@ -956,8 -918,8 +936,8 @@@ static int handle_signal(void
        case SIGINT:
        case SIGTERM:
                restart_create_process();
 -              kill_process(create_pid);
 -              kill_process(remove_pid);
 +              dss_kill(create_pid, SIGTERM, NULL);
 +              dss_kill(remove_pid, SIGTERM, NULL);
                ret = -E_SIGNAL;
                break;
        case SIGHUP:
@@@ -1144,10 -1106,7 +1124,10 @@@ static int select_loop(void
                                free_rsync_argv(rsync_argv);
                                create_rsync_argv(&rsync_argv, &current_snapshot_creation_time);
                        }
 -                      /* fall through */
 +                      ret = create_snapshot(rsync_argv);
 +                      if (ret < 0)
 +                              goto out;
 +                      continue;
                case HS_NEEDS_RESTART:
                        if (!next_snapshot_is_due())
                                continue;
@@@ -1172,8 -1131,6 +1152,6 @@@ static void exit_hook(int exit_code
        char *argv[] = {conf.exit_hook_arg, dss_strerror(-exit_code), NULL};
        pid_t pid;
  
-       if (!conf.exit_hook_given)
-               return;
        DSS_NOTICE_LOG("executing %s %s\n", argv[0], argv[1]);
        dss_exec(&pid, conf.exit_hook_arg, argv, fds);
  }