mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-01-24 04:56:14 +01:00
Check for sys/resource.h
2007-10-16 Matthias Clasen <mclasen@redhat.com> * configure.in: Check for sys/resource.h * glib/gspawn.c: Improve the fdwalk implementation on Linux to only walk over actually open file descriptors. (#469231, Lennart Poettering) svn path=/trunk/; revision=5783
This commit is contained in:
parent
c7be446704
commit
a57cf3893c
@ -1,3 +1,11 @@
|
|||||||
|
2007-10-16 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
|
* configure.in: Check for sys/resource.h
|
||||||
|
|
||||||
|
* glib/gspawn.c: Improve the fdwalk implementation on Linux
|
||||||
|
to only walk over actually open file descriptors. (#469231,
|
||||||
|
Lennart Poettering)
|
||||||
|
|
||||||
2007-10-13 Sven Herzberg <herzi@gnome-de.org>
|
2007-10-13 Sven Herzberg <herzi@gnome-de.org>
|
||||||
|
|
||||||
Reviewed by Tim Janik.
|
Reviewed by Tim Janik.
|
||||||
|
@ -31,11 +31,16 @@
|
|||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h> /* for fdwalk */
|
#include <stdlib.h> /* for fdwalk */
|
||||||
|
#include <dirent.h>
|
||||||
|
|
||||||
#ifdef HAVE_SYS_SELECT_H
|
#ifdef HAVE_SYS_SELECT_H
|
||||||
#include <sys/select.h>
|
#include <sys/select.h>
|
||||||
#endif /* HAVE_SYS_SELECT_H */
|
#endif /* HAVE_SYS_SELECT_H */
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_RESOURCE_H
|
||||||
|
#include <sys/resource.h>
|
||||||
|
#endif /* HAVE_SYS_RESOURCE_H */
|
||||||
|
|
||||||
#include "glib.h"
|
#include "glib.h"
|
||||||
#include "glibintl.h"
|
#include "glibintl.h"
|
||||||
#include "galias.h"
|
#include "galias.h"
|
||||||
@ -884,12 +889,62 @@ fdwalk (int (*cb)(void *data, int fd), void *data)
|
|||||||
{
|
{
|
||||||
gint open_max;
|
gint open_max;
|
||||||
gint fd;
|
gint fd;
|
||||||
gint res;
|
gint res = 0;
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_RESOURCE_H
|
||||||
|
struct rlimit rl;
|
||||||
|
#endif
|
||||||
|
|
||||||
res = 0;
|
#ifdef __linux__
|
||||||
open_max = sysconf (_SC_OPEN_MAX);
|
DIR *d;
|
||||||
for (fd = 0; fd < open_max && res == 0; fd++)
|
|
||||||
res = cb (data, fd);
|
if ((d = opendir("/proc/self/fd"))) {
|
||||||
|
struct dirent *de;
|
||||||
|
|
||||||
|
while ((de = readdir(d))) {
|
||||||
|
glong l;
|
||||||
|
gchar *e = NULL;
|
||||||
|
|
||||||
|
if (de->d_name[0] == '.')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
l = strtol(de->d_name, &e, 10);
|
||||||
|
if (errno != 0 || !e || *e)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
fd = (gint) l;
|
||||||
|
|
||||||
|
if ((glong) fd != l)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (fd == dirfd(d))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if ((res = cb (data, fd)) != 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
closedir(d);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If /proc is not mounted or not accessible we fall back to the old
|
||||||
|
* rlimit trick */
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_RESOURCE_H
|
||||||
|
|
||||||
|
if (getrlimit(RLIMIT_NOFILE, &rl) == 0)
|
||||||
|
open_max = rl.rlim_max;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
open_max = sysconf (_SC_OPEN_MAX);
|
||||||
|
|
||||||
|
for (fd = 0; fd < open_max; fd++)
|
||||||
|
if ((res = cb (data, fd)) != 0)
|
||||||
|
break;
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user