aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/config.h8
-rw-r--r--src/mds-server.c26
2 files changed, 32 insertions, 2 deletions
diff --git a/src/config.h b/src/config.h
index 09c3210..174fe30 100644
--- a/src/config.h
+++ b/src/config.h
@@ -126,6 +126,14 @@
/**
+ * The path to the directory with symlinks to each file that is open
+ */
+#ifndef SELF_FD
+#define SELF_FD "/proc/self/fd"
+#endif
+
+
+/**
* Pattern for the names of shared object to which states are marshalled
*/
#ifndef SHM_PATH_PATTERN
diff --git a/src/mds-server.c b/src/mds-server.c
index 826e0d2..cb2bfc2 100644
--- a/src/mds-server.c
+++ b/src/mds-server.c
@@ -39,6 +39,8 @@
#include <sys/mman.h>
#include <fcntl.h>
#include <sys/stat.h>
+#include <sys/types.h>
+#include <dirent.h>
@@ -283,11 +285,31 @@ int main(int argc_, char** argv_)
}
if (r < 0)
{
- /* TODO: close all sockets we do not know what they are. */
+ /* Close all files (hopefully sockets) we do not know what they are. */
+ DIR* dir = opendir(SELF_FD);
+ struct dirent* file;
+
+ if (dir == NULL)
+ {
+ perror(*argv); /* Well, that is just unfortunate, but we cannot really do anything. */
+ closedir(dir);
+ goto unmarshal_double_fail;
+ }
+
+ while ((file = readdir(dir)) != NULL)
+ if (strcmp(file->d_name, ".") && strcmp(file->d_name, ".."))
+ {
+ int fd = atoi(file->d_name);
+ if ((fd > 2) && (fd != socket_fd) &&
+ (fd_table_contains_key(&client_map, fd) == 0))
+ close(fd);
+ }
+
+ closedir(dir);
}
}
-
+ unmarshal_double_fail:
/* Accepting incoming connections. */
while (running && (reexecing == 0))
{