sigprocmask(SIG_UNBLOCK, NULL, &set);
sigdelset(&set, SIGUSR1);
- sigdelset(&set, SIGHUP);
- sigdelset(&set, SIGALRM);
sigdelset(&set, SIGTERM);
do {
read_sock(container);
- if (socket_hup_requested) {
- /* Try to create pid file and socket in
- * main or alternate RUN directory.
- */
- char *dir = VAR_RUN;
- if (mkdir(dir, 0600) < 0 && errno != EEXIST) {
- char *dir = ALT_RUN;
- if (mkdir(dir, 0600) < 0 && errno != EEXIST)
- dir = NULL;
- }
- if (dir && !sigterm &&
- (container->sock < 0 ||
- strcmp(dir, pid_dir) != 0)) {
- close(container->sock);
- remove_pidfile(container->devname);
- pid_dir = dir;
- container->sock = make_control_sock(container->devname);
- make_pidfile(container->devname);
- }
- socket_hup_requested = 0;
- }
- if (container->sock < 0)
- alarm(30);
-
free_mdstat(mdstat);
}
remove_old();
return NULL;
}
-int make_pidfile(char *devname)
+static int make_pidfile(char *devname)
{
char path[100];
char pid[10];
rmdir(pid_dir);
}
-int make_control_sock(char *devname)
+static int make_control_sock(char *devname)
{
char path[100];
int sfd;
return sfd;
}
-int socket_hup_requested;
-static void hup(int sig)
-{
- socket_hup_requested = 1;
-}
-
static void term(int sig)
{
sigterm = 1;
*/
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);
if (takeover) {
+ pid_dir = VAR_RUN;
victim = mdmon_pid(container->devnum);
- victim_sock = connect_monitor(container->devname);
+ if (victim < 0) {
+ pid_dir = ALT_RUN;
+ victim = mdmon_pid(container->devnum);
+ }
+ if (victim >= 0)
+ victim_sock = connect_monitor(container->devname);
}
ignore = chdir("/");
/* Ok, this is close enough. We can say goodbye to our parent now.
*/
+ if (victim > 0)
+ remove_pidfile(devname);
+ if (mkdir(VAR_RUN, 0600) >= 0 || errno == EEXIST)
+ pid_dir = VAR_RUN;
+ else if (mkdir(ALT_RUN, 0600) >= 0 || errno == EEXIST)
+ pid_dir = ALT_RUN;
+ else {
+ fprintf(stderr, "mdmon: Neither %s nor %s are writable\n"
+ " cannot create .pid or .sock files. Aborting\n",
+ VAR_RUN, ALT_RUN);
+ exit(3);
+ }
+ if (make_pidfile(devname) < 0) {
+ fprintf(stderr, "mdmon: Cannot create pid file in %s - aborting.\n",
+ pid_dir);
+ exit(3);
+ }
+ container->sock = make_control_sock(devname);
+
status = 0;
if (write(pfd[1], &status, sizeof(status)) < 0)
fprintf(stderr, "mdmon: failed to notify our parent: %d\n",
exit(2);
}
- if (victim > -1) {
+ if (victim > 0) {
try_kill_monitor(victim, container->devname, victim_sock);
close(victim_sock);
}