162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * This test covers the PR_SET_NAME functionality of prctl calls
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <errno.h>
762306a36Sopenharmony_ci#include <sys/prctl.h>
862306a36Sopenharmony_ci#include <string.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include "../kselftest_harness.h"
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#define CHANGE_NAME "changename"
1362306a36Sopenharmony_ci#define EMPTY_NAME ""
1462306a36Sopenharmony_ci#define TASK_COMM_LEN 16
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ciint set_name(char *name)
1762306a36Sopenharmony_ci{
1862306a36Sopenharmony_ci	int res;
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci	res = prctl(PR_SET_NAME, name, NULL, NULL, NULL);
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci	if (res < 0)
2362306a36Sopenharmony_ci		return -errno;
2462306a36Sopenharmony_ci	return res;
2562306a36Sopenharmony_ci}
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ciint check_is_name_correct(char *check_name)
2862306a36Sopenharmony_ci{
2962306a36Sopenharmony_ci	char name[TASK_COMM_LEN];
3062306a36Sopenharmony_ci	int res;
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci	res = prctl(PR_GET_NAME, name, NULL, NULL, NULL);
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	if (res < 0)
3562306a36Sopenharmony_ci		return -errno;
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	return !strcmp(name, check_name);
3862306a36Sopenharmony_ci}
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ciint check_null_pointer(char *check_name)
4162306a36Sopenharmony_ci{
4262306a36Sopenharmony_ci	char *name = NULL;
4362306a36Sopenharmony_ci	int res;
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	res = prctl(PR_GET_NAME, name, NULL, NULL, NULL);
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	return res;
4862306a36Sopenharmony_ci}
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ciTEST(rename_process) {
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci	EXPECT_GE(set_name(CHANGE_NAME), 0);
5362306a36Sopenharmony_ci	EXPECT_TRUE(check_is_name_correct(CHANGE_NAME));
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci	EXPECT_GE(set_name(EMPTY_NAME), 0);
5662306a36Sopenharmony_ci	EXPECT_TRUE(check_is_name_correct(EMPTY_NAME));
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci	EXPECT_GE(set_name(CHANGE_NAME), 0);
5962306a36Sopenharmony_ci	EXPECT_LT(check_null_pointer(CHANGE_NAME), 0);
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ciTEST_HARNESS_MAIN
63