diff options
Diffstat (limited to 'src/mds-server.c')
-rw-r--r-- | src/mds-server.c | 26 |
1 files changed, 24 insertions, 2 deletions
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)) { |