]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - mdmon.c
Create.c: fix uclibc build
[thirdparty/mdadm.git] / mdmon.c
diff --git a/mdmon.c b/mdmon.c
index 60ba318253b995ad0a22b9948523d43fa1800b8f..5fdb5cdb5a495eb5fa59329394857e703f34601c 100644 (file)
--- a/mdmon.c
+++ b/mdmon.c
@@ -240,7 +240,7 @@ static int make_control_sock(char *devname)
                return -1;
 
        addr.sun_family = PF_LOCAL;
-       strcpy(addr.sun_path, path);
+       snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", path);
        umask(077); /* ensure no world write access */
        if (bind(sfd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
                close(sfd);
@@ -302,12 +302,12 @@ static int mdmon(char *devnm, int must_fork, int takeover);
 int main(int argc, char *argv[])
 {
        char *container_name = NULL;
-       char *devnm = NULL;
        int status = 0;
        int opt;
        int all = 0;
        int takeover = 0;
        int dofork = 1;
+       int mdfd = -1;
        bool help = false;
        static struct option options[] = {
                {"all", 0, NULL, 'a'},
@@ -318,6 +318,12 @@ int main(int argc, char *argv[])
                {NULL, 0, NULL, 0}
        };
 
+       /*
+        * mdmon should never complain due to lack of a platform,
+        * that is mdadm's job if at all.
+        */
+       imsm_set_no_platform(1);
+
        while ((opt = getopt_long(argc, argv, "thaF", options, NULL)) != -1) {
                switch (opt) {
                case 'a':
@@ -352,7 +358,6 @@ int main(int argc, char *argv[])
                }
        }
 
-
        if (in_initrd()) {
                /*
                 * set first char of argv[0] to @. This is used by
@@ -362,12 +367,15 @@ int main(int argc, char *argv[])
                argv[0][0] = '@';
        }
 
-       if (all == 0 && container_name == NULL) {
-               if (argv[optind]) {
-                       container_name = get_md_name(argv[optind]);
-                       if (!container_name)
-                               return 1;
-               }
+       if (!all && argv[optind]) {
+               static const char prefix[] = "initrd/";
+               container_name = argv[optind];
+               if (strncmp(container_name, prefix,
+                           sizeof(prefix) - 1) == 0)
+                       container_name += sizeof(prefix)-1;
+               container_name = get_md_name(container_name);
+               if (!container_name)
+                       return 1;
        }
 
        if (container_name == NULL || argc - optind > 1)
@@ -381,7 +389,7 @@ int main(int argc, char *argv[])
 
        if (all) {
                struct mdstat_ent *mdstat, *e;
-               int container_len = strlen(container_name);
+               int container_len = strnlen(container_name, MD_NAME_MAX);
 
                /* launch an mdmon instance for each container found */
                mdstat = mdstat_read(0, 0);
@@ -402,19 +410,20 @@ int main(int argc, char *argv[])
                free_mdstat(mdstat);
 
                return status;
-       } else {
-               int mdfd = open_mddev(container_name, 0);
-               devnm = fd2devnm(mdfd);
+       }
+
+       mdfd = open_mddev(container_name, 0);
+       if (is_fd_valid(mdfd)) {
+               char *devnm = fd2devnm(mdfd);
 
                close(mdfd);
-       }
 
-       if (!devnm) {
-               pr_err("%s is not a valid md device name\n",
-                       container_name);
-               return 1;
+               if (devnm)
+                       return mdmon(devnm, dofork && do_fork(), takeover);
        }
-       return mdmon(devnm, dofork && do_fork(), takeover);
+
+       pr_err("%s is not a valid md device name\n", container_name);
+       return 1;
 }
 
 static int mdmon(char *devnm, int must_fork, int takeover)
@@ -464,7 +473,7 @@ static int mdmon(char *devnm, int must_fork, int takeover)
                pfd[0] = pfd[1] = -1;
 
        container = xcalloc(1, sizeof(*container));
-       strcpy(container->devnm, devnm);
+       snprintf(container->devnm, MD_NAME_MAX, "%s", devnm);
        container->arrays = NULL;
        container->sock = -1;