1 1.19 riastrad /* $NetBSD: t_paths.c,v 1.19 2023/08/05 12:11:05 riastradh Exp $ */ 2 1.1 jruoho 3 1.1 jruoho /*- 4 1.1 jruoho * Copyright (c) 2011 The NetBSD Foundation, Inc. 5 1.1 jruoho * All rights reserved. 6 1.1 jruoho * 7 1.1 jruoho * This code is derived from software contributed to The NetBSD Foundation 8 1.1 jruoho * by Jukka Ruohonen. 9 1.1 jruoho * 10 1.1 jruoho * Redistribution and use in source and binary forms, with or without 11 1.1 jruoho * modification, are permitted provided that the following conditions 12 1.1 jruoho * are met: 13 1.1 jruoho * 1. Redistributions of source code must retain the above copyright 14 1.1 jruoho * notice, this list of conditions and the following disclaimer. 15 1.1 jruoho * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 jruoho * notice, this list of conditions and the following disclaimer in the 17 1.1 jruoho * documentation and/or other materials provided with the distribution. 18 1.1 jruoho * 19 1.1 jruoho * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 jruoho * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 jruoho * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 jruoho * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 jruoho * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 jruoho * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 jruoho * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 jruoho * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 jruoho * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 jruoho * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 jruoho * POSSIBILITY OF SUCH DAMAGE. 30 1.1 jruoho */ 31 1.1 jruoho #include <sys/cdefs.h> 32 1.19 riastrad __RCSID("$NetBSD: t_paths.c,v 1.19 2023/08/05 12:11:05 riastradh Exp $"); 33 1.1 jruoho 34 1.1 jruoho #include <sys/param.h> 35 1.1 jruoho #include <sys/stat.h> 36 1.1 jruoho 37 1.1 jruoho #include <errno.h> 38 1.1 jruoho #include <fcntl.h> 39 1.1 jruoho #include <paths.h> 40 1.10 jruoho #include <stdio.h> 41 1.1 jruoho #include <string.h> 42 1.1 jruoho #include <unistd.h> 43 1.1 jruoho 44 1.1 jruoho #include <atf-c.h> 45 1.1 jruoho 46 1.1 jruoho #define PATH_DEV __BIT(0) /* A device node */ 47 1.1 jruoho #define PATH_DIR __BIT(1) /* A directory */ 48 1.1 jruoho #define PATH_FILE __BIT(2) /* A file */ 49 1.1 jruoho #define PATH_ROOT __BIT(3) /* Access for root only */ 50 1.15 pgoyette #define PATH_OPT __BIT(3) /* Optional, ENODEV if not supported */ 51 1.1 jruoho 52 1.1 jruoho static const struct { 53 1.1 jruoho const char *path; 54 1.1 jruoho int flags; 55 1.1 jruoho } paths[] = { 56 1.1 jruoho { _PATH_AUDIO, PATH_DEV }, 57 1.1 jruoho { _PATH_AUDIO0, PATH_DEV }, 58 1.1 jruoho { _PATH_AUDIOCTL, PATH_DEV }, 59 1.1 jruoho { _PATH_AUDIOCTL0, PATH_DEV }, 60 1.1 jruoho { _PATH_BPF, PATH_DEV | PATH_ROOT }, 61 1.1 jruoho { _PATH_CLOCKCTL, PATH_DEV | PATH_ROOT }, 62 1.3 jruoho { _PATH_CONSOLE, PATH_DEV | PATH_ROOT }, 63 1.1 jruoho { _PATH_CONSTTY, PATH_DEV | PATH_ROOT }, 64 1.9 jruoho { _PATH_CPUCTL, PATH_DEV }, 65 1.1 jruoho { _PATH_CSMAPPER, PATH_DIR }, 66 1.1 jruoho { _PATH_DEFTAPE, PATH_DEV | PATH_ROOT }, 67 1.12 joerg { _PATH_DEVCDB, PATH_FILE }, 68 1.1 jruoho { _PATH_DEVDB, PATH_FILE }, 69 1.1 jruoho { _PATH_DEVNULL, PATH_DEV }, 70 1.1 jruoho { _PATH_DRUM, PATH_DEV | PATH_ROOT }, 71 1.1 jruoho { _PATH_ESDB, PATH_DIR }, 72 1.1 jruoho { _PATH_FTPUSERS, PATH_FILE }, 73 1.1 jruoho { _PATH_GETTYTAB, PATH_FILE }, 74 1.1 jruoho { _PATH_I18NMODULE, PATH_DIR }, 75 1.1 jruoho { _PATH_ICONV, PATH_DIR }, 76 1.1 jruoho { _PATH_KMEM, PATH_DEV | PATH_ROOT }, 77 1.18 riastrad { _PATH_KSYMS, PATH_DEV | PATH_ROOT }, 78 1.1 jruoho { _PATH_KVMDB, PATH_FILE }, 79 1.1 jruoho { _PATH_LOCALE, PATH_DIR }, 80 1.1 jruoho { _PATH_MAILDIR, PATH_DIR }, 81 1.1 jruoho { _PATH_MAN, PATH_DIR }, 82 1.1 jruoho { _PATH_MEM, PATH_DEV | PATH_ROOT }, 83 1.1 jruoho { _PATH_MIXER, PATH_DEV }, 84 1.1 jruoho { _PATH_MIXER0, PATH_DEV }, 85 1.1 jruoho { _PATH_NOLOGIN, PATH_FILE }, 86 1.15 pgoyette { _PATH_POWER, PATH_DEV | PATH_ROOT | PATH_OPT }, 87 1.1 jruoho { _PATH_PRINTCAP, PATH_FILE }, 88 1.1 jruoho { _PATH_PUD, PATH_DEV | PATH_ROOT }, 89 1.1 jruoho { _PATH_PUFFS, PATH_DEV | PATH_ROOT }, 90 1.1 jruoho { _PATH_RANDOM, PATH_DEV }, 91 1.1 jruoho { _PATH_SENDMAIL, PATH_FILE }, 92 1.1 jruoho { _PATH_SHELLS, PATH_FILE }, 93 1.1 jruoho { _PATH_SKEYKEYS, PATH_FILE | PATH_ROOT }, 94 1.1 jruoho { _PATH_SOUND, PATH_DEV }, 95 1.1 jruoho { _PATH_SOUND0, PATH_DEV }, 96 1.15 pgoyette { _PATH_SYSMON, PATH_DEV | PATH_OPT }, 97 1.1 jruoho { _PATH_TTY, PATH_DEV }, 98 1.9 jruoho { _PATH_UNIX, PATH_FILE | PATH_ROOT }, 99 1.1 jruoho { _PATH_URANDOM, PATH_DEV }, 100 1.1 jruoho { _PATH_VIDEO, PATH_DEV }, 101 1.1 jruoho { _PATH_VIDEO0, PATH_DEV }, 102 1.15 pgoyette { _PATH_WATCHDOG, PATH_DEV | PATH_OPT }, 103 1.1 jruoho 104 1.1 jruoho { _PATH_DEV, PATH_DIR }, 105 1.1 jruoho { _PATH_DEV_PTS, PATH_DIR }, 106 1.1 jruoho { _PATH_EMUL_AOUT, PATH_DIR }, 107 1.1 jruoho { _PATH_TMP, PATH_DIR }, 108 1.1 jruoho { _PATH_VARDB, PATH_DIR }, 109 1.1 jruoho { _PATH_VARRUN, PATH_DIR }, 110 1.1 jruoho { _PATH_VARTMP, PATH_DIR }, 111 1.1 jruoho 112 1.1 jruoho { _PATH_BSHELL, PATH_FILE }, 113 1.1 jruoho { _PATH_CSHELL, PATH_FILE }, 114 1.1 jruoho { _PATH_VI, PATH_FILE }, 115 1.1 jruoho }; 116 1.1 jruoho 117 1.1 jruoho ATF_TC(paths); 118 1.1 jruoho ATF_TC_HEAD(paths, tc) 119 1.1 jruoho { 120 1.1 jruoho atf_tc_set_md_var(tc, "descr", "A basic test for <paths.h>"); 121 1.1 jruoho } 122 1.1 jruoho 123 1.1 jruoho ATF_TC_BODY(paths, tc) 124 1.1 jruoho { 125 1.1 jruoho struct stat st; 126 1.1 jruoho uid_t uid; 127 1.1 jruoho mode_t m; 128 1.1 jruoho size_t i; 129 1.1 jruoho int fd; 130 1.1 jruoho 131 1.13 jmmv #if defined(__sparc__) 132 1.13 jmmv atf_tc_skip("PR port-sparc/45580"); 133 1.13 jmmv #endif 134 1.11 jruoho 135 1.1 jruoho uid = getuid(); 136 1.1 jruoho 137 1.1 jruoho for (i = 0; i < __arraycount(paths); i++) { 138 1.10 jruoho (void)fprintf(stderr, "testing '%s'\n", paths[i].path); 139 1.10 jruoho 140 1.1 jruoho errno = 0; 141 1.1 jruoho fd = open(paths[i].path, O_RDONLY); 142 1.1 jruoho if (fd < 0) { 143 1.1 jruoho switch (errno) { 144 1.15 pgoyette case ENODEV: 145 1.15 pgoyette if ((paths[i].flags & PATH_OPT) == 0) { 146 1.19 riastrad atf_tc_fail_nonfatal("Required path %s" 147 1.19 riastrad " does not exist", paths[i].path); 148 1.19 riastrad continue; 149 1.15 pgoyette } 150 1.15 pgoyette break; 151 1.1 jruoho case EPERM: /* FALLTHROUGH */ 152 1.1 jruoho case EACCES: /* FALLTHROUGH */ 153 1.1 jruoho if ((paths[i].flags & PATH_ROOT) == 0) { 154 1.19 riastrad atf_tc_fail_nonfatal("UID %u" 155 1.19 riastrad " failed to open %s," 156 1.19 riastrad " error %d (%s)", 157 1.19 riastrad (uint32_t)uid, 158 1.19 riastrad paths[i].path, 159 1.19 riastrad errno, strerror(errno)); 160 1.19 riastrad continue; 161 1.1 jruoho } 162 1.17 mrg /* FALLTHROUGH */ 163 1.1 jruoho case EBUSY: /* FALLTHROUGH */ 164 1.1 jruoho case ENXIO: /* FALLTHROUGH */ 165 1.1 jruoho case ENOENT: /* FALLTHROUGH */ 166 1.1 jruoho default: 167 1.1 jruoho continue; 168 1.1 jruoho } 169 1.1 jruoho } 170 1.1 jruoho 171 1.1 jruoho (void)memset(&st, 0, sizeof(struct stat)); 172 1.1 jruoho 173 1.19 riastrad if (fstat(fd, &st) == -1) { 174 1.19 riastrad atf_tc_fail_nonfatal("fstat %s failed, error %d (%s)", 175 1.19 riastrad paths[i].path, errno, strerror(errno)); 176 1.19 riastrad ATF_CHECK(close(fd) == 0); 177 1.19 riastrad continue; 178 1.19 riastrad } 179 1.1 jruoho 180 1.1 jruoho m = st.st_mode; 181 1.1 jruoho 182 1.1 jruoho if ((paths[i].flags & PATH_DEV) != 0) { 183 1.6 njoly ATF_CHECK(S_ISBLK(m) != 0 || S_ISCHR(m) != 0); 184 1.6 njoly ATF_CHECK((paths[i].flags & PATH_DIR) == 0); 185 1.6 njoly ATF_CHECK((paths[i].flags & PATH_FILE) == 0); 186 1.1 jruoho } 187 1.1 jruoho 188 1.1 jruoho if ((paths[i].flags & PATH_DIR) != 0) { 189 1.6 njoly ATF_CHECK(S_ISDIR(m) != 0); 190 1.6 njoly ATF_CHECK((paths[i].flags & PATH_DEV) == 0); 191 1.6 njoly ATF_CHECK((paths[i].flags & PATH_FILE) == 0); 192 1.1 jruoho } 193 1.1 jruoho 194 1.1 jruoho if ((paths[i].flags & PATH_FILE) != 0) { 195 1.6 njoly ATF_CHECK(S_ISREG(m) != 0); 196 1.6 njoly ATF_CHECK((paths[i].flags & PATH_DEV) == 0); 197 1.6 njoly ATF_CHECK((paths[i].flags & PATH_DIR) == 0); 198 1.1 jruoho } 199 1.1 jruoho 200 1.19 riastrad ATF_CHECK(close(fd) == 0); 201 1.1 jruoho } 202 1.1 jruoho } 203 1.1 jruoho 204 1.1 jruoho ATF_TP_ADD_TCS(tp) 205 1.1 jruoho { 206 1.1 jruoho 207 1.1 jruoho ATF_TP_ADD_TC(tp, paths); 208 1.1 jruoho 209 1.1 jruoho return atf_no_error(); 210 1.1 jruoho } 211