FreeBSD Bugzilla – Attachment 218218 Details for
Bug 236815
[patch] devel/glib20: loops over all possible file descriptors
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
patch
glib20_gspawn.patch (text/plain), 2.04 KB, created by
Ivan Rozhuk
on 2020-09-23 19:39:38 UTC
(
hide
)
Description:
patch
Filename:
MIME Type:
Creator:
Ivan Rozhuk
Created:
2020-09-23 19:39:38 UTC
Size:
2.04 KB
patch
obsolete
>Index: devel/glib20/files/patch-glib_gspawn.c >=================================================================== >--- devel/glib20/files/patch-glib_gspawn.c (nonexistent) >+++ devel/glib20/files/patch-glib_gspawn.c (working copy) >@@ -0,0 +1,81 @@ >+--- glib/gspawn.c 2018-09-21 12:29:23.000000000 +0300 >++++ glib/gspawn.c 2019-07-20 18:05:15.486558000 +0300 >+@@ -51,6 +51,13 @@ >+ #include <sys/syscall.h> /* for syscall and SYS_getdents64 */ >+ #endif >+ >++#ifdef __FreeBSD__ >++#include <sys/param.h> >++#include <sys/sysctl.h> >++#include <sys/user.h> >++#include <sys/file.h> >++#endif >++ >+ #include "gspawn.h" >+ #include "gspawn-private.h" >+ #include "gthread.h" >+@@ -1204,6 +1211,51 @@ >+ } >+ #endif >+ >++#ifdef __FreeBSD__ >++static int >++fdwalk2(int (*func)(void *, int), void *udata, int *ret) { >++ size_t i, bufsz = 0; >++ struct xfile *xfbuf, *xf; >++ int uret = 0, pid_found = 0; >++ int mib[2] = { CTL_KERN, KERN_FILE }; >++ pid_t pid; >++ >++ if (NULL == func) >++ return EINVAL; >++ >++ if (sysctl (mib, nitems(mib), NULL, &bufsz, NULL, 0) == -1) >++ return (errno); >++ bufsz += 65536; >++ xfbuf = alloca (bufsz); >++ if (xfbuf == NULL) >++ return errno; >++ if (sysctl (mib, 2, xfbuf, &bufsz, NULL, 0) == -1) >++ return errno; >++ bufsz /= sizeof(struct xfile); >++ >++ pid = getpid(); >++ for (i = 0; i < bufsz; i++) { >++ xf = &xfbuf[i]; >++ if (pid != xf->xf_pid) { >++ if (pid_found) { >++ return 0; >++ } else { >++ continue; >++ } >++ } >++ pid_found = 1; >++ if (0 > xf->xf_fd) >++ continue; >++ uret = func (udata, xf->xf_fd); >++ if (uret != 0) >++ break; >++ >++ } >++ >++ return 0; >++} >++#endif >++ >+ /* This function is called between fork() and exec() and hence must be >+ * async-signal-safe (see signal-safety(7)). */ >+ static int >+@@ -1228,6 +1280,12 @@ >+ >+ #if 0 && defined(HAVE_SYS_RESOURCE_H) >+ struct rlimit rl; >++#endif >++ >++#ifdef __FreeBSD__ >++ if (fdwalk2(cb, data, &res) == 0) >++ return res; >++ /* If any sysctl/malloc call fails continue with the fall back method */ >+ #endif >+ >+ #ifdef __linux__
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
rozhuk.im
:
maintainer-approval?
Actions:
View
|
Diff
Attachments on
bug 236815
:
205914
|
205931
|
205937
|
207442
|
207479
|
209087
| 218218