diff --git a/include/proc_parse.h b/include/proc_parse.h index d23e95689..276a0de48 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 6cfacf2dc..6c04f0044 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) {