[PATCH v2 1/2] util.c: add universal search_fdinfo() function

leedagee leedageea at gmail.com
Sun Mar 26 01:39:45 UTC 2023


search_fdinfo() takes pid, fd and line prefix, reads corresponding
procfs entry and returns a string of the value. The result is allocated
with strdup(), so caller should free it.

Signed-off-by: leedagee <leedageea at gmail.com>
---
 src/util.c | 34 +++++++++++++++++++++++++---------
 1 file changed, 25 insertions(+), 9 deletions(-)

diff --git a/src/util.c b/src/util.c
index 4fe45bf13..f3013ec64 100644
--- a/src/util.c
+++ b/src/util.c
@@ -709,37 +709,53 @@ printdev(struct tcb *tcp, int fd, const char *path, const struct finfo *finfo)
 	return false;
 }
 
-pid_t
-pidfd_get_pid(pid_t pid_of_fd, int fd)
+static char *
+search_fdinfo(pid_t pid_of_fd, int fd, const char *search_pfx,
+	      size_t search_pfx_len)
 {
 	int proc_pid = 0;
 	translate_pid(NULL, pid_of_fd, PT_TID, &proc_pid);
 	if (!proc_pid)
-		return -1;
+		return NULL;
 
 	char fdi_path[sizeof("/proc/%u/fdinfo/%u") + 2 * sizeof(int) * 3];
 	xsprintf(fdi_path, "/proc/%u/fdinfo/%u", proc_pid, fd);
 
 	FILE *f = fopen_stream(fdi_path, "r");
 	if (!f)
-		return -1;
+		return NULL;
 
-	static const char pid_pfx[] = "Pid:\t";
-	char *line = NULL;
+	char *line = NULL, *result = NULL;
 	size_t sz = 0;
-	pid_t pid = -1;
 	while (getline(&line, &sz, f) > 0) {
-		const char *pos = STR_STRIP_PREFIX(line, pid_pfx);
+		const char *pos =
+		  str_strip_prefix_len(line, search_pfx, search_pfx_len);
 		if (pos == line)
 			continue;
 
-		pid = string_to_uint_ex(pos, NULL, INT_MAX, "\n");
+		result = xstrdup(pos);
 		break;
 	}
 
 	free(line);
 	fclose(f);
 
+	return result;
+}
+
+pid_t
+pidfd_get_pid(pid_t pid_of_fd, int fd)
+{
+	static const char pid_pfx[] = "Pid:\t";
+
+	char *result = search_fdinfo(pid_of_fd, fd, pid_pfx, sizeof(pid_pfx) - 1);
+
+	if (result == NULL)
+		return -1;
+
+	pid_t pid = string_to_uint_ex(result, NULL, INT_MAX, "\n");
+
+	free(result);
 	return pid;
 }
 
-- 
2.35.3



More information about the Strace-devel mailing list