15de3d401SAlexey Dobriyan /* 2*ee9294d6SAlexey Dobriyan * Copyright © 2018 Alexey Dobriyan <adobriyan@gmail.com> 35de3d401SAlexey Dobriyan * 45de3d401SAlexey Dobriyan * Permission to use, copy, modify, and distribute this software for any 55de3d401SAlexey Dobriyan * purpose with or without fee is hereby granted, provided that the above 65de3d401SAlexey Dobriyan * copyright notice and this permission notice appear in all copies. 75de3d401SAlexey Dobriyan * 85de3d401SAlexey Dobriyan * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 95de3d401SAlexey Dobriyan * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 105de3d401SAlexey Dobriyan * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 115de3d401SAlexey Dobriyan * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 125de3d401SAlexey Dobriyan * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 135de3d401SAlexey Dobriyan * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 145de3d401SAlexey Dobriyan * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 155de3d401SAlexey Dobriyan */ 165de3d401SAlexey Dobriyan /* Test that /proc/loadavg correctly reports last pid in pid namespace. */ 175de3d401SAlexey Dobriyan #define _GNU_SOURCE 185de3d401SAlexey Dobriyan #include <errno.h> 195de3d401SAlexey Dobriyan #include <sched.h> 205de3d401SAlexey Dobriyan #include <sys/types.h> 215de3d401SAlexey Dobriyan #include <sys/stat.h> 225de3d401SAlexey Dobriyan #include <fcntl.h> 235de3d401SAlexey Dobriyan #include <unistd.h> 245de3d401SAlexey Dobriyan #include <sys/wait.h> 255de3d401SAlexey Dobriyan 265de3d401SAlexey Dobriyan int main(void) 275de3d401SAlexey Dobriyan { 285de3d401SAlexey Dobriyan pid_t pid; 295de3d401SAlexey Dobriyan int wstatus; 305de3d401SAlexey Dobriyan 315de3d401SAlexey Dobriyan if (unshare(CLONE_NEWPID) == -1) { 325de3d401SAlexey Dobriyan if (errno == ENOSYS || errno == EPERM) 335de3d401SAlexey Dobriyan return 2; 345de3d401SAlexey Dobriyan return 1; 355de3d401SAlexey Dobriyan } 365de3d401SAlexey Dobriyan 375de3d401SAlexey Dobriyan pid = fork(); 385de3d401SAlexey Dobriyan if (pid == -1) 395de3d401SAlexey Dobriyan return 1; 405de3d401SAlexey Dobriyan if (pid == 0) { 415de3d401SAlexey Dobriyan char buf[128], *p; 425de3d401SAlexey Dobriyan int fd; 435de3d401SAlexey Dobriyan ssize_t rv; 445de3d401SAlexey Dobriyan 455de3d401SAlexey Dobriyan fd = open("/proc/loadavg" , O_RDONLY); 465de3d401SAlexey Dobriyan if (fd == -1) 475de3d401SAlexey Dobriyan return 1; 485de3d401SAlexey Dobriyan rv = read(fd, buf, sizeof(buf)); 495de3d401SAlexey Dobriyan if (rv < 3) 505de3d401SAlexey Dobriyan return 1; 515de3d401SAlexey Dobriyan p = buf + rv; 525de3d401SAlexey Dobriyan 535de3d401SAlexey Dobriyan /* pid 1 */ 545de3d401SAlexey Dobriyan if (!(p[-3] == ' ' && p[-2] == '1' && p[-1] == '\n')) 555de3d401SAlexey Dobriyan return 1; 565de3d401SAlexey Dobriyan 575de3d401SAlexey Dobriyan pid = fork(); 585de3d401SAlexey Dobriyan if (pid == -1) 595de3d401SAlexey Dobriyan return 1; 605de3d401SAlexey Dobriyan if (pid == 0) 615de3d401SAlexey Dobriyan return 0; 625de3d401SAlexey Dobriyan if (waitpid(pid, NULL, 0) == -1) 635de3d401SAlexey Dobriyan return 1; 645de3d401SAlexey Dobriyan 655de3d401SAlexey Dobriyan lseek(fd, 0, SEEK_SET); 665de3d401SAlexey Dobriyan rv = read(fd, buf, sizeof(buf)); 675de3d401SAlexey Dobriyan if (rv < 3) 685de3d401SAlexey Dobriyan return 1; 695de3d401SAlexey Dobriyan p = buf + rv; 705de3d401SAlexey Dobriyan 715de3d401SAlexey Dobriyan /* pid 2 */ 725de3d401SAlexey Dobriyan if (!(p[-3] == ' ' && p[-2] == '2' && p[-1] == '\n')) 735de3d401SAlexey Dobriyan return 1; 745de3d401SAlexey Dobriyan 755de3d401SAlexey Dobriyan return 0; 765de3d401SAlexey Dobriyan } 775de3d401SAlexey Dobriyan 785de3d401SAlexey Dobriyan if (waitpid(pid, &wstatus, 0) == -1) 795de3d401SAlexey Dobriyan return 1; 805de3d401SAlexey Dobriyan if (WIFEXITED(wstatus) && WEXITSTATUS(wstatus) == 0) 815de3d401SAlexey Dobriyan return 0; 825de3d401SAlexey Dobriyan return 1; 835de3d401SAlexey Dobriyan } 84