79 lines · c
1// SPDX-License-Identifier: GPL-2.02 3/* kselftest for acct() system call4 * The acct() system call enables or disables process accounting.5 */6 7#include <stdio.h>8#include <errno.h>9#include <string.h>10#include <sys/wait.h>11 12#include "../kselftest.h"13 14int main(void)15{16 char filename[] = "process_log";17 FILE *fp;18 pid_t child_pid;19 int sz;20 21 // Setting up kselftest framework22 ksft_print_header();23 ksft_set_plan(1);24 25 // Check if test is run a root26 if (geteuid()) {27 ksft_test_result_skip("This test needs root to run!\n");28 return 1;29 }30 31 // Create file to log closed processes32 fp = fopen(filename, "w");33 34 if (!fp) {35 ksft_test_result_error("%s.\n", strerror(errno));36 ksft_finished();37 return 1;38 }39 40 acct(filename);41 42 // Handle error conditions43 if (errno) {44 ksft_test_result_error("%s.\n", strerror(errno));45 fclose(fp);46 ksft_finished();47 return 1;48 }49 50 // Create child process and wait for it to terminate.51 52 child_pid = fork();53 54 if (child_pid < 0) {55 ksft_test_result_error("Creating a child process to log failed\n");56 acct(NULL);57 return 1;58 } else if (child_pid > 0) {59 wait(NULL);60 fseek(fp, 0L, SEEK_END);61 sz = ftell(fp);62 63 acct(NULL);64 65 if (sz <= 0) {66 ksft_test_result_fail("Terminated child process not logged\n");67 ksft_exit_fail();68 return 1;69 }70 71 ksft_test_result_pass("Successfully logged terminated process.\n");72 fclose(fp);73 ksft_exit_pass();74 return 0;75 }76 77 return 1;78}79