X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=blobdiff_plain;f=util.c;h=fe46f3b02d9c20a58079e0f70f8b48d41308d1e5;hp=0c1dfeebfa94ca96b56ee3a1e2fb6d5226fd38af;hb=44d2e36556921e82a9fde02b554f799741c92531;hpb=77472ff8d0a7e72b2da72c05dbbe1bf1adc0f2ca diff --git a/util.c b/util.c index 0c1dfeeb..fe46f3b0 100644 --- a/util.c +++ b/util.c @@ -1074,6 +1074,64 @@ int signal_mdmon(int devnum) return 0; } +int start_mdmon(int devnum) +{ + int i; + int len; + char pathbuf[1024]; + char *paths[4] = { + pathbuf, + "/sbin/mdmon", + "mdmon", + NULL + }; + + if (env_no_mdmon()) + return 0; + + len = readlink("/proc/self/exe", pathbuf, sizeof(pathbuf)); + if (len > 0) { + char *sl; + pathbuf[len] = 0; + sl = strrchr(pathbuf, '/'); + if (sl) + sl++; + else + sl = pathbuf; + strcpy(sl, "mdmon"); + } else + pathbuf[0] = '\0'; + + switch(fork()) { + case 0: + /* FIXME yuk. CLOSE_EXEC?? */ + for (i=3; i < 100; i++) + close(i); + for (i=0; paths[i]; i++) + if (paths[i][0]) + execl(paths[i], "mdmon", + map_dev(dev2major(devnum), + dev2minor(devnum), + 1), NULL); + exit(1); + case -1: fprintf(stderr, Name ": cannot run mdmon. " + "Array remains readonly\n"); + return -1; + default: ; /* parent - good */ + } + return 0; +} + +int env_no_mdmon(void) +{ + char *val = getenv("MDADM_NO_MDMON"); + + if (val && atoi(val) == 1) + return 1; + + return 0; +} + int flush_metadata_updates(struct supertype *st) {