aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/mds.c40
1 files changed, 30 insertions, 10 deletions
diff --git a/src/mds.c b/src/mds.c
index 4f245f7..8387162 100644
--- a/src/mds.c
+++ b/src/mds.c
@@ -45,6 +45,11 @@ static int argc;
*/
static char** argv;
+/**
+ * The master server
+ */
+static const char* master_server = LIBEXECDIR "/mds-master";
+
/**
* Entry point of the program
@@ -56,12 +61,14 @@ static char** argv;
int main(int argc_, char** argv_)
{
int fd = -1;
+ int got_master_server = 0;
struct sockaddr_un address;
char pathname[PATH_MAX];
char piddata[64];
unsigned int display;
FILE *f;
int rc;
+ int j;
argc = argc_;
@@ -77,6 +84,22 @@ int main(int argc_, char** argv_)
return 1;
}
+ /* Parse command line arguments. */
+ for (j = 1; j < argc; j++)
+ {
+ char* arg = argv[j];
+ if (strstr(arg, "--master-server=") == arg) /* Master server. */
+ {
+ if (got_master_server)
+ {
+ fprintf(stderr, "%s: duplicate declaration of %s.\n", *argv, "--master-server");
+ return 1;
+ }
+ got_master_server = 1;
+ master_server = arg + strlen("--master-server=");
+ }
+ }
+
/* Stymied if the effective user is not root. */
if (geteuid() != ROOT_USER_UID)
{
@@ -240,7 +263,7 @@ int main(int argc_, char** argv_)
unlink_recursive(pathname); /* An error will be printed on error, do nothing more. */
return rc;
-
+
fail:
rc = 1;
goto done;
@@ -258,7 +281,6 @@ int spawn_and_respawn_server(int fd)
struct timespec time_start;
struct timespec time_end;
char* child_args[ARGC_LIMIT + LIBEXEC_ARGC_EXTRA_LIMIT + 1];
- char pathname[PATH_MAX];
char fdstr[12 /* strlen("--socket-fd=") */ + 64];
int i;
pid_t pid;
@@ -266,12 +288,9 @@ int spawn_and_respawn_server(int fd)
int time_error = 0;
int first_spawn = 1;
- snprintf(pathname, sizeof(pathname) / sizeof(char), "%s/mds-master", LIBEXECDIR);
- child_args[0] = pathname;
-
+ child_args[0] = strdup(master_server);
for (i = 1; i < argc; i++)
child_args[i] = argv[i];
-
child_args[argc + 0] = strdup("--initial-spawn");
snprintf(fdstr, sizeof(fdstr) / sizeof(char), "--socket-fd=%i", fd);
child_args[argc + 1] = fdstr;
@@ -317,18 +336,18 @@ int spawn_and_respawn_server(int fd)
perror(*argv);
fprintf(stderr,
"%s: %s died abnormally, not respoawning because we could not read the time.\n",
- *argv, pathname);
+ *argv, master_server);
return 1;
}
/* Respawn if the server did not die too fast. */
if (time_end.tv_sec - time_start.tv_sec < RESPAWN_TIME_LIMIT_SECONDS)
- fprintf(stderr, "%s: %s died abnormally, respawning.\n", *argv, pathname);
+ fprintf(stderr, "%s: %s died abnormally, respawning.\n", *argv, master_server);
else
{
fprintf(stderr,
"%s: %s died abnormally, died too fast, not respawning.\n",
- *argv, pathname);
+ *argv, master_server);
return 1;
}
@@ -342,12 +361,13 @@ int spawn_and_respawn_server(int fd)
else
{
/* Start master server. */
- execv(pathname, child_args);
+ execv(master_server, child_args);
perror(*argv);
return 1;
}
}
+ free(child_args[0]);
free(child_args[argc + 0]);
free(child_args[argc + 1]);
return 0;