linux/tools/testing/selftests/acct/acct_syscall.c
Shivam Chaudhary 9301be2ce1 selftests: acct: Add ksft_exit_skip if not running as root
If the selftest is not running as root, it should skip not
fail and give an appropriate warning to the user. This patch adds
ksft_exit_skip() if the test is not running as root.

Logs:

Before change:

TAP version 13
1..1
ok 1 # SKIP This test needs root to run!

After change:

TAP version 13
1..1
ok 2 # SKIP This test needs root to run!
Totals: pass:0 fail:0 xfail:0 xpass:0 skip:1 error:0

Link: https://lore.kernel.org/r/20241210123212.332050-1-cvam0000@gmail.com
Signed-off-by: Shivam Chaudhary <cvam0000@gmail.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
2025-01-14 17:06:31 -07:00

78 lines
1.4 KiB
C

// SPDX-License-Identifier: GPL-2.0
/* kselftest for acct() system call
* The acct() system call enables or disables process accounting.
*/
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/wait.h>
#include "../kselftest.h"
int main(void)
{
char filename[] = "process_log";
FILE *fp;
pid_t child_pid;
int sz;
// Setting up kselftest framework
ksft_print_header();
ksft_set_plan(1);
// Check if test is run a root
if (geteuid()) {
ksft_exit_skip("This test needs root to run!\n");
return 1;
}
// Create file to log closed processes
fp = fopen(filename, "w");
if (!fp) {
ksft_test_result_error("%s.\n", strerror(errno));
ksft_finished();
return 1;
}
acct(filename);
// Handle error conditions
if (errno) {
ksft_test_result_error("%s.\n", strerror(errno));
fclose(fp);
ksft_finished();
return 1;
}
// Create child process and wait for it to terminate.
child_pid = fork();
if (child_pid < 0) {
ksft_test_result_error("Creating a child process to log failed\n");
acct(NULL);
return 1;
} else if (child_pid > 0) {
wait(NULL);
fseek(fp, 0L, SEEK_END);
sz = ftell(fp);
acct(NULL);
if (sz <= 0) {
ksft_test_result_fail("Terminated child process not logged\n");
ksft_exit_fail();
return 1;
}
ksft_test_result_pass("Successfully logged terminated process.\n");
fclose(fp);
ksft_exit_pass();
return 0;
}
return 1;
}