1f08c3bdfSopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
2f08c3bdfSopenharmony_ci/*
3f08c3bdfSopenharmony_ci * Copyright (c) International Business Machines  Corp., 2001
4f08c3bdfSopenharmony_ci *  07/2001 Ported by Wayne Boyer
5f08c3bdfSopenharmony_ci * Copyright (c) 2022 SUSE LLC Avinesh Kumar <avinesh.kumar@suse.com>
6f08c3bdfSopenharmony_ci */
7f08c3bdfSopenharmony_ci
8f08c3bdfSopenharmony_ci/*\
9f08c3bdfSopenharmony_ci * [Description]
10f08c3bdfSopenharmony_ci *
11f08c3bdfSopenharmony_ci * Verify rename(2) functions correctly when the newpath
12f08c3bdfSopenharmony_ci * file or directory (empty) exists.
13f08c3bdfSopenharmony_ci */
14f08c3bdfSopenharmony_ci
15f08c3bdfSopenharmony_ci#include <sys/stat.h>
16f08c3bdfSopenharmony_ci#include <stdio.h>
17f08c3bdfSopenharmony_ci#include "tst_test.h"
18f08c3bdfSopenharmony_ci
19f08c3bdfSopenharmony_ci#define MNT_POINT "mntpoint"
20f08c3bdfSopenharmony_ci#define OLD_FILE_NAME MNT_POINT"/oldfile"
21f08c3bdfSopenharmony_ci#define NEW_FILE_NAME MNT_POINT"/newfile"
22f08c3bdfSopenharmony_ci#define OLD_DIR_NAME MNT_POINT"/olddir"
23f08c3bdfSopenharmony_ci#define NEW_DIR_NAME MNT_POINT"/newdir"
24f08c3bdfSopenharmony_ci
25f08c3bdfSopenharmony_cistatic struct stat old_file_st, old_dir_st, new_file_st, new_dir_st;
26f08c3bdfSopenharmony_ci
27f08c3bdfSopenharmony_cistatic void run(void)
28f08c3bdfSopenharmony_ci{
29f08c3bdfSopenharmony_ci	SAFE_TOUCH(OLD_FILE_NAME, 0700, NULL);
30f08c3bdfSopenharmony_ci	SAFE_MKDIR(OLD_DIR_NAME, 00770);
31f08c3bdfSopenharmony_ci	SAFE_TOUCH(NEW_FILE_NAME, 0700, NULL);
32f08c3bdfSopenharmony_ci	SAFE_MKDIR(NEW_DIR_NAME, 00770);
33f08c3bdfSopenharmony_ci
34f08c3bdfSopenharmony_ci	SAFE_STAT(OLD_FILE_NAME, &old_file_st);
35f08c3bdfSopenharmony_ci	SAFE_STAT(OLD_DIR_NAME, &old_dir_st);
36f08c3bdfSopenharmony_ci
37f08c3bdfSopenharmony_ci	TST_EXP_PASS(rename(OLD_FILE_NAME, NEW_FILE_NAME),
38f08c3bdfSopenharmony_ci						"rename(%s, %s)",
39f08c3bdfSopenharmony_ci						OLD_FILE_NAME, NEW_FILE_NAME);
40f08c3bdfSopenharmony_ci	TST_EXP_PASS(rename(OLD_DIR_NAME, NEW_DIR_NAME),
41f08c3bdfSopenharmony_ci						"rename(%s, %s)",
42f08c3bdfSopenharmony_ci						OLD_DIR_NAME, NEW_DIR_NAME);
43f08c3bdfSopenharmony_ci
44f08c3bdfSopenharmony_ci	SAFE_STAT(NEW_FILE_NAME, &new_file_st);
45f08c3bdfSopenharmony_ci	SAFE_STAT(NEW_DIR_NAME, &new_dir_st);
46f08c3bdfSopenharmony_ci
47f08c3bdfSopenharmony_ci	TST_EXP_EQ_LU(old_file_st.st_dev, new_file_st.st_dev);
48f08c3bdfSopenharmony_ci	TST_EXP_EQ_LU(old_file_st.st_ino, new_file_st.st_ino);
49f08c3bdfSopenharmony_ci
50f08c3bdfSopenharmony_ci	TST_EXP_EQ_LU(old_dir_st.st_dev, new_dir_st.st_dev);
51f08c3bdfSopenharmony_ci	TST_EXP_EQ_LU(old_dir_st.st_ino, new_dir_st.st_ino);
52f08c3bdfSopenharmony_ci
53f08c3bdfSopenharmony_ci	TST_EXP_FAIL(stat(OLD_FILE_NAME, &old_file_st),
54f08c3bdfSopenharmony_ci				ENOENT,
55f08c3bdfSopenharmony_ci				"stat(%s, &old_file_st)",
56f08c3bdfSopenharmony_ci				OLD_FILE_NAME);
57f08c3bdfSopenharmony_ci	TST_EXP_FAIL(stat(OLD_DIR_NAME, &old_dir_st),
58f08c3bdfSopenharmony_ci				ENOENT,
59f08c3bdfSopenharmony_ci				"stat(%s, &old_dir_st)",
60f08c3bdfSopenharmony_ci				OLD_DIR_NAME);
61f08c3bdfSopenharmony_ci
62f08c3bdfSopenharmony_ci	/* cleanup between loops */
63f08c3bdfSopenharmony_ci	SAFE_UNLINK(NEW_FILE_NAME);
64f08c3bdfSopenharmony_ci	SAFE_RMDIR(NEW_DIR_NAME);
65f08c3bdfSopenharmony_ci}
66f08c3bdfSopenharmony_ci
67f08c3bdfSopenharmony_cistatic struct tst_test test = {
68f08c3bdfSopenharmony_ci	.test_all = run,
69f08c3bdfSopenharmony_ci	.needs_root = 1,
70f08c3bdfSopenharmony_ci	.mount_device = 1,
71f08c3bdfSopenharmony_ci	.mntpoint = MNT_POINT,
72f08c3bdfSopenharmony_ci	.all_filesystems = 1
73f08c3bdfSopenharmony_ci};
74