1*640235e2SEnji Cooper /* $NetBSD: t_paths.c,v 1.16 2015/05/07 06:23:23 pgoyette Exp $ */ 257718be8SEnji Cooper 357718be8SEnji Cooper /*- 457718be8SEnji Cooper * Copyright (c) 2011 The NetBSD Foundation, Inc. 557718be8SEnji Cooper * All rights reserved. 657718be8SEnji Cooper * 757718be8SEnji Cooper * This code is derived from software contributed to The NetBSD Foundation 857718be8SEnji Cooper * by Jukka Ruohonen. 957718be8SEnji Cooper * 1057718be8SEnji Cooper * Redistribution and use in source and binary forms, with or without 1157718be8SEnji Cooper * modification, are permitted provided that the following conditions 1257718be8SEnji Cooper * are met: 1357718be8SEnji Cooper * 1. Redistributions of source code must retain the above copyright 1457718be8SEnji Cooper * notice, this list of conditions and the following disclaimer. 1557718be8SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 1657718be8SEnji Cooper * notice, this list of conditions and the following disclaimer in the 1757718be8SEnji Cooper * documentation and/or other materials provided with the distribution. 1857718be8SEnji Cooper * 1957718be8SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 2057718be8SEnji Cooper * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 2157718be8SEnji Cooper * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 2257718be8SEnji Cooper * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 2357718be8SEnji Cooper * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2457718be8SEnji Cooper * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2557718be8SEnji Cooper * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2657718be8SEnji Cooper * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2757718be8SEnji Cooper * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2857718be8SEnji Cooper * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2957718be8SEnji Cooper * POSSIBILITY OF SUCH DAMAGE. 3057718be8SEnji Cooper */ 3157718be8SEnji Cooper #include <sys/cdefs.h> 32*640235e2SEnji Cooper __RCSID("$NetBSD: t_paths.c,v 1.16 2015/05/07 06:23:23 pgoyette Exp $"); 3357718be8SEnji Cooper 3457718be8SEnji Cooper #include <sys/param.h> 3557718be8SEnji Cooper #include <sys/stat.h> 3657718be8SEnji Cooper 3757718be8SEnji Cooper #include <errno.h> 3857718be8SEnji Cooper #include <fcntl.h> 3957718be8SEnji Cooper #include <paths.h> 4057718be8SEnji Cooper #include <stdio.h> 4157718be8SEnji Cooper #include <string.h> 4257718be8SEnji Cooper #include <unistd.h> 4357718be8SEnji Cooper 4457718be8SEnji Cooper #include <atf-c.h> 4557718be8SEnji Cooper 4657718be8SEnji Cooper #define PATH_DEV __BIT(0) /* A device node */ 4757718be8SEnji Cooper #define PATH_DIR __BIT(1) /* A directory */ 4857718be8SEnji Cooper #define PATH_FILE __BIT(2) /* A file */ 4957718be8SEnji Cooper #define PATH_ROOT __BIT(3) /* Access for root only */ 50*640235e2SEnji Cooper #define PATH_OPT __BIT(3) /* Optional, ENODEV if not supported */ 5157718be8SEnji Cooper 5257718be8SEnji Cooper static const struct { 5357718be8SEnji Cooper const char *path; 5457718be8SEnji Cooper int flags; 5557718be8SEnji Cooper } paths[] = { 5657718be8SEnji Cooper { _PATH_AUDIO, PATH_DEV }, 5757718be8SEnji Cooper { _PATH_AUDIO0, PATH_DEV }, 5857718be8SEnji Cooper { _PATH_AUDIOCTL, PATH_DEV }, 5957718be8SEnji Cooper { _PATH_AUDIOCTL0, PATH_DEV }, 6057718be8SEnji Cooper { _PATH_BPF, PATH_DEV | PATH_ROOT }, 6157718be8SEnji Cooper { _PATH_CLOCKCTL, PATH_DEV | PATH_ROOT }, 6257718be8SEnji Cooper { _PATH_CONSOLE, PATH_DEV | PATH_ROOT }, 6357718be8SEnji Cooper { _PATH_CONSTTY, PATH_DEV | PATH_ROOT }, 6457718be8SEnji Cooper { _PATH_CPUCTL, PATH_DEV }, 6557718be8SEnji Cooper { _PATH_CSMAPPER, PATH_DIR }, 6657718be8SEnji Cooper { _PATH_DEFTAPE, PATH_DEV | PATH_ROOT }, 6757718be8SEnji Cooper { _PATH_DEVCDB, PATH_FILE }, 6857718be8SEnji Cooper { _PATH_DEVDB, PATH_FILE }, 6957718be8SEnji Cooper { _PATH_DEVNULL, PATH_DEV }, 7057718be8SEnji Cooper { _PATH_DRUM, PATH_DEV | PATH_ROOT }, 7157718be8SEnji Cooper { _PATH_ESDB, PATH_DIR }, 7257718be8SEnji Cooper { _PATH_FTPUSERS, PATH_FILE }, 7357718be8SEnji Cooper { _PATH_GETTYTAB, PATH_FILE }, 7457718be8SEnji Cooper { _PATH_I18NMODULE, PATH_DIR }, 7557718be8SEnji Cooper { _PATH_ICONV, PATH_DIR }, 7657718be8SEnji Cooper { _PATH_KMEM, PATH_DEV | PATH_ROOT }, 7757718be8SEnji Cooper { _PATH_KSYMS, PATH_DEV }, 7857718be8SEnji Cooper { _PATH_KVMDB, PATH_FILE }, 7957718be8SEnji Cooper { _PATH_LOCALE, PATH_DIR }, 8057718be8SEnji Cooper { _PATH_MAILDIR, PATH_DIR }, 8157718be8SEnji Cooper { _PATH_MAN, PATH_DIR }, 8257718be8SEnji Cooper { _PATH_MEM, PATH_DEV | PATH_ROOT }, 8357718be8SEnji Cooper { _PATH_MIXER, PATH_DEV }, 8457718be8SEnji Cooper { _PATH_MIXER0, PATH_DEV }, 8557718be8SEnji Cooper { _PATH_NOLOGIN, PATH_FILE }, 86*640235e2SEnji Cooper { _PATH_POWER, PATH_DEV | PATH_ROOT | PATH_OPT }, 8757718be8SEnji Cooper { _PATH_PRINTCAP, PATH_FILE }, 8857718be8SEnji Cooper { _PATH_PUD, PATH_DEV | PATH_ROOT }, 8957718be8SEnji Cooper { _PATH_PUFFS, PATH_DEV | PATH_ROOT }, 9057718be8SEnji Cooper { _PATH_RANDOM, PATH_DEV }, 9157718be8SEnji Cooper { _PATH_SENDMAIL, PATH_FILE }, 9257718be8SEnji Cooper { _PATH_SHELLS, PATH_FILE }, 9357718be8SEnji Cooper { _PATH_SKEYKEYS, PATH_FILE | PATH_ROOT }, 9457718be8SEnji Cooper { _PATH_SOUND, PATH_DEV }, 9557718be8SEnji Cooper { _PATH_SOUND0, PATH_DEV }, 96*640235e2SEnji Cooper { _PATH_SYSMON, PATH_DEV | PATH_OPT }, 9757718be8SEnji Cooper { _PATH_TTY, PATH_DEV }, 9857718be8SEnji Cooper { _PATH_UNIX, PATH_FILE | PATH_ROOT }, 9957718be8SEnji Cooper { _PATH_URANDOM, PATH_DEV }, 10057718be8SEnji Cooper { _PATH_VIDEO, PATH_DEV }, 10157718be8SEnji Cooper { _PATH_VIDEO0, PATH_DEV }, 102*640235e2SEnji Cooper { _PATH_WATCHDOG, PATH_DEV | PATH_OPT }, 10357718be8SEnji Cooper 10457718be8SEnji Cooper { _PATH_DEV, PATH_DIR }, 10557718be8SEnji Cooper { _PATH_DEV_PTS, PATH_DIR }, 10657718be8SEnji Cooper { _PATH_EMUL_AOUT, PATH_DIR }, 10757718be8SEnji Cooper { _PATH_TMP, PATH_DIR }, 10857718be8SEnji Cooper { _PATH_VARDB, PATH_DIR }, 10957718be8SEnji Cooper { _PATH_VARRUN, PATH_DIR }, 11057718be8SEnji Cooper { _PATH_VARTMP, PATH_DIR }, 11157718be8SEnji Cooper 11257718be8SEnji Cooper { _PATH_BSHELL, PATH_FILE }, 11357718be8SEnji Cooper { _PATH_CSHELL, PATH_FILE }, 11457718be8SEnji Cooper { _PATH_VI, PATH_FILE }, 11557718be8SEnji Cooper }; 11657718be8SEnji Cooper 11757718be8SEnji Cooper ATF_TC(paths); 11857718be8SEnji Cooper ATF_TC_HEAD(paths, tc) 11957718be8SEnji Cooper { 12057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "A basic test for <paths.h>"); 12157718be8SEnji Cooper } 12257718be8SEnji Cooper 12357718be8SEnji Cooper ATF_TC_BODY(paths, tc) 12457718be8SEnji Cooper { 12557718be8SEnji Cooper struct stat st; 12657718be8SEnji Cooper uid_t uid; 12757718be8SEnji Cooper mode_t m; 12857718be8SEnji Cooper size_t i; 12957718be8SEnji Cooper int fd; 13057718be8SEnji Cooper 13157718be8SEnji Cooper #if defined(__sparc__) 13257718be8SEnji Cooper atf_tc_skip("PR port-sparc/45580"); 13357718be8SEnji Cooper #endif 13457718be8SEnji Cooper 13557718be8SEnji Cooper uid = getuid(); 13657718be8SEnji Cooper 13757718be8SEnji Cooper for (i = 0; i < __arraycount(paths); i++) { 13857718be8SEnji Cooper 13957718be8SEnji Cooper (void)fprintf(stderr, "testing '%s'\n", paths[i].path); 14057718be8SEnji Cooper 14157718be8SEnji Cooper errno = 0; 14257718be8SEnji Cooper fd = open(paths[i].path, O_RDONLY); 14357718be8SEnji Cooper 14457718be8SEnji Cooper if (fd < 0) { 14557718be8SEnji Cooper 14657718be8SEnji Cooper switch (errno) { 14757718be8SEnji Cooper 148*640235e2SEnji Cooper case ENODEV: 149*640235e2SEnji Cooper if ((paths[i].flags & PATH_OPT) == 0) { 150*640235e2SEnji Cooper 151*640235e2SEnji Cooper atf_tc_fail("Required path %s does " 152*640235e2SEnji Cooper "not exist", paths[i].path); 153*640235e2SEnji Cooper } 154*640235e2SEnji Cooper break; 155*640235e2SEnji Cooper 15657718be8SEnji Cooper case EPERM: /* FALLTHROUGH */ 15757718be8SEnji Cooper case EACCES: /* FALLTHROUGH */ 15857718be8SEnji Cooper 15957718be8SEnji Cooper if ((paths[i].flags & PATH_ROOT) == 0) { 16057718be8SEnji Cooper 161*640235e2SEnji Cooper atf_tc_fail("UID %u failed to open %s, " 162*640235e2SEnji Cooper "error %d", (uint32_t)uid, 163*640235e2SEnji Cooper paths[i].path, errno); 16457718be8SEnji Cooper } 16557718be8SEnji Cooper 16657718be8SEnji Cooper case EBUSY: /* FALLTHROUGH */ 16757718be8SEnji Cooper case ENXIO: /* FALLTHROUGH */ 16857718be8SEnji Cooper case ENOENT: /* FALLTHROUGH */ 16957718be8SEnji Cooper 17057718be8SEnji Cooper default: 17157718be8SEnji Cooper continue; 17257718be8SEnji Cooper } 17357718be8SEnji Cooper } 17457718be8SEnji Cooper 17557718be8SEnji Cooper (void)memset(&st, 0, sizeof(struct stat)); 17657718be8SEnji Cooper 17757718be8SEnji Cooper ATF_REQUIRE(fstat(fd, &st) == 0); 17857718be8SEnji Cooper 17957718be8SEnji Cooper m = st.st_mode; 18057718be8SEnji Cooper 18157718be8SEnji Cooper if ((paths[i].flags & PATH_DEV) != 0) { 18257718be8SEnji Cooper 18357718be8SEnji Cooper ATF_CHECK(S_ISBLK(m) != 0 || S_ISCHR(m) != 0); 18457718be8SEnji Cooper 18557718be8SEnji Cooper ATF_CHECK((paths[i].flags & PATH_DIR) == 0); 18657718be8SEnji Cooper ATF_CHECK((paths[i].flags & PATH_FILE) == 0); 18757718be8SEnji Cooper } 18857718be8SEnji Cooper 18957718be8SEnji Cooper if ((paths[i].flags & PATH_DIR) != 0) { 19057718be8SEnji Cooper 19157718be8SEnji Cooper ATF_CHECK(S_ISDIR(m) != 0); 19257718be8SEnji Cooper 19357718be8SEnji Cooper ATF_CHECK((paths[i].flags & PATH_DEV) == 0); 19457718be8SEnji Cooper ATF_CHECK((paths[i].flags & PATH_FILE) == 0); 19557718be8SEnji Cooper } 19657718be8SEnji Cooper 19757718be8SEnji Cooper if ((paths[i].flags & PATH_FILE) != 0) { 19857718be8SEnji Cooper 19957718be8SEnji Cooper ATF_CHECK(S_ISREG(m) != 0); 20057718be8SEnji Cooper 20157718be8SEnji Cooper ATF_CHECK((paths[i].flags & PATH_DEV) == 0); 20257718be8SEnji Cooper ATF_CHECK((paths[i].flags & PATH_DIR) == 0); 20357718be8SEnji Cooper } 20457718be8SEnji Cooper 20557718be8SEnji Cooper ATF_REQUIRE(close(fd) == 0); 20657718be8SEnji Cooper } 20757718be8SEnji Cooper } 20857718be8SEnji Cooper 20957718be8SEnji Cooper ATF_TP_ADD_TCS(tp) 21057718be8SEnji Cooper { 21157718be8SEnji Cooper 21257718be8SEnji Cooper ATF_TP_ADD_TC(tp, paths); 21357718be8SEnji Cooper 21457718be8SEnji Cooper return atf_no_error(); 21557718be8SEnji Cooper } 216