| #define _LARGEFILE64_SOURCE /* needed to use lseek64 */ | 
 |  | 
 | #include <stdio.h>  | 
 | #include <sys/types.h> | 
 | #include <sys/stat.h> | 
 | #include <fcntl.h> | 
 | #include <parlib/arch/arch.h> | 
 | #include <unistd.h> | 
 | #include <errno.h> | 
 | #include <dirent.h> | 
 | #include <stdlib.h> | 
 | #include <string.h> | 
 | #include <parlib/parlib.h> | 
 |  | 
 | #include <utest/utest.h> | 
 |  | 
 | TEST_SUITE("FILE POSIX"); | 
 |  | 
 | /* <--- Begin definition of test cases ---> */ | 
 |  | 
 | bool test_openat(void) | 
 | { | 
 | 	int dfd = open("/dir1", O_RDONLY); | 
 | 	UT_ASSERT(dfd >= 0); | 
 |  | 
 | 	int ffd = openat(dfd, "f1.txt", O_RDWR); | 
 | 	UT_ASSERT(ffd >= 0, close(dfd)); | 
 |  | 
 | 	close(ffd); | 
 | 	close(dfd); | 
 | 	return TRUE; | 
 | } | 
 |  | 
 | /* This tests opening a lot of files, enough to grow our file/chan table, then | 
 |  * forking/spawning with DUP_FGRP.  It caused a panic at one point. */ | 
 | bool test_open_lots_and_spawn(void) | 
 | { | 
 | 	char *p_argv[] = {0, 0, 0}; | 
 | 	char *p_envp[] = {"LD_LIBRARY_PATH=/lib", 0}; | 
 | 	#define NR_LOOPS 128 | 
 | 	int fd[NR_LOOPS]; | 
 | 	int pid; | 
 | 	const char *filename = "/bin/hello"; | 
 |  | 
 | 	/* the kernel-internal number is 32 at the moment. */ | 
 | 	for (int i = 0; i < NR_LOOPS; i++) { | 
 | 		fd[i] = open("hello.txt", O_RDONLY); | 
 | 		UT_ASSERT(fd[i] >= 0); | 
 | 	} | 
 | 	pid = sys_proc_create(filename, strlen(filename), p_argv, p_envp, | 
 | 	                      PROC_DUP_FGRP); | 
 | 	UT_ASSERT(pid > 0); | 
 | 	sys_proc_destroy(pid, 0); | 
 | 	for (int i = 0; i < NR_LOOPS; i++) | 
 | 		close(fd[i]); | 
 | 	return TRUE; | 
 | } | 
 |  | 
 | bool test_pipe_dup2(void) | 
 | { | 
 | 	int pipefd[2]; | 
 | 	int ret; | 
 |  | 
 | 	ret = pipe(pipefd); | 
 | 	UT_ASSERT(!ret); | 
 | 	ret = dup2(pipefd[0], 100); | 
 | 	UT_ASSERT(ret == 100); | 
 | 	ret = close(100); | 
 | 	UT_ASSERT(!ret); | 
 | 	ret = close(pipefd[0]); | 
 | 	UT_ASSERT(!ret); | 
 | 	ret = close(pipefd[1]); | 
 | 	UT_ASSERT(!ret); | 
 | 	return TRUE; | 
 | } | 
 |  | 
 | /* <--- End definition of test cases ---> */ | 
 |  | 
 | struct utest utests[] = { | 
 | 	UTEST_REG(openat), | 
 | 	UTEST_REG(open_lots_and_spawn), | 
 | 	UTEST_REG(pipe_dup2), | 
 | }; | 
 | int num_utests = sizeof(utests) / sizeof(struct utest); | 
 |  | 
 | int main(int argc, char *argv[]) | 
 | { | 
 | 	char **whitelist = &argv[1]; | 
 | 	int whitelist_len = argc - 1; | 
 |  | 
 | 	RUN_TEST_SUITE(utests, num_utests, whitelist, whitelist_len); | 
 | } |