]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
virfile: Introduce virCloseFrom()
authorMichal Privoznik <mprivozn@redhat.com>
Mon, 21 Aug 2023 13:10:25 +0000 (15:10 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Thu, 24 Aug 2023 10:42:45 +0000 (12:42 +0200)
It is handy to close all FDs from given FD to infinity. On
FreeBSD the libc even has a function for that: closefrom(). It
was ported to glibc too, but not musl. At least glibc
implementation falls back to calling:

  close_range(from, ~0U, 0);

Now that we have a wrapper for close_range() we implement
closefrom() trivially.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Reviewed-by: Kristina Hanicova <khanicov@redhat.com>
src/libvirt_private.syms
src/util/virfile.c
src/util/virfile.h

index 418e049227cf08b231649460d1404432753e0f07..00cf32d49e846187d8456888c6f3bae93cf6221b 100644 (file)
@@ -2275,6 +2275,7 @@ saferead;
 safewrite;
 safezero;
 virBuildPathInternal;
+virCloseFrom;
 virCloseRange;
 virCloseRangeInit;
 virCloseRangeIsSupported;
index e84af93c8de581828ae8657bdc24c4a77ad60c79..0600e4a172494c3504ac6ec45cb86c4b47ee683b 100644 (file)
@@ -265,6 +265,27 @@ virCloseRangeIsSupported(void)
 }
 
 
+/**
+ * virCloseFrom:
+ *
+ * Closes all open file descriptors greater than or equal to @fromfd.
+ *
+ * Returns: 0 on success,
+ *         -1 on error (with errno set).
+ */
+int
+virCloseFrom(int fromfd)
+{
+#ifdef __FreeBSD__
+    /* FreeBSD has closefrom() since FreeBSD-8.0, i.e. since 2009. */
+    closefrom(fromfd);
+    return 0;
+#else /* !__FreeBSD__ */
+    return virCloseRange(fromfd, ~0U);
+#endif /* !__FreeBSD__ */
+}
+
+
 /**
  * virFileDirectFdFlag:
  *
index be0b02fdf08699581a49554fb90fd0526b4085df..adc032ba3384b97943db1ce6b10310b542c1890a 100644 (file)
@@ -64,6 +64,7 @@ static inline void virForceCloseHelper(int *fd)
 int virCloseRange(unsigned int from, unsigned int to);
 int virCloseRangeInit(void);
 bool virCloseRangeIsSupported(void);
+int virCloseFrom(int fromfd);
 
 /* For use on normal paths; caller must check return value,
    and failure sets errno per close. */