xref: /netbsd-src/tests/fs/hfs/t_pathconvert.c (revision ef23f679e4b4ab77b4afae233ccf5f85cfb01ba6)
1*ef23f679Sriastradh /*	$NetBSD: t_pathconvert.c,v 1.8 2023/11/24 17:31:03 riastradh Exp $	*/
27e9c3f5cSpooka 
37e9c3f5cSpooka #include <sys/types.h>
47e9c3f5cSpooka #include <sys/mount.h>
57e9c3f5cSpooka 
67e9c3f5cSpooka #include <atf-c.h>
77e9c3f5cSpooka #include <dirent.h>
87e9c3f5cSpooka #include <errno.h>
97e9c3f5cSpooka #include <fcntl.h>
107e9c3f5cSpooka #include <limits.h>
117e9c3f5cSpooka #include <stdio.h>
127e9c3f5cSpooka #include <stdlib.h>
137e9c3f5cSpooka #include <unistd.h>
147e9c3f5cSpooka #include <string.h>
157e9c3f5cSpooka 
167e9c3f5cSpooka #include <rump/rump.h>
177e9c3f5cSpooka #include <rump/rump_syscalls.h>
187e9c3f5cSpooka 
197e9c3f5cSpooka #include <fs/hfs/hfs.h>
207e9c3f5cSpooka 
21c54cb811Schristos #include "h_macros.h"
227e9c3f5cSpooka 
237e9c3f5cSpooka ATF_TC(colonslash);
ATF_TC_HEAD(colonslash,tc)247e9c3f5cSpooka ATF_TC_HEAD(colonslash, tc)
257e9c3f5cSpooka {
267e9c3f5cSpooka 	atf_tc_set_md_var(tc, "descr", "HFS+ colons/slashes (PR kern/44523)");
2702b6060dSpooka 	atf_tc_set_md_var(tc, "timeout", "20");
287e9c3f5cSpooka }
297e9c3f5cSpooka 
307e9c3f5cSpooka #define IMGNAME "colon.hfs"
317e9c3f5cSpooka #define FAKEBLK "/dev/blk"
327e9c3f5cSpooka #define FUNNY_FILENAME "foo:bar"
ATF_TC_BODY(colonslash,tc)337e9c3f5cSpooka ATF_TC_BODY(colonslash, tc)
347e9c3f5cSpooka {
357e9c3f5cSpooka 	struct hfs_args args;
367e9c3f5cSpooka 	int dirfd, fd;
377e9c3f5cSpooka 	char thecmd[1024];
387e9c3f5cSpooka 	char buf[DIRBLKSIZ];
397e9c3f5cSpooka 	struct dirent *dirent;
407e9c3f5cSpooka 	int offset, nbytes;
417e9c3f5cSpooka 	bool ok = false;
427e9c3f5cSpooka 
437e9c3f5cSpooka 	snprintf(thecmd, sizeof(thecmd), "uudecode %s/colon.hfs.bz2.uue",
447e9c3f5cSpooka 	    atf_tc_get_config_var(tc, "srcdir"));
45*ef23f679Sriastradh 	RL(system(thecmd));
467e9c3f5cSpooka 
477e9c3f5cSpooka 	snprintf(thecmd, sizeof(thecmd), "bunzip2 " IMGNAME ".bz2");
48*ef23f679Sriastradh 	RL(system(thecmd));
497e9c3f5cSpooka 
507e9c3f5cSpooka 	memset(&args, 0, sizeof args);
517e9c3f5cSpooka 	args.fspec = __UNCONST(FAKEBLK);
527e9c3f5cSpooka 	RZ(rump_init());
537e9c3f5cSpooka 
547e9c3f5cSpooka 	RL(rump_sys_mkdir("/mp", 0777));
557e9c3f5cSpooka 	RZ(rump_pub_etfs_register(FAKEBLK, IMGNAME, RUMP_ETFS_BLK));
567e9c3f5cSpooka 	RL(rump_sys_mount(MOUNT_HFS, "/mp", 0, &args, sizeof args));
577e9c3f5cSpooka 
587e9c3f5cSpooka 	RL(dirfd = rump_sys_open("/mp", O_RDONLY));
597e9c3f5cSpooka 
607e9c3f5cSpooka 	RL(nbytes = rump_sys_getdents(dirfd, buf, sizeof buf));
617e9c3f5cSpooka 
627e9c3f5cSpooka 	for (offset = 0; offset < nbytes; offset += dirent->d_reclen) {
637e9c3f5cSpooka 		dirent = (struct dirent *)(buf + offset);
647e9c3f5cSpooka 		if (strchr(dirent->d_name, '/'))
657e9c3f5cSpooka 			atf_tc_fail("dirent with slash: %s", dirent->d_name);
667e9c3f5cSpooka 		if (0 == strcmp(FUNNY_FILENAME, dirent->d_name))
677e9c3f5cSpooka 			ok = true;
687e9c3f5cSpooka 	}
697e9c3f5cSpooka 
707e9c3f5cSpooka 	if (!ok)
717e9c3f5cSpooka 		atf_tc_fail("no dirent for file: %s", FUNNY_FILENAME);
727e9c3f5cSpooka 
737e9c3f5cSpooka 	RL(rump_sys_close(dirfd));
747e9c3f5cSpooka 	RL(fd = rump_sys_open("/mp/" FUNNY_FILENAME, O_RDONLY));
757e9c3f5cSpooka 	RL(rump_sys_close(fd));
767e9c3f5cSpooka 	RL(rump_sys_unmount("/mp", 0));
777e9c3f5cSpooka }
787e9c3f5cSpooka 
ATF_TP_ADD_TCS(tp)797e9c3f5cSpooka ATF_TP_ADD_TCS(tp)
807e9c3f5cSpooka {
817e9c3f5cSpooka 	ATF_TP_ADD_TC(tp, colonslash);
8236592171Smaya 	return atf_no_error();
837e9c3f5cSpooka }
84