summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2021-03-19 14:01:25 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2021-03-19 14:01:25 +0000
commitf5aa016d77fbff5d856f0c495118a3b57b0ad2f9 (patch)
tree03101c6431775f4c1b6d7b8b7030372d90fa63bb
parente79bcd1505f1f11fe87ff706a038223f76e97326 (diff)
downloads6-linux-init-f5aa016d77fbff5d856f0c495118a3b57b0ad2f9.tar.xz
shutdownd: unsupervise even when rename() fails
-rw-r--r--.gitignore1
-rw-r--r--src/shutdown/s6-linux-init-shutdownd.c15
2 files changed, 8 insertions, 8 deletions
diff --git a/.gitignore b/.gitignore
index 7fab165..8f684cb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,3 +14,4 @@
/s6-linux-init-echo
/s6-linux-init-umountall
/s6-linux-init-maker
+/s6-linux-init-nuke
diff --git a/src/shutdown/s6-linux-init-shutdownd.c b/src/shutdown/s6-linux-init-shutdownd.c
index 76e1540..16e0780 100644
--- a/src/shutdown/s6-linux-init-shutdownd.c
+++ b/src/shutdown/s6-linux-init-shutdownd.c
@@ -71,7 +71,7 @@ static int mkrenametemp (int fd, char const *src, char *dst)
return mkfiletemp(dst, &renametemp, 0700, &at) ;
}
-static inline void run_stage3 (char const *basedir, char const *const *envp)
+static inline void run_stage3 (char const *basedir)
{
pid_t pid ;
size_t basedirlen = strlen(basedir) ;
@@ -79,7 +79,7 @@ static inline void run_stage3 (char const *basedir, char const *const *envp)
char const *stage3_argv[2] = { stage3, 0 } ;
memcpy(stage3, basedir, basedirlen) ;
memcpy(stage3 + basedirlen, "/scripts/" STAGE3, sizeof("/scripts/" STAGE3)) ;
- pid = child_spawn0(stage3_argv[0], stage3_argv, envp) ;
+ pid = child_spawn0(stage3_argv[0], stage3_argv, (char const *const *)environ) ;
if (pid)
{
int wstat ;
@@ -244,8 +244,7 @@ static inline void unsupervise_tree (void)
unlinkat(fdd, d->d_name, 0) ;
/* if it still fails, too bad, it will restart in stage 4 and race */
}
- else
- s6_svc_writectl(fn, S6_SUPERVISE_CTLDIR, "dx", 2) ;
+ s6_svc_writectl(fn, S6_SUPERVISE_CTLDIR, "dx", 2) ;
}
}
if (errno)
@@ -253,7 +252,7 @@ static inline void unsupervise_tree (void)
dir_close(dir) ;
}
-int main (int argc, char const *const *argv, char const *const *envp)
+int main (int argc, char const *const *argv)
{
unsigned int grace_time = 3000 ;
tain_t deadline ;
@@ -296,13 +295,13 @@ int main (int argc, char const *const *argv, char const *const *envp)
fd[1] = fcntl(2, F_DUPFD_CLOEXEC, 0) ;
if (fd[1] < 0) strerr_diefu2sys(111, "dup std", "err") ;
restore_console() ;
- execve(stage4_argv[0], (char **)stage4_argv, (char *const *)envp) ;
+ execv(stage4_argv[0], (char **)stage4_argv) ;
e = errno ;
if (fd_move2(1, fd[0], 2, fd[1]) < 0) strerr_warnwu1sys("restore fds") ;
errno = e ;
}
else
- execve(stage4_argv[0], (char **)stage4_argv, (char *const *)envp) ;
+ execv(stage4_argv[0], (char **)stage4_argv) ;
if (errno != ENOENT)
strerr_warnwu2sys("exec ", stage4_argv[0]) ;
}
@@ -326,7 +325,7 @@ int main (int argc, char const *const *argv, char const *const *envp)
if (r == -1) strerr_diefu1sys(111, "iopause") ;
if (!r)
{
- run_stage3(basedir, envp) ;
+ run_stage3(basedir) ;
tain_now_g() ;
if (what != 'S') break ;
tain_add_g(&deadline, &tain_infinite_relative) ;