1314817Sngie/*	$NetBSD: t_pathconvert.c,v 1.6 2017/01/13 21:30:40 christos Exp $	*/
2272343Sngie
3272343Sngie#include <sys/types.h>
4272343Sngie#include <sys/mount.h>
5272343Sngie
6272343Sngie#include <atf-c.h>
7272343Sngie#include <dirent.h>
8272343Sngie#include <errno.h>
9272343Sngie#include <fcntl.h>
10272343Sngie#include <limits.h>
11272343Sngie#include <stdio.h>
12272343Sngie#include <stdlib.h>
13272343Sngie#include <unistd.h>
14272343Sngie#include <string.h>
15272343Sngie
16272343Sngie#include <rump/rump.h>
17272343Sngie#include <rump/rump_syscalls.h>
18272343Sngie
19272343Sngie#include <fs/hfs/hfs.h>
20272343Sngie
21314817Sngie#include "h_macros.h"
22272343Sngie
23272343SngieATF_TC(colonslash);
24272343SngieATF_TC_HEAD(colonslash, tc)
25272343Sngie{
26272343Sngie	atf_tc_set_md_var(tc, "descr", "HFS+ colons/slashes (PR kern/44523)");
27272343Sngie	atf_tc_set_md_var(tc, "timeout", "20");
28272343Sngie}
29272343Sngie
30272343Sngie#define IMGNAME "colon.hfs"
31272343Sngie#define FAKEBLK "/dev/blk"
32272343Sngie#define FUNNY_FILENAME "foo:bar"
33272343SngieATF_TC_BODY(colonslash, tc)
34272343Sngie{
35272343Sngie	struct hfs_args args;
36272343Sngie	int dirfd, fd;
37272343Sngie	char thecmd[1024];
38272343Sngie	char buf[DIRBLKSIZ];
39272343Sngie	struct dirent *dirent;
40272343Sngie	int offset, nbytes;
41272343Sngie	bool ok = false;
42272343Sngie
43272343Sngie	snprintf(thecmd, sizeof(thecmd), "uudecode %s/colon.hfs.bz2.uue",
44272343Sngie	    atf_tc_get_config_var(tc, "srcdir"));
45272343Sngie	RZ(system(thecmd));
46272343Sngie
47272343Sngie	snprintf(thecmd, sizeof(thecmd), "bunzip2 " IMGNAME ".bz2");
48272343Sngie	RZ(system(thecmd));
49272343Sngie
50272343Sngie	memset(&args, 0, sizeof args);
51272343Sngie	args.fspec = __UNCONST(FAKEBLK);
52272343Sngie	RZ(rump_init());
53272343Sngie
54272343Sngie	RL(rump_sys_mkdir("/mp", 0777));
55272343Sngie	RZ(rump_pub_etfs_register(FAKEBLK, IMGNAME, RUMP_ETFS_BLK));
56272343Sngie	RL(rump_sys_mount(MOUNT_HFS, "/mp", 0, &args, sizeof args));
57272343Sngie
58272343Sngie	RL(dirfd = rump_sys_open("/mp", O_RDONLY));
59272343Sngie
60272343Sngie	RL(nbytes = rump_sys_getdents(dirfd, buf, sizeof buf));
61272343Sngie
62272343Sngie	for (offset = 0; offset < nbytes; offset += dirent->d_reclen) {
63272343Sngie		dirent = (struct dirent *)(buf + offset);
64272343Sngie		if (strchr(dirent->d_name, '/'))
65272343Sngie			atf_tc_fail("dirent with slash: %s", dirent->d_name);
66272343Sngie		if (0 == strcmp(FUNNY_FILENAME, dirent->d_name))
67272343Sngie			ok = true;
68272343Sngie	}
69272343Sngie
70272343Sngie	if (!ok)
71272343Sngie		atf_tc_fail("no dirent for file: %s", FUNNY_FILENAME);
72272343Sngie
73272343Sngie	RL(rump_sys_close(dirfd));
74272343Sngie	RL(fd = rump_sys_open("/mp/" FUNNY_FILENAME, O_RDONLY));
75272343Sngie	RL(rump_sys_close(fd));
76272343Sngie	RL(rump_sys_unmount("/mp", 0));
77272343Sngie}
78272343Sngie
79272343SngieATF_TP_ADD_TCS(tp)
80272343Sngie{
81272343Sngie	ATF_TP_ADD_TC(tp, colonslash);
82272343Sngie	return 0;
83272343Sngie}
84