Re-create control socket file node if it disappears.
authorDavin McCall <davmac@davmac.org>
Sat, 29 Jun 2019 03:41:38 +0000 (13:41 +1000)
committerDavin McCall <davmac@davmac.org>
Sat, 29 Jun 2019 03:41:38 +0000 (13:41 +1000)
In case something is mounted over /dev (or wherever the control socket
lives) it will become inaccessible. When a starts-rwfs service starts,
check the socket node still exists and if not, close the socket and
re-open.

src/dinit.cc

index a8d00491a1737ff888d4b1fa287a8f33f511cca6..d9e28369a224a41795fa0e67c9e1851889b7d9a3 100644 (file)
@@ -711,6 +711,17 @@ void rootfs_is_rw() noexcept
 // once the socket has been successfully opened, further calls have no effect.
 static void open_control_socket(bool report_ro_failure) noexcept
 {
+    if (control_socket_open) {
+        struct stat stat_buf;
+        if (stat(control_socket_path, &stat_buf) != 0 && errno == ENOENT) {
+            // Looks like our control socket has disappeared from the filesystem. Close our control
+            // socket and re-create it:
+            control_socket_io.deregister(event_loop);
+            close(control_socket_io.get_watched_fd());
+            control_socket_open = false; // now re-open below
+        }
+    }
+
     if (! control_socket_open) {
         const char * saddrname = control_socket_path;
         size_t saddrname_len = strlen(saddrname);