[CRIU] [PATCH 1/7] proc-parse: Parse pid's fdinfo entries

Pavel Emelyanov xemul at parallels.com
Thu Jan 30 02:23:27 PST 2014


The existing code opens "self" and parses what's in there,
just twist the code a little to accept generic pid.

Signed-off-by: Pavel Emelyanov <xemul at parallels.com>
---
 include/proc_parse.h |  2 ++
 proc_parse.c         | 21 ++++++++++++++++++---
 2 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/include/proc_parse.h b/include/proc_parse.h
index d23e956..276a0de 100644
--- a/include/proc_parse.h
+++ b/include/proc_parse.h
@@ -154,6 +154,8 @@ union fdinfo_entries {
 
 extern int parse_fdinfo(int fd, int type,
 		int (*cb)(union fdinfo_entries *e, void *arg), void *arg);
+extern int parse_fdinfo_pid(int pid, int fd, int type,
+		int (*cb)(union fdinfo_entries *e, void *arg), void *arg);
 extern int parse_cpuinfo_features(int (*handler)(char *tok));
 extern int parse_file_locks(void);
 
diff --git a/proc_parse.c b/proc_parse.c
index 6cfacf2..6c04f00 100644
--- a/proc_parse.c
+++ b/proc_parse.c
@@ -880,7 +880,7 @@ static void parse_fhandle_encoded(char *tok, FhEntry *fh)
 
 #define fdinfo_field(str, field)	!strncmp(str, field":", sizeof(field))
 
-int parse_fdinfo(int fd, int type,
+static int parse_fdinfo_pid_s(char *pid, int fd, int type,
 		int (*cb)(union fdinfo_entries *e, void *arg), void *arg)
 {
 	FILE *f;
@@ -888,10 +888,10 @@ int parse_fdinfo(int fd, int type,
 	bool entry_met = false;
 	int ret = -1;
 
-	sprintf(str, "/proc/self/fdinfo/%d", fd);
+	sprintf(str, "/proc/%s/fdinfo/%d", pid, fd);
 	f = fopen(str, "r");
 	if (!f) {
-		pr_perror("Can't open fdinfo to parse");
+		pr_perror("Can't open %s to parse", str);
 		return -1;
 	}
 
@@ -1084,6 +1084,21 @@ out:
 	return ret;
 }
 
+int parse_fdinfo_pid(int pid, int fd, int type,
+		int (*cb)(union fdinfo_entries *e, void *arg), void *arg)
+{
+	char pid_s[10];
+
+	sprintf(pid_s, "%d", pid);
+	return parse_fdinfo_pid_s(pid_s, fd, type, cb, arg);
+}
+
+int parse_fdinfo(int fd, int type,
+		int (*cb)(union fdinfo_entries *e, void *arg), void *arg)
+{
+	return parse_fdinfo_pid_s("self", fd, type, cb, arg);
+}
+
 static int parse_file_lock_buf(char *buf, struct file_lock *fl,
 				bool is_blocked)
 {
-- 
1.8.4.2


More information about the CRIU mailing list