1272343Sngie/* $NetBSD: t_basic.c,v 1.3 2010/05/31 23:44:54 pooka Exp $ */ 2272343Sngie 3272343Sngie#include <sys/types.h> 4272343Sngie#include <sys/mount.h> 5272343Sngie#include <sys/module.h> 6272343Sngie#include <sys/dirent.h> 7272343Sngie#include <sys/sysctl.h> 8272343Sngie 9272343Sngie#include <atf-c.h> 10272343Sngie#include <err.h> 11272343Sngie#include <errno.h> 12272343Sngie#include <fcntl.h> 13272343Sngie#include <stdio.h> 14272343Sngie#include <unistd.h> 15272343Sngie#include <string.h> 16272343Sngie#include <stdlib.h> 17272343Sngie 18272343Sngie#include <rump/rump.h> 19272343Sngie#include <rump/rump_syscalls.h> 20272343Sngie 21272343Sngie#include <miscfs/kernfs/kernfs.h> 22272343Sngie 23272343Sngie#include "../../h_macros.h" 24272343Sngie 25272343SngieATF_TC(getdents); 26272343SngieATF_TC_HEAD(getdents, tc) 27272343Sngie{ 28272343Sngie 29272343Sngie atf_tc_set_md_var(tc, "descr", "kernfs directory contains files"); 30272343Sngie} 31272343Sngie 32272343Sngiestatic void 33272343Sngiemountkernfs(void) 34272343Sngie{ 35272343Sngie 36272343Sngie rump_init(); 37272343Sngie 38272343Sngie if (rump_sys_mkdir("/kern", 0777) == -1) 39272343Sngie atf_tc_fail_errno("mkdir /kern"); 40272343Sngie if (rump_sys_mount(MOUNT_KERNFS, "/kern", 0, NULL, 0) == -1) 41272343Sngie atf_tc_fail_errno("could not mount kernfs"); 42272343Sngie} 43272343Sngie 44272343SngieATF_TC_BODY(getdents, tc) 45272343Sngie{ 46272343Sngie struct dirent *dent; 47272343Sngie char buf[8192]; 48272343Sngie int dfd; 49272343Sngie 50272343Sngie mountkernfs(); 51272343Sngie 52272343Sngie if ((dfd = rump_sys_open("/kern", O_RDONLY)) == -1) 53272343Sngie atf_tc_fail_errno("can't open directory"); 54272343Sngie if (rump_sys_getdents(dfd, buf, sizeof(buf)) == -1) 55272343Sngie atf_tc_fail_errno("getdents"); 56272343Sngie 57272343Sngie /* 58272343Sngie * Check that we get the first three values (., .., boottime). 59272343Sngie * Make more complete by autogenerating list from kernfs_vnops.c? 60272343Sngie */ 61272343Sngie dent = (void *)buf; 62272343Sngie ATF_REQUIRE_STREQ(dent->d_name, "."); 63272343Sngie dent = _DIRENT_NEXT(dent); 64272343Sngie ATF_REQUIRE_STREQ(dent->d_name, ".."); 65272343Sngie dent = _DIRENT_NEXT(dent); 66272343Sngie ATF_REQUIRE_STREQ(dent->d_name, "boottime"); 67272343Sngie 68272343Sngie /* done */ 69272343Sngie} 70272343Sngie 71272343SngieATF_TC(hostname); 72272343SngieATF_TC_HEAD(hostname, tc) 73272343Sngie{ 74272343Sngie 75272343Sngie atf_tc_set_md_var(tc, "descr", "/kern/hostname changes hostname"); 76272343Sngie} 77272343Sngie 78272343Sngiestatic char * 79272343Sngiegetthehost(void) 80272343Sngie{ 81272343Sngie static char buf[8192]; 82272343Sngie int mib[2]; 83272343Sngie size_t blen; 84272343Sngie 85272343Sngie mib[0] = CTL_KERN; 86272343Sngie mib[1] = KERN_HOSTNAME; 87272343Sngie blen = sizeof(buf); 88272343Sngie if (rump_sys___sysctl(mib, 2, buf, &blen, NULL, 0) == -1) 89272343Sngie atf_tc_fail_errno("sysctl gethostname"); 90272343Sngie 91272343Sngie return buf; 92272343Sngie} 93272343Sngie 94272343Sngie#define NEWHOSTNAME "turboton roos-berg" 95272343SngieATF_TC_BODY(hostname, tc) 96272343Sngie{ 97272343Sngie char buf[8192]; 98272343Sngie char *shost, *p; 99272343Sngie int fd; 100272343Sngie 101272343Sngie mountkernfs(); 102272343Sngie if ((fd = rump_sys_open("/kern/hostname", O_RDWR)) == -1) 103272343Sngie atf_tc_fail_errno("open hostname"); 104272343Sngie 105272343Sngie /* check initial match */ 106272343Sngie shost = getthehost(); 107272343Sngie buf[0] = '\0'; 108272343Sngie if (rump_sys_read(fd, buf, sizeof(buf)) == -1) 109272343Sngie atf_tc_fail_errno("read hostname"); 110272343Sngie p = strchr(buf, '\n'); 111272343Sngie if (p) 112272343Sngie *p = '\0'; 113272343Sngie ATF_REQUIRE_STREQ_MSG(buf, shost, "initial hostname mismatch"); 114272343Sngie 115272343Sngie /* check changing hostname works */ 116272343Sngie if (rump_sys_pwrite(fd, NEWHOSTNAME, strlen(NEWHOSTNAME), 0) 117272343Sngie != strlen(NEWHOSTNAME)) { 118272343Sngie atf_tc_fail_errno("write new hostname"); 119272343Sngie } 120272343Sngie 121272343Sngie shost = getthehost(); 122272343Sngie ATF_REQUIRE_STREQ_MSG(NEWHOSTNAME, shost, "modified hostname mismatch"); 123272343Sngie 124272343Sngie /* done */ 125272343Sngie} 126272343Sngie 127272343SngieATF_TP_ADD_TCS(tp) 128272343Sngie{ 129272343Sngie ATF_TP_ADD_TC(tp, hostname); 130272343Sngie ATF_TP_ADD_TC(tp, getdents); 131272343Sngie 132272343Sngie return atf_no_error(); 133272343Sngie} 134