From: Krzysztof Kanas <kka...@marvell.com>

The FreeBSD was iterating over non existing procfs entries, where sysctl
could give same information.

Signed-off-by: Krzysztof Kanas <kka...@marvell.com>
---
 app/test/process.h | 51 +++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 50 insertions(+), 1 deletion(-)

diff --git a/app/test/process.h b/app/test/process.h
index 34afac5a1f39..77bf11316355 100644
--- a/app/test/process.h
+++ b/app/test/process.h
@@ -16,6 +16,13 @@
 
 #include <rte_string_fns.h> /* strlcpy */
 
+#ifdef RTE_EXEC_ENV_FREEBSD
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#include <sys/user.h>
+#endif
+
 #ifdef RTE_EXEC_ENV_FREEBSD
 #define self "curproc"
 #define exe "file"
@@ -34,7 +41,49 @@ extern uint16_t flag_for_send_pkts;
 /* close all open file descriptors, check /proc/self/fd to only
  * call close on open fds. Exclude fds 0, 1 and 2
  */
-#ifdef RTE_EXEC_ENV_LINUX
+#ifdef RTE_EXEC_ENV_FREEBSD
+static inline void
+close_files(void)
+{
+       int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_FILEDESC };
+       size_t sysctl_len;
+       void *oldp;
+       int ret;
+
+       mib[3] = getpid();
+       ret = sysctl(mib, 4, NULL, &sysctl_len, NULL, 0);
+       if (ret < 0) {
+               rte_panic("Error sysctl failed %d %d %s\n", ret, errno,
+                         strerror(errno));
+               return;
+       }
+       oldp = malloc(sysctl_len);
+       if (!oldp) {
+               rte_panic("Error malloc failed\n");
+               return;
+       }
+       ret = sysctl(mib, 4, oldp, &sysctl_len, NULL, 0);
+       if (ret < 0) {
+               ret = errno;
+               free(oldp);
+               rte_panic("Error sysctl failed %d %d %s\n", ret, errno,
+                         strerror(errno));
+       }
+       char *curr = oldp, *end = (char *)oldp + sysctl_len;
+       struct kinfo_file *kf_info;
+       while (curr < end) {
+               kf_info = (struct kinfo_file *)curr;
+               if (kf_info->kf_fd <= 2) {
+                       curr += kf_info->kf_structsize;
+                       continue;
+               }
+               close(kf_info->kf_fd);
+               curr += kf_info->kf_structsize;
+       }
+       free(oldp);
+}
+
+#else
 static inline void
 close_files(void)
 {
-- 
2.21.0

Reply via email to