summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2008-07-18 16:37:13 +1000
committerNeilBrown <neilb@suse.de>2008-07-18 16:37:13 +1000
commit44d2e36556921e82a9fde02b554f799741c92531 (patch)
tree14e1a1946f422521ea6fe6d290ed20f121dcbd5a
parent8850ee3e1ea01d4ded658fd83002fd93a81d6e99 (diff)
downloadmdadm-44d2e36556921e82a9fde02b554f799741c92531.tar.gz
mdadm-44d2e36556921e82a9fde02b554f799741c92531.tar.xz
mdadm-44d2e36556921e82a9fde02b554f799741c92531.zip
Don't assume that mdmon is in the current directory.
Rather, assume that it is in the same directory from which mdadm was run. If not, then maybe /sbin or current directory. Signed-off-by: Neil Brown <neilb@suse.de>
-rw-r--r--util.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/util.c b/util.c
index da61a0b..fe46f3b 100644
--- a/util.c
+++ b/util.c
@@ -1077,19 +1077,42 @@ int signal_mdmon(int devnum)
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);
- execl("./mdmon", "mdmon",
- map_dev(dev2major(devnum),
- dev2minor(devnum),
- 1), NULL);
+ 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");