1f08c3bdfSopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 2f08c3bdfSopenharmony_ci/* 3f08c3bdfSopenharmony_ci * Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved. 4f08c3bdfSopenharmony_ci * Copyright (c) Linux Test Project, 2003-2023 5f08c3bdfSopenharmony_ci * Author: William Roske 6f08c3bdfSopenharmony_ci */ 7f08c3bdfSopenharmony_ci 8f08c3bdfSopenharmony_ci/*\ 9f08c3bdfSopenharmony_ci * [Description] 10f08c3bdfSopenharmony_ci * 11f08c3bdfSopenharmony_ci * Basic test for access(2) using F_OK, R_OK, W_OK and X_OK 12f08c3bdfSopenharmony_ci */ 13f08c3bdfSopenharmony_ci 14f08c3bdfSopenharmony_ci#include <errno.h> 15f08c3bdfSopenharmony_ci#include <unistd.h> 16f08c3bdfSopenharmony_ci#include <sys/types.h> 17f08c3bdfSopenharmony_ci#include <pwd.h> 18f08c3bdfSopenharmony_ci#include "tst_test.h" 19f08c3bdfSopenharmony_ci 20f08c3bdfSopenharmony_ci#define FNAME_RWX "accessfile_rwx" 21f08c3bdfSopenharmony_ci#define FNAME_R "accessfile_r" 22f08c3bdfSopenharmony_ci#define FNAME_W "accessfile_w" 23f08c3bdfSopenharmony_ci#define FNAME_X "accessfile_x" 24f08c3bdfSopenharmony_ci 25f08c3bdfSopenharmony_ci#define DNAME_R "accessdir_r" 26f08c3bdfSopenharmony_ci#define DNAME_W "accessdir_w" 27f08c3bdfSopenharmony_ci#define DNAME_X "accessdir_x" 28f08c3bdfSopenharmony_ci#define DNAME_RW "accessdir_rw" 29f08c3bdfSopenharmony_ci#define DNAME_RX "accessdir_rx" 30f08c3bdfSopenharmony_ci#define DNAME_WX "accessdir_wx" 31f08c3bdfSopenharmony_ci 32f08c3bdfSopenharmony_cistatic uid_t uid; 33f08c3bdfSopenharmony_ci 34f08c3bdfSopenharmony_cistatic struct tcase { 35f08c3bdfSopenharmony_ci const char *fname; 36f08c3bdfSopenharmony_ci int mode; 37f08c3bdfSopenharmony_ci char *name; 38f08c3bdfSopenharmony_ci int exp_errno; 39f08c3bdfSopenharmony_ci /* 1: nobody expected 2: root expected 3: both */ 40f08c3bdfSopenharmony_ci int exp_user; 41f08c3bdfSopenharmony_ci} tcases[] = { 42f08c3bdfSopenharmony_ci {FNAME_RWX, F_OK, "F_OK", 0, 3}, 43f08c3bdfSopenharmony_ci {FNAME_RWX, X_OK, "X_OK", 0, 3}, 44f08c3bdfSopenharmony_ci {FNAME_RWX, W_OK, "W_OK", 0, 3}, 45f08c3bdfSopenharmony_ci {FNAME_RWX, R_OK, "R_OK", 0, 3}, 46f08c3bdfSopenharmony_ci 47f08c3bdfSopenharmony_ci {FNAME_RWX, R_OK|W_OK, "R_OK|W_OK", 0, 3}, 48f08c3bdfSopenharmony_ci {FNAME_RWX, R_OK|X_OK, "R_OK|X_OK", 0, 3}, 49f08c3bdfSopenharmony_ci {FNAME_RWX, W_OK|X_OK, "W_OK|X_OK", 0, 3}, 50f08c3bdfSopenharmony_ci {FNAME_RWX, R_OK|W_OK|X_OK, "R_OK|W_OK|X_OK", 0, 3}, 51f08c3bdfSopenharmony_ci 52f08c3bdfSopenharmony_ci {FNAME_X, X_OK, "X_OK", 0, 3}, 53f08c3bdfSopenharmony_ci {FNAME_W, W_OK, "W_OK", 0, 3}, 54f08c3bdfSopenharmony_ci {FNAME_R, R_OK, "R_OK", 0, 3}, 55f08c3bdfSopenharmony_ci 56f08c3bdfSopenharmony_ci {FNAME_R, X_OK, "X_OK", EACCES, 3}, 57f08c3bdfSopenharmony_ci {FNAME_R, W_OK, "W_OK", EACCES, 1}, 58f08c3bdfSopenharmony_ci {FNAME_W, R_OK, "R_OK", EACCES, 1}, 59f08c3bdfSopenharmony_ci {FNAME_W, X_OK, "X_OK", EACCES, 3}, 60f08c3bdfSopenharmony_ci {FNAME_X, R_OK, "R_OK", EACCES, 1}, 61f08c3bdfSopenharmony_ci {FNAME_X, W_OK, "W_OK", EACCES, 1}, 62f08c3bdfSopenharmony_ci 63f08c3bdfSopenharmony_ci {FNAME_R, W_OK|X_OK, "W_OK|X_OK", EACCES, 3}, 64f08c3bdfSopenharmony_ci {FNAME_R, R_OK|X_OK, "R_OK|X_OK", EACCES, 3}, 65f08c3bdfSopenharmony_ci {FNAME_R, R_OK|W_OK, "R_OK|W_OK", EACCES, 1}, 66f08c3bdfSopenharmony_ci {FNAME_R, R_OK|W_OK|X_OK, "R_OK|W_OK|X_OK", EACCES, 3}, 67f08c3bdfSopenharmony_ci 68f08c3bdfSopenharmony_ci {FNAME_W, W_OK|X_OK, "W_OK|X_OK", EACCES, 3}, 69f08c3bdfSopenharmony_ci {FNAME_W, R_OK|X_OK, "R_OK|X_OK", EACCES, 3}, 70f08c3bdfSopenharmony_ci {FNAME_W, R_OK|W_OK, "R_OK|W_OK", EACCES, 1}, 71f08c3bdfSopenharmony_ci {FNAME_W, R_OK|W_OK|X_OK, "R_OK|W_OK|X_OK", EACCES, 3}, 72f08c3bdfSopenharmony_ci 73f08c3bdfSopenharmony_ci {FNAME_X, W_OK|X_OK, "W_OK|X_OK", EACCES, 1}, 74f08c3bdfSopenharmony_ci {FNAME_X, R_OK|X_OK, "R_OK|X_OK", EACCES, 1}, 75f08c3bdfSopenharmony_ci {FNAME_X, R_OK|W_OK, "R_OK|W_OK", EACCES, 1}, 76f08c3bdfSopenharmony_ci {FNAME_X, R_OK|W_OK|X_OK, "R_OK|W_OK|X_OK", EACCES, 1}, 77f08c3bdfSopenharmony_ci 78f08c3bdfSopenharmony_ci {FNAME_R, W_OK, "W_OK", 0, 2}, 79f08c3bdfSopenharmony_ci {FNAME_R, R_OK|W_OK, "R_OK|W_OK", 0, 2}, 80f08c3bdfSopenharmony_ci 81f08c3bdfSopenharmony_ci {FNAME_W, R_OK, "R_OK", 0, 2}, 82f08c3bdfSopenharmony_ci {FNAME_W, R_OK|W_OK, "R_OK|W_OK", 0, 2}, 83f08c3bdfSopenharmony_ci 84f08c3bdfSopenharmony_ci {FNAME_X, R_OK, "R_OK", 0, 2}, 85f08c3bdfSopenharmony_ci {FNAME_X, W_OK, "W_OK", 0, 2}, 86f08c3bdfSopenharmony_ci {FNAME_X, R_OK|W_OK, "R_OK|W_OK", 0, 2}, 87f08c3bdfSopenharmony_ci 88f08c3bdfSopenharmony_ci {DNAME_R"/"FNAME_R, F_OK, "F_OK", 0, 2}, 89f08c3bdfSopenharmony_ci {DNAME_R"/"FNAME_R, R_OK, "R_OK", 0, 2}, 90f08c3bdfSopenharmony_ci {DNAME_R"/"FNAME_R, W_OK, "W_OK", 0, 2}, 91f08c3bdfSopenharmony_ci 92f08c3bdfSopenharmony_ci {DNAME_R"/"FNAME_W, F_OK, "F_OK", 0, 2}, 93f08c3bdfSopenharmony_ci {DNAME_R"/"FNAME_W, R_OK, "R_OK", 0, 2}, 94f08c3bdfSopenharmony_ci {DNAME_R"/"FNAME_W, W_OK, "W_OK", 0, 2}, 95f08c3bdfSopenharmony_ci 96f08c3bdfSopenharmony_ci {DNAME_R"/"FNAME_X, F_OK, "F_OK", 0, 2}, 97f08c3bdfSopenharmony_ci {DNAME_R"/"FNAME_X, R_OK, "R_OK", 0, 2}, 98f08c3bdfSopenharmony_ci {DNAME_R"/"FNAME_X, W_OK, "W_OK", 0, 2}, 99f08c3bdfSopenharmony_ci {DNAME_R"/"FNAME_X, X_OK, "X_OK", 0, 2}, 100f08c3bdfSopenharmony_ci 101f08c3bdfSopenharmony_ci {DNAME_W"/"FNAME_R, F_OK, "F_OK", 0, 2}, 102f08c3bdfSopenharmony_ci {DNAME_W"/"FNAME_R, R_OK, "R_OK", 0, 2}, 103f08c3bdfSopenharmony_ci {DNAME_W"/"FNAME_R, W_OK, "W_OK", 0, 2}, 104f08c3bdfSopenharmony_ci 105f08c3bdfSopenharmony_ci {DNAME_W"/"FNAME_W, F_OK, "F_OK", 0, 2}, 106f08c3bdfSopenharmony_ci {DNAME_W"/"FNAME_W, R_OK, "R_OK", 0, 2}, 107f08c3bdfSopenharmony_ci {DNAME_W"/"FNAME_W, W_OK, "W_OK", 0, 2}, 108f08c3bdfSopenharmony_ci 109f08c3bdfSopenharmony_ci {DNAME_W"/"FNAME_X, F_OK, "F_OK", 0, 2}, 110f08c3bdfSopenharmony_ci {DNAME_W"/"FNAME_X, R_OK, "R_OK", 0, 2}, 111f08c3bdfSopenharmony_ci {DNAME_W"/"FNAME_X, W_OK, "W_OK", 0, 2}, 112f08c3bdfSopenharmony_ci {DNAME_W"/"FNAME_X, X_OK, "X_OK", 0, 2}, 113f08c3bdfSopenharmony_ci 114f08c3bdfSopenharmony_ci {DNAME_X"/"FNAME_R, F_OK, "F_OK", 0, 3}, 115f08c3bdfSopenharmony_ci {DNAME_X"/"FNAME_R, R_OK, "R_OK", 0, 3}, 116f08c3bdfSopenharmony_ci {DNAME_X"/"FNAME_R, W_OK, "W_OK", 0, 2}, 117f08c3bdfSopenharmony_ci 118f08c3bdfSopenharmony_ci {DNAME_X"/"FNAME_W, F_OK, "F_OK", 0, 3}, 119f08c3bdfSopenharmony_ci {DNAME_X"/"FNAME_W, R_OK, "R_OK", 0, 2}, 120f08c3bdfSopenharmony_ci {DNAME_X"/"FNAME_W, W_OK, "W_OK", 0, 3}, 121f08c3bdfSopenharmony_ci 122f08c3bdfSopenharmony_ci {DNAME_X"/"FNAME_X, F_OK, "F_OK", 0, 3}, 123f08c3bdfSopenharmony_ci {DNAME_X"/"FNAME_X, R_OK, "R_OK", 0, 2}, 124f08c3bdfSopenharmony_ci {DNAME_X"/"FNAME_X, W_OK, "W_OK", 0, 2}, 125f08c3bdfSopenharmony_ci {DNAME_X"/"FNAME_X, X_OK, "X_OK", 0, 3}, 126f08c3bdfSopenharmony_ci 127f08c3bdfSopenharmony_ci {DNAME_RW"/"FNAME_R, F_OK, "F_OK", 0, 2}, 128f08c3bdfSopenharmony_ci {DNAME_RW"/"FNAME_R, R_OK, "R_OK", 0, 2}, 129f08c3bdfSopenharmony_ci {DNAME_RW"/"FNAME_R, W_OK, "W_OK", 0, 2}, 130f08c3bdfSopenharmony_ci 131f08c3bdfSopenharmony_ci {DNAME_RW"/"FNAME_W, F_OK, "F_OK", 0, 2}, 132f08c3bdfSopenharmony_ci {DNAME_RW"/"FNAME_W, R_OK, "R_OK", 0, 2}, 133f08c3bdfSopenharmony_ci {DNAME_RW"/"FNAME_W, W_OK, "W_OK", 0, 2}, 134f08c3bdfSopenharmony_ci 135f08c3bdfSopenharmony_ci {DNAME_RW"/"FNAME_X, F_OK, "F_OK", 0, 2}, 136f08c3bdfSopenharmony_ci {DNAME_RW"/"FNAME_X, R_OK, "R_OK", 0, 2}, 137f08c3bdfSopenharmony_ci {DNAME_RW"/"FNAME_X, W_OK, "W_OK", 0, 2}, 138f08c3bdfSopenharmony_ci {DNAME_RW"/"FNAME_X, X_OK, "X_OK", 0, 2}, 139f08c3bdfSopenharmony_ci 140f08c3bdfSopenharmony_ci {DNAME_RX"/"FNAME_R, F_OK, "F_OK", 0, 3}, 141f08c3bdfSopenharmony_ci {DNAME_RX"/"FNAME_R, R_OK, "R_OK", 0, 3}, 142f08c3bdfSopenharmony_ci {DNAME_RX"/"FNAME_R, W_OK, "W_OK", 0, 2}, 143f08c3bdfSopenharmony_ci 144f08c3bdfSopenharmony_ci {DNAME_RX"/"FNAME_W, F_OK, "F_OK", 0, 3}, 145f08c3bdfSopenharmony_ci {DNAME_RX"/"FNAME_W, R_OK, "R_OK", 0, 2}, 146f08c3bdfSopenharmony_ci {DNAME_RX"/"FNAME_W, W_OK, "W_OK", 0, 3}, 147f08c3bdfSopenharmony_ci 148f08c3bdfSopenharmony_ci {DNAME_RX"/"FNAME_X, F_OK, "F_OK", 0, 3}, 149f08c3bdfSopenharmony_ci {DNAME_RX"/"FNAME_X, R_OK, "R_OK", 0, 2}, 150f08c3bdfSopenharmony_ci {DNAME_RX"/"FNAME_X, W_OK, "W_OK", 0, 2}, 151f08c3bdfSopenharmony_ci {DNAME_RX"/"FNAME_X, X_OK, "X_OK", 0, 3}, 152f08c3bdfSopenharmony_ci 153f08c3bdfSopenharmony_ci {DNAME_WX"/"FNAME_R, F_OK, "F_OK", 0, 3}, 154f08c3bdfSopenharmony_ci {DNAME_WX"/"FNAME_R, R_OK, "R_OK", 0, 3}, 155f08c3bdfSopenharmony_ci {DNAME_WX"/"FNAME_R, W_OK, "W_OK", 0, 2}, 156f08c3bdfSopenharmony_ci 157f08c3bdfSopenharmony_ci {DNAME_WX"/"FNAME_W, F_OK, "F_OK", 0, 3}, 158f08c3bdfSopenharmony_ci {DNAME_WX"/"FNAME_W, R_OK, "R_OK", 0, 2}, 159f08c3bdfSopenharmony_ci {DNAME_WX"/"FNAME_W, W_OK, "W_OK", 0, 3}, 160f08c3bdfSopenharmony_ci 161f08c3bdfSopenharmony_ci {DNAME_WX"/"FNAME_X, F_OK, "F_OK", 0, 3}, 162f08c3bdfSopenharmony_ci {DNAME_WX"/"FNAME_X, R_OK, "R_OK", 0, 2}, 163f08c3bdfSopenharmony_ci {DNAME_WX"/"FNAME_X, W_OK, "W_OK", 0, 2}, 164f08c3bdfSopenharmony_ci {DNAME_WX"/"FNAME_X, X_OK, "X_OK", 0, 3}, 165f08c3bdfSopenharmony_ci 166f08c3bdfSopenharmony_ci {DNAME_R"/"FNAME_R, F_OK, "F_OK", EACCES, 1}, 167f08c3bdfSopenharmony_ci {DNAME_R"/"FNAME_R, R_OK, "R_OK", EACCES, 1}, 168f08c3bdfSopenharmony_ci {DNAME_R"/"FNAME_R, W_OK, "W_OK", EACCES, 1}, 169f08c3bdfSopenharmony_ci {DNAME_R"/"FNAME_R, X_OK, "X_OK", EACCES, 3}, 170f08c3bdfSopenharmony_ci 171f08c3bdfSopenharmony_ci {DNAME_R"/"FNAME_W, F_OK, "F_OK", EACCES, 1}, 172f08c3bdfSopenharmony_ci {DNAME_R"/"FNAME_W, R_OK, "R_OK", EACCES, 1}, 173f08c3bdfSopenharmony_ci {DNAME_R"/"FNAME_W, W_OK, "W_OK", EACCES, 1}, 174f08c3bdfSopenharmony_ci {DNAME_R"/"FNAME_W, X_OK, "X_OK", EACCES, 3}, 175f08c3bdfSopenharmony_ci 176f08c3bdfSopenharmony_ci {DNAME_R"/"FNAME_X, F_OK, "F_OK", EACCES, 1}, 177f08c3bdfSopenharmony_ci {DNAME_R"/"FNAME_X, R_OK, "R_OK", EACCES, 1}, 178f08c3bdfSopenharmony_ci {DNAME_R"/"FNAME_X, W_OK, "W_OK", EACCES, 1}, 179f08c3bdfSopenharmony_ci {DNAME_R"/"FNAME_X, X_OK, "X_OK", EACCES, 1}, 180f08c3bdfSopenharmony_ci 181f08c3bdfSopenharmony_ci {DNAME_W"/"FNAME_R, F_OK, "F_OK", EACCES, 1}, 182f08c3bdfSopenharmony_ci {DNAME_W"/"FNAME_R, R_OK, "R_OK", EACCES, 1}, 183f08c3bdfSopenharmony_ci {DNAME_W"/"FNAME_R, W_OK, "W_OK", EACCES, 1}, 184f08c3bdfSopenharmony_ci {DNAME_W"/"FNAME_R, X_OK, "X_OK", EACCES, 3}, 185f08c3bdfSopenharmony_ci 186f08c3bdfSopenharmony_ci {DNAME_W"/"FNAME_W, F_OK, "F_OK", EACCES, 1}, 187f08c3bdfSopenharmony_ci {DNAME_W"/"FNAME_W, R_OK, "R_OK", EACCES, 1}, 188f08c3bdfSopenharmony_ci {DNAME_W"/"FNAME_W, W_OK, "W_OK", EACCES, 1}, 189f08c3bdfSopenharmony_ci {DNAME_W"/"FNAME_W, X_OK, "X_OK", EACCES, 3}, 190f08c3bdfSopenharmony_ci 191f08c3bdfSopenharmony_ci {DNAME_W"/"FNAME_X, F_OK, "F_OK", EACCES, 1}, 192f08c3bdfSopenharmony_ci {DNAME_W"/"FNAME_X, R_OK, "R_OK", EACCES, 1}, 193f08c3bdfSopenharmony_ci {DNAME_W"/"FNAME_X, W_OK, "W_OK", EACCES, 1}, 194f08c3bdfSopenharmony_ci {DNAME_W"/"FNAME_X, X_OK, "X_OK", EACCES, 1}, 195f08c3bdfSopenharmony_ci 196f08c3bdfSopenharmony_ci {DNAME_X"/"FNAME_R, W_OK, "W_OK", EACCES, 1}, 197f08c3bdfSopenharmony_ci {DNAME_X"/"FNAME_R, X_OK, "X_OK", EACCES, 3}, 198f08c3bdfSopenharmony_ci 199f08c3bdfSopenharmony_ci {DNAME_X"/"FNAME_W, R_OK, "R_OK", EACCES, 1}, 200f08c3bdfSopenharmony_ci {DNAME_X"/"FNAME_W, X_OK, "X_OK", EACCES, 3}, 201f08c3bdfSopenharmony_ci 202f08c3bdfSopenharmony_ci {DNAME_X"/"FNAME_X, R_OK, "R_OK", EACCES, 1}, 203f08c3bdfSopenharmony_ci {DNAME_X"/"FNAME_X, W_OK, "W_OK", EACCES, 1}, 204f08c3bdfSopenharmony_ci 205f08c3bdfSopenharmony_ci {DNAME_RW"/"FNAME_R, F_OK, "F_OK", EACCES, 1}, 206f08c3bdfSopenharmony_ci {DNAME_RW"/"FNAME_R, R_OK, "R_OK", EACCES, 1}, 207f08c3bdfSopenharmony_ci {DNAME_RW"/"FNAME_R, W_OK, "W_OK", EACCES, 1}, 208f08c3bdfSopenharmony_ci {DNAME_RW"/"FNAME_R, X_OK, "X_OK", EACCES, 3}, 209f08c3bdfSopenharmony_ci 210f08c3bdfSopenharmony_ci {DNAME_RW"/"FNAME_W, F_OK, "F_OK", EACCES, 1}, 211f08c3bdfSopenharmony_ci {DNAME_RW"/"FNAME_W, R_OK, "R_OK", EACCES, 1}, 212f08c3bdfSopenharmony_ci {DNAME_RW"/"FNAME_W, W_OK, "W_OK", EACCES, 1}, 213f08c3bdfSopenharmony_ci {DNAME_RW"/"FNAME_W, X_OK, "X_OK", EACCES, 3}, 214f08c3bdfSopenharmony_ci 215f08c3bdfSopenharmony_ci {DNAME_RW"/"FNAME_X, F_OK, "F_OK", EACCES, 1}, 216f08c3bdfSopenharmony_ci {DNAME_RW"/"FNAME_X, R_OK, "R_OK", EACCES, 1}, 217f08c3bdfSopenharmony_ci {DNAME_RW"/"FNAME_X, W_OK, "W_OK", EACCES, 1}, 218f08c3bdfSopenharmony_ci {DNAME_RW"/"FNAME_X, X_OK, "X_OK", EACCES, 1}, 219f08c3bdfSopenharmony_ci 220f08c3bdfSopenharmony_ci {DNAME_RX"/"FNAME_R, W_OK, "W_OK", EACCES, 1}, 221f08c3bdfSopenharmony_ci {DNAME_RX"/"FNAME_R, X_OK, "X_OK", EACCES, 3}, 222f08c3bdfSopenharmony_ci 223f08c3bdfSopenharmony_ci {DNAME_RX"/"FNAME_W, R_OK, "R_OK", EACCES, 1}, 224f08c3bdfSopenharmony_ci {DNAME_RX"/"FNAME_W, X_OK, "X_OK", EACCES, 3}, 225f08c3bdfSopenharmony_ci 226f08c3bdfSopenharmony_ci {DNAME_RX"/"FNAME_X, R_OK, "R_OK", EACCES, 1}, 227f08c3bdfSopenharmony_ci {DNAME_RX"/"FNAME_X, W_OK, "W_OK", EACCES, 1}, 228f08c3bdfSopenharmony_ci 229f08c3bdfSopenharmony_ci {DNAME_WX"/"FNAME_R, W_OK, "W_OK", EACCES, 1}, 230f08c3bdfSopenharmony_ci {DNAME_WX"/"FNAME_R, X_OK, "X_OK", EACCES, 3}, 231f08c3bdfSopenharmony_ci 232f08c3bdfSopenharmony_ci {DNAME_WX"/"FNAME_W, R_OK, "R_OK", EACCES, 1}, 233f08c3bdfSopenharmony_ci {DNAME_WX"/"FNAME_W, X_OK, "X_OK", EACCES, 3}, 234f08c3bdfSopenharmony_ci 235f08c3bdfSopenharmony_ci {DNAME_WX"/"FNAME_X, R_OK, "R_OK", EACCES, 1}, 236f08c3bdfSopenharmony_ci {DNAME_WX"/"FNAME_X, W_OK, "W_OK", EACCES, 1} 237f08c3bdfSopenharmony_ci}; 238f08c3bdfSopenharmony_ci 239f08c3bdfSopenharmony_cistatic void access_test(struct tcase *tc, const char *user) 240f08c3bdfSopenharmony_ci{ 241f08c3bdfSopenharmony_ci if (tc->exp_errno) { 242f08c3bdfSopenharmony_ci TST_EXP_FAIL(access(tc->fname, tc->mode), tc->exp_errno, 243f08c3bdfSopenharmony_ci "access(%s, %s) as %s", tc->fname, tc->name, user); 244f08c3bdfSopenharmony_ci } else { 245f08c3bdfSopenharmony_ci TST_EXP_PASS(access(tc->fname, tc->mode), 246f08c3bdfSopenharmony_ci "access(%s, %s) as %s", tc->fname, tc->name, user); 247f08c3bdfSopenharmony_ci } 248f08c3bdfSopenharmony_ci} 249f08c3bdfSopenharmony_ci 250f08c3bdfSopenharmony_cistatic void verify_access(unsigned int n) 251f08c3bdfSopenharmony_ci{ 252f08c3bdfSopenharmony_ci struct tcase *tc = tcases + n; 253f08c3bdfSopenharmony_ci pid_t pid; 254f08c3bdfSopenharmony_ci 255f08c3bdfSopenharmony_ci if (tc->exp_user & 0x02) 256f08c3bdfSopenharmony_ci access_test(tc, "root"); 257f08c3bdfSopenharmony_ci 258f08c3bdfSopenharmony_ci if (tc->exp_user & 0x01) { 259f08c3bdfSopenharmony_ci pid = SAFE_FORK(); 260f08c3bdfSopenharmony_ci if (pid) { 261f08c3bdfSopenharmony_ci SAFE_WAITPID(pid, NULL, 0); 262f08c3bdfSopenharmony_ci } else { 263f08c3bdfSopenharmony_ci SAFE_SETUID(uid); 264f08c3bdfSopenharmony_ci access_test(tc, "nobody"); 265f08c3bdfSopenharmony_ci } 266f08c3bdfSopenharmony_ci } 267f08c3bdfSopenharmony_ci} 268f08c3bdfSopenharmony_ci 269f08c3bdfSopenharmony_cistatic void setup(void) 270f08c3bdfSopenharmony_ci{ 271f08c3bdfSopenharmony_ci struct passwd *pw; 272f08c3bdfSopenharmony_ci 273f08c3bdfSopenharmony_ci umask(0022); 274f08c3bdfSopenharmony_ci 275f08c3bdfSopenharmony_ci pw = SAFE_GETPWNAM("nobody"); 276f08c3bdfSopenharmony_ci 277f08c3bdfSopenharmony_ci uid = pw->pw_uid; 278f08c3bdfSopenharmony_ci 279f08c3bdfSopenharmony_ci SAFE_TOUCH(FNAME_RWX, 0777, NULL); 280f08c3bdfSopenharmony_ci SAFE_TOUCH(FNAME_R, 0444, NULL); 281f08c3bdfSopenharmony_ci SAFE_TOUCH(FNAME_W, 0222, NULL); 282f08c3bdfSopenharmony_ci SAFE_TOUCH(FNAME_X, 0111, NULL); 283f08c3bdfSopenharmony_ci 284f08c3bdfSopenharmony_ci SAFE_MKDIR(DNAME_R, 0444); 285f08c3bdfSopenharmony_ci SAFE_MKDIR(DNAME_W, 0222); 286f08c3bdfSopenharmony_ci SAFE_MKDIR(DNAME_X, 0111); 287f08c3bdfSopenharmony_ci SAFE_MKDIR(DNAME_RW, 0666); 288f08c3bdfSopenharmony_ci SAFE_MKDIR(DNAME_RX, 0555); 289f08c3bdfSopenharmony_ci SAFE_MKDIR(DNAME_WX, 0333); 290f08c3bdfSopenharmony_ci 291f08c3bdfSopenharmony_ci SAFE_TOUCH(DNAME_R"/"FNAME_R, 0444, NULL); 292f08c3bdfSopenharmony_ci SAFE_TOUCH(DNAME_R"/"FNAME_W, 0222, NULL); 293f08c3bdfSopenharmony_ci SAFE_TOUCH(DNAME_R"/"FNAME_X, 0111, NULL); 294f08c3bdfSopenharmony_ci 295f08c3bdfSopenharmony_ci SAFE_TOUCH(DNAME_W"/"FNAME_R, 0444, NULL); 296f08c3bdfSopenharmony_ci SAFE_TOUCH(DNAME_W"/"FNAME_W, 0222, NULL); 297f08c3bdfSopenharmony_ci SAFE_TOUCH(DNAME_W"/"FNAME_X, 0111, NULL); 298f08c3bdfSopenharmony_ci 299f08c3bdfSopenharmony_ci SAFE_TOUCH(DNAME_X"/"FNAME_R, 0444, NULL); 300f08c3bdfSopenharmony_ci SAFE_TOUCH(DNAME_X"/"FNAME_W, 0222, NULL); 301f08c3bdfSopenharmony_ci SAFE_TOUCH(DNAME_X"/"FNAME_X, 0111, NULL); 302f08c3bdfSopenharmony_ci 303f08c3bdfSopenharmony_ci SAFE_TOUCH(DNAME_RW"/"FNAME_R, 0444, NULL); 304f08c3bdfSopenharmony_ci SAFE_TOUCH(DNAME_RW"/"FNAME_W, 0222, NULL); 305f08c3bdfSopenharmony_ci SAFE_TOUCH(DNAME_RW"/"FNAME_X, 0111, NULL); 306f08c3bdfSopenharmony_ci 307f08c3bdfSopenharmony_ci SAFE_TOUCH(DNAME_RX"/"FNAME_R, 0444, NULL); 308f08c3bdfSopenharmony_ci SAFE_TOUCH(DNAME_RX"/"FNAME_W, 0222, NULL); 309f08c3bdfSopenharmony_ci SAFE_TOUCH(DNAME_RX"/"FNAME_X, 0111, NULL); 310f08c3bdfSopenharmony_ci 311f08c3bdfSopenharmony_ci SAFE_TOUCH(DNAME_WX"/"FNAME_R, 0444, NULL); 312f08c3bdfSopenharmony_ci SAFE_TOUCH(DNAME_WX"/"FNAME_W, 0222, NULL); 313f08c3bdfSopenharmony_ci SAFE_TOUCH(DNAME_WX"/"FNAME_X, 0111, NULL); 314f08c3bdfSopenharmony_ci} 315f08c3bdfSopenharmony_ci 316f08c3bdfSopenharmony_cistatic struct tst_test test = { 317f08c3bdfSopenharmony_ci .needs_tmpdir = 1, 318f08c3bdfSopenharmony_ci .needs_root = 1, 319f08c3bdfSopenharmony_ci .forks_child = 1, 320f08c3bdfSopenharmony_ci .setup = setup, 321f08c3bdfSopenharmony_ci .test = verify_access, 322f08c3bdfSopenharmony_ci .tcnt = ARRAY_SIZE(tcases), 323f08c3bdfSopenharmony_ci}; 324