]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - mdmon.c
mdmon: terminate clean
[thirdparty/mdadm.git] / mdmon.c
diff --git a/mdmon.c b/mdmon.c
index 3f5edbba78574db6efb5e4ff6cb602106ac35983..7ef0c80f5b38568c7f1ecfda04fe0bcd79bb4ed5 100644 (file)
--- a/mdmon.c
+++ b/mdmon.c
@@ -49,6 +49,8 @@ struct active_array *pending_discard;
 
 int mon_tid, mgr_tid;
 
+int sigterm;
+
 int run_child(void *v)
 {
        struct supertype *c = v;
@@ -87,6 +89,9 @@ int make_pidfile(char *devname, int o_excl)
        int fd;
        int n;
 
+       if (sigterm)
+               return -1;
+
        sprintf(path, "/var/run/mdadm/%s.pid", devname);
 
        fd = open(path, O_RDWR|O_CREAT|o_excl, 0600);
@@ -138,6 +143,9 @@ void remove_pidfile(char *devname)
 {
        char buf[100];
 
+       if (sigterm)
+               return;
+
        sprintf(buf, "/var/run/mdadm/%s.pid", devname);
        unlink(buf);
        sprintf(buf, "/var/run/mdadm/%s.sock", devname);
@@ -151,6 +159,9 @@ int make_control_sock(char *devname)
        long fl;
        struct sockaddr_un addr;
 
+       if (sigterm)
+               return -1;
+
        sprintf(path, "/var/run/mdadm/%s.sock", devname);
        unlink(path);
        sfd = socket(PF_LOCAL, SOCK_STREAM, 0);
@@ -176,6 +187,11 @@ static void hup(int sig)
        socket_hup_requested = 1;
 }
 
+static void term(int sig)
+{
+       sigterm = 1;
+}
+
 static void wake_me(int sig)
 {
 
@@ -282,8 +298,6 @@ int main(int argc, char *argv[])
        }
 
        container->sock = make_control_sock(container->devname);
-       if (container->sock < 0)
-               fprintf(stderr, "mdmon: Cannot create socket in /var/run/mdadm\n");
        container->arrays = NULL;
 
        mdi = sysfs_read(mdfd, container->devnum,
@@ -356,12 +370,17 @@ int main(int argc, char *argv[])
        sigemptyset(&set);
        sigaddset(&set, SIGUSR1);
        sigaddset(&set, SIGHUP);
+       sigaddset(&set, SIGALRM);
+       sigaddset(&set, SIGTERM);
        sigprocmask(SIG_BLOCK, &set, NULL);
        act.sa_handler = wake_me;
        act.sa_flags = 0;
        sigaction(SIGUSR1, &act, NULL);
+       sigaction(SIGALRM, &act, NULL);
        act.sa_handler = hup;
        sigaction(SIGHUP, &act, NULL);
+       act.sa_handler = term;
+       sigaction(SIGTERM, &act, NULL);
        act.sa_handler = SIG_IGN;
        sigaction(SIGPIPE, &act, NULL);