/* * Reads /proc/self/psinfo such that it can be tested whether Valgrind * intercepts the system calls that access this pseudo-file. */ #include <fcntl.h> #include <limits.h> #include <procfs.h> #include <stdio.h> #include <unistd.h> static void test_psinfo(int op, const char *label, const char *path) { int fd; if (op == 0) { printf("open for %s:\n", label); fd = open(path, O_RDONLY); if (fd < 0) { perror("open"); return; } } else { printf("openat for %s:\n", label); fd = openat(AT_FDCWD, path, O_RDONLY); if (fd < 0) { perror("openat"); return; } } psinfo_t psinfo; ssize_t bytes = read(fd, &psinfo, sizeof(psinfo)); if (bytes != sizeof(psinfo)) { perror("read"); return; } printf("fname: %s\n", psinfo.pr_fname); printf("psargs: %s\n", psinfo.pr_psargs); printf("argc: %d\n", psinfo.pr_argc); unsigned int i; char **argv = (char **) psinfo.pr_argv; for (i = 0; i < psinfo.pr_argc; i++) { printf("argv[%u]: %s\n", i, argv[i]); } close(fd); } int main(int argc, const char *argv[]) { char path[PATH_MAX]; snprintf(path, sizeof(path), "/proc/%ld/psinfo", (long int) getpid()); test_psinfo(0, "/proc/self/psinfo", "/proc/self/psinfo"); printf("\n"); test_psinfo(0, "/proc/<pid>/psinfo", path); printf("\n"); test_psinfo(1, "/proc/self/psinfo", "/proc/self/psinfo"); printf("\n"); test_psinfo(1, "/proc/<pid>/psinfo", path); return 0; }