podman
1#include <dirent.h>
2#include <stdio.h>
3#include <stdlib.h>
4#include <unistd.h>
5#include <sys/select.h>
6
7static int open_files_max_fd;
8static fd_set *open_files_set;
9
10int
11is_fd_inherited(int fd)
12{
13if (open_files_set == NULL || fd > open_files_max_fd || fd < 0)
14return 0;
15
16return FD_ISSET(fd % FD_SETSIZE, &(open_files_set[fd / FD_SETSIZE])) ? 1 : 0;
17}
18
19static void __attribute__((constructor)) init()
20{
21/* Store how many FDs were open before the Go runtime kicked in. */
22DIR* d = opendir ("/dev/fd");
23if (d)
24{
25struct dirent *ent;
26size_t size = 0;
27
28for (ent = readdir (d); ent; ent = readdir (d))
29{
30int fd;
31
32if (ent->d_name[0] == '.')
33continue;
34
35fd = atoi (ent->d_name);
36if (fd == dirfd (d)) {
37continue;
38}
39
40if (fd >= size * FD_SETSIZE)
41{
42int i;
43size_t new_size;
44
45new_size = (fd / FD_SETSIZE) + 1;
46open_files_set = realloc (open_files_set, new_size * sizeof (fd_set));
47if (open_files_set == NULL)
48_exit (EXIT_FAILURE);
49
50for (i = size; i < new_size; i++)
51FD_ZERO (&(open_files_set[i]));
52
53size = new_size;
54}
55
56if (fd > open_files_max_fd) {
57open_files_max_fd = fd;
58}
59
60FD_SET (fd % FD_SETSIZE, &(open_files_set[fd / FD_SETSIZE]));
61}
62}
63}
64