1*5de3d401SAlexey Dobriyan /* 2*5de3d401SAlexey Dobriyan * Copyright _ 2018 Alexey Dobriyan <adobriyan@gmail.com> 3*5de3d401SAlexey Dobriyan * 4*5de3d401SAlexey Dobriyan * Permission to use, copy, modify, and distribute this software for any 5*5de3d401SAlexey Dobriyan * purpose with or without fee is hereby granted, provided that the above 6*5de3d401SAlexey Dobriyan * copyright notice and this permission notice appear in all copies. 7*5de3d401SAlexey Dobriyan * 8*5de3d401SAlexey Dobriyan * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9*5de3d401SAlexey Dobriyan * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10*5de3d401SAlexey Dobriyan * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11*5de3d401SAlexey Dobriyan * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12*5de3d401SAlexey Dobriyan * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13*5de3d401SAlexey Dobriyan * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14*5de3d401SAlexey Dobriyan * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15*5de3d401SAlexey Dobriyan */ 16*5de3d401SAlexey Dobriyan /* Test that /proc/loadavg correctly reports last pid in pid namespace. */ 17*5de3d401SAlexey Dobriyan #define _GNU_SOURCE 18*5de3d401SAlexey Dobriyan #include <errno.h> 19*5de3d401SAlexey Dobriyan #include <sched.h> 20*5de3d401SAlexey Dobriyan #include <sys/types.h> 21*5de3d401SAlexey Dobriyan #include <sys/stat.h> 22*5de3d401SAlexey Dobriyan #include <fcntl.h> 23*5de3d401SAlexey Dobriyan #include <unistd.h> 24*5de3d401SAlexey Dobriyan #include <sys/wait.h> 25*5de3d401SAlexey Dobriyan 26*5de3d401SAlexey Dobriyan int main(void) 27*5de3d401SAlexey Dobriyan { 28*5de3d401SAlexey Dobriyan pid_t pid; 29*5de3d401SAlexey Dobriyan int wstatus; 30*5de3d401SAlexey Dobriyan 31*5de3d401SAlexey Dobriyan if (unshare(CLONE_NEWPID) == -1) { 32*5de3d401SAlexey Dobriyan if (errno == ENOSYS || errno == EPERM) 33*5de3d401SAlexey Dobriyan return 2; 34*5de3d401SAlexey Dobriyan return 1; 35*5de3d401SAlexey Dobriyan } 36*5de3d401SAlexey Dobriyan 37*5de3d401SAlexey Dobriyan pid = fork(); 38*5de3d401SAlexey Dobriyan if (pid == -1) 39*5de3d401SAlexey Dobriyan return 1; 40*5de3d401SAlexey Dobriyan if (pid == 0) { 41*5de3d401SAlexey Dobriyan char buf[128], *p; 42*5de3d401SAlexey Dobriyan int fd; 43*5de3d401SAlexey Dobriyan ssize_t rv; 44*5de3d401SAlexey Dobriyan 45*5de3d401SAlexey Dobriyan fd = open("/proc/loadavg" , O_RDONLY); 46*5de3d401SAlexey Dobriyan if (fd == -1) 47*5de3d401SAlexey Dobriyan return 1; 48*5de3d401SAlexey Dobriyan rv = read(fd, buf, sizeof(buf)); 49*5de3d401SAlexey Dobriyan if (rv < 3) 50*5de3d401SAlexey Dobriyan return 1; 51*5de3d401SAlexey Dobriyan p = buf + rv; 52*5de3d401SAlexey Dobriyan 53*5de3d401SAlexey Dobriyan /* pid 1 */ 54*5de3d401SAlexey Dobriyan if (!(p[-3] == ' ' && p[-2] == '1' && p[-1] == '\n')) 55*5de3d401SAlexey Dobriyan return 1; 56*5de3d401SAlexey Dobriyan 57*5de3d401SAlexey Dobriyan pid = fork(); 58*5de3d401SAlexey Dobriyan if (pid == -1) 59*5de3d401SAlexey Dobriyan return 1; 60*5de3d401SAlexey Dobriyan if (pid == 0) 61*5de3d401SAlexey Dobriyan return 0; 62*5de3d401SAlexey Dobriyan if (waitpid(pid, NULL, 0) == -1) 63*5de3d401SAlexey Dobriyan return 1; 64*5de3d401SAlexey Dobriyan 65*5de3d401SAlexey Dobriyan lseek(fd, 0, SEEK_SET); 66*5de3d401SAlexey Dobriyan rv = read(fd, buf, sizeof(buf)); 67*5de3d401SAlexey Dobriyan if (rv < 3) 68*5de3d401SAlexey Dobriyan return 1; 69*5de3d401SAlexey Dobriyan p = buf + rv; 70*5de3d401SAlexey Dobriyan 71*5de3d401SAlexey Dobriyan /* pid 2 */ 72*5de3d401SAlexey Dobriyan if (!(p[-3] == ' ' && p[-2] == '2' && p[-1] == '\n')) 73*5de3d401SAlexey Dobriyan return 1; 74*5de3d401SAlexey Dobriyan 75*5de3d401SAlexey Dobriyan return 0; 76*5de3d401SAlexey Dobriyan } 77*5de3d401SAlexey Dobriyan 78*5de3d401SAlexey Dobriyan if (waitpid(pid, &wstatus, 0) == -1) 79*5de3d401SAlexey Dobriyan return 1; 80*5de3d401SAlexey Dobriyan if (WIFEXITED(wstatus) && WEXITSTATUS(wstatus) == 0) 81*5de3d401SAlexey Dobriyan return 0; 82*5de3d401SAlexey Dobriyan return 1; 83*5de3d401SAlexey Dobriyan } 84