1*57718be8SEnji Cooper /* $NetBSD: t_basic.c,v 1.3 2010/05/31 23:44:54 pooka Exp $ */ 2*57718be8SEnji Cooper 3*57718be8SEnji Cooper #include <sys/types.h> 4*57718be8SEnji Cooper #include <sys/mount.h> 5*57718be8SEnji Cooper #include <sys/module.h> 6*57718be8SEnji Cooper #include <sys/dirent.h> 7*57718be8SEnji Cooper #include <sys/sysctl.h> 8*57718be8SEnji Cooper 9*57718be8SEnji Cooper #include <atf-c.h> 10*57718be8SEnji Cooper #include <err.h> 11*57718be8SEnji Cooper #include <errno.h> 12*57718be8SEnji Cooper #include <fcntl.h> 13*57718be8SEnji Cooper #include <stdio.h> 14*57718be8SEnji Cooper #include <unistd.h> 15*57718be8SEnji Cooper #include <string.h> 16*57718be8SEnji Cooper #include <stdlib.h> 17*57718be8SEnji Cooper 18*57718be8SEnji Cooper #include <rump/rump.h> 19*57718be8SEnji Cooper #include <rump/rump_syscalls.h> 20*57718be8SEnji Cooper 21*57718be8SEnji Cooper #include <miscfs/kernfs/kernfs.h> 22*57718be8SEnji Cooper 23*57718be8SEnji Cooper #include "../../h_macros.h" 24*57718be8SEnji Cooper 25*57718be8SEnji Cooper ATF_TC(getdents); 26*57718be8SEnji Cooper ATF_TC_HEAD(getdents, tc) 27*57718be8SEnji Cooper { 28*57718be8SEnji Cooper 29*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "kernfs directory contains files"); 30*57718be8SEnji Cooper } 31*57718be8SEnji Cooper 32*57718be8SEnji Cooper static void 33*57718be8SEnji Cooper mountkernfs(void) 34*57718be8SEnji Cooper { 35*57718be8SEnji Cooper 36*57718be8SEnji Cooper rump_init(); 37*57718be8SEnji Cooper 38*57718be8SEnji Cooper if (rump_sys_mkdir("/kern", 0777) == -1) 39*57718be8SEnji Cooper atf_tc_fail_errno("mkdir /kern"); 40*57718be8SEnji Cooper if (rump_sys_mount(MOUNT_KERNFS, "/kern", 0, NULL, 0) == -1) 41*57718be8SEnji Cooper atf_tc_fail_errno("could not mount kernfs"); 42*57718be8SEnji Cooper } 43*57718be8SEnji Cooper 44*57718be8SEnji Cooper ATF_TC_BODY(getdents, tc) 45*57718be8SEnji Cooper { 46*57718be8SEnji Cooper struct dirent *dent; 47*57718be8SEnji Cooper char buf[8192]; 48*57718be8SEnji Cooper int dfd; 49*57718be8SEnji Cooper 50*57718be8SEnji Cooper mountkernfs(); 51*57718be8SEnji Cooper 52*57718be8SEnji Cooper if ((dfd = rump_sys_open("/kern", O_RDONLY)) == -1) 53*57718be8SEnji Cooper atf_tc_fail_errno("can't open directory"); 54*57718be8SEnji Cooper if (rump_sys_getdents(dfd, buf, sizeof(buf)) == -1) 55*57718be8SEnji Cooper atf_tc_fail_errno("getdents"); 56*57718be8SEnji Cooper 57*57718be8SEnji Cooper /* 58*57718be8SEnji Cooper * Check that we get the first three values (., .., boottime). 59*57718be8SEnji Cooper * Make more complete by autogenerating list from kernfs_vnops.c? 60*57718be8SEnji Cooper */ 61*57718be8SEnji Cooper dent = (void *)buf; 62*57718be8SEnji Cooper ATF_REQUIRE_STREQ(dent->d_name, "."); 63*57718be8SEnji Cooper dent = _DIRENT_NEXT(dent); 64*57718be8SEnji Cooper ATF_REQUIRE_STREQ(dent->d_name, ".."); 65*57718be8SEnji Cooper dent = _DIRENT_NEXT(dent); 66*57718be8SEnji Cooper ATF_REQUIRE_STREQ(dent->d_name, "boottime"); 67*57718be8SEnji Cooper 68*57718be8SEnji Cooper /* done */ 69*57718be8SEnji Cooper } 70*57718be8SEnji Cooper 71*57718be8SEnji Cooper ATF_TC(hostname); 72*57718be8SEnji Cooper ATF_TC_HEAD(hostname, tc) 73*57718be8SEnji Cooper { 74*57718be8SEnji Cooper 75*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "/kern/hostname changes hostname"); 76*57718be8SEnji Cooper } 77*57718be8SEnji Cooper 78*57718be8SEnji Cooper static char * 79*57718be8SEnji Cooper getthehost(void) 80*57718be8SEnji Cooper { 81*57718be8SEnji Cooper static char buf[8192]; 82*57718be8SEnji Cooper int mib[2]; 83*57718be8SEnji Cooper size_t blen; 84*57718be8SEnji Cooper 85*57718be8SEnji Cooper mib[0] = CTL_KERN; 86*57718be8SEnji Cooper mib[1] = KERN_HOSTNAME; 87*57718be8SEnji Cooper blen = sizeof(buf); 88*57718be8SEnji Cooper if (rump_sys___sysctl(mib, 2, buf, &blen, NULL, 0) == -1) 89*57718be8SEnji Cooper atf_tc_fail_errno("sysctl gethostname"); 90*57718be8SEnji Cooper 91*57718be8SEnji Cooper return buf; 92*57718be8SEnji Cooper } 93*57718be8SEnji Cooper 94*57718be8SEnji Cooper #define NEWHOSTNAME "turboton roos-berg" 95*57718be8SEnji Cooper ATF_TC_BODY(hostname, tc) 96*57718be8SEnji Cooper { 97*57718be8SEnji Cooper char buf[8192]; 98*57718be8SEnji Cooper char *shost, *p; 99*57718be8SEnji Cooper int fd; 100*57718be8SEnji Cooper 101*57718be8SEnji Cooper mountkernfs(); 102*57718be8SEnji Cooper if ((fd = rump_sys_open("/kern/hostname", O_RDWR)) == -1) 103*57718be8SEnji Cooper atf_tc_fail_errno("open hostname"); 104*57718be8SEnji Cooper 105*57718be8SEnji Cooper /* check initial match */ 106*57718be8SEnji Cooper shost = getthehost(); 107*57718be8SEnji Cooper buf[0] = '\0'; 108*57718be8SEnji Cooper if (rump_sys_read(fd, buf, sizeof(buf)) == -1) 109*57718be8SEnji Cooper atf_tc_fail_errno("read hostname"); 110*57718be8SEnji Cooper p = strchr(buf, '\n'); 111*57718be8SEnji Cooper if (p) 112*57718be8SEnji Cooper *p = '\0'; 113*57718be8SEnji Cooper ATF_REQUIRE_STREQ_MSG(buf, shost, "initial hostname mismatch"); 114*57718be8SEnji Cooper 115*57718be8SEnji Cooper /* check changing hostname works */ 116*57718be8SEnji Cooper if (rump_sys_pwrite(fd, NEWHOSTNAME, strlen(NEWHOSTNAME), 0) 117*57718be8SEnji Cooper != strlen(NEWHOSTNAME)) { 118*57718be8SEnji Cooper atf_tc_fail_errno("write new hostname"); 119*57718be8SEnji Cooper } 120*57718be8SEnji Cooper 121*57718be8SEnji Cooper shost = getthehost(); 122*57718be8SEnji Cooper ATF_REQUIRE_STREQ_MSG(NEWHOSTNAME, shost, "modified hostname mismatch"); 123*57718be8SEnji Cooper 124*57718be8SEnji Cooper /* done */ 125*57718be8SEnji Cooper } 126*57718be8SEnji Cooper 127*57718be8SEnji Cooper ATF_TP_ADD_TCS(tp) 128*57718be8SEnji Cooper { 129*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, hostname); 130*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, getdents); 131*57718be8SEnji Cooper 132*57718be8SEnji Cooper return atf_no_error(); 133*57718be8SEnji Cooper } 134