So far, virCommandMassCloseGetFDsLinux() opens "/proc/self/fd",
iterates over it marking opened FDs in @fds bitmap. Well, we can
do the same on other systems (with altered path), like MacOS or
FreeBSD. Therefore, isolate dir iteration into a separate
function that accepts dir path as an argument.
Unfortunately, this function might be unused on some systems
(e.g. mingw), therefore mark it as such.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/util/vircommand.c | 31 +++++++++++++------------------
1 file changed, 13 insertions(+), 18 deletions(-)
diff --git a/src/util/vircommand.c b/src/util/vircommand.c
index 60d419a695..822b9487f9 100644
--- a/src/util/vircommand.c
+++ b/src/util/vircommand.c
@@ -479,17 +479,12 @@ virExecCommon(virCommand *cmd, gid_t *groups, int ngroups)
return 0;
}
-# ifdef __linux__
-/* On Linux, we can utilize procfs and read the table of opened
- * FDs and selectively close only those FDs we don't want to pass
- * onto child process (well, the one we will exec soon since this
- * is called from the child). */
-static int
-virCommandMassCloseGetFDsLinux(virBitmap *fds)
+static int G_GNUC_UNUSED
+virCommandMassCloseGetFDsDir(virBitmap *fds,
+ const char *dirName)
{
g_autoptr(DIR) dp = NULL;
struct dirent *entry;
- const char *dirName = "/proc/self/fd";
int rc;
if (virDirOpen(&dp, dirName) < 0)
@@ -514,15 +509,20 @@ virCommandMassCloseGetFDsLinux(virBitmap *fds)
return 0;
}
-# else /* !__linux__ */
-
static int
-virCommandMassCloseGetFDsGeneric(virBitmap *fds)
+virCommandMassCloseGetFDs(virBitmap *fds)
{
+# ifdef __linux__
+ /* On Linux, we can utilize procfs and read the table of opened
+ * FDs and selectively close only those FDs we don't want to pass
+ * onto child process (well, the one we will exec soon since this
+ * is called from the child). */
+ return virCommandMassCloseGetFDsDir(fds, "/proc/self/fd");
+# else
virBitmapSetAll(fds);
return 0;
+# endif
}
-# endif /* !__linux__ */
static int
virCommandMassCloseFrom(virCommand *cmd,
@@ -551,13 +551,8 @@ virCommandMassCloseFrom(virCommand *cmd,
fds = virBitmapNew(openmax);
-# ifdef __linux__
- if (virCommandMassCloseGetFDsLinux(fds) < 0)
+ if (virCommandMassCloseGetFDs(fds) < 0)
return -1;
-# else
- if (virCommandMassCloseGetFDsGeneric(fds) < 0)
- return -1;
-# endif
lastfd = MAX(lastfd, childin);
lastfd = MAX(lastfd, childout);
--
2.41.0