#define _LARGEFILE64_SOURCE /* needed to use lseek64 */

#include <stdio.h> 
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <arch/arch.h>
#include <unistd.h>
#include <errno.h>
#include <dirent.h>
#include <stdlib.h>
#include <string.h>
#include <ros/syscall.h>
#include <parlib.h>

/* Test the childfdmap system call.
 * Create a pipe, start the spawn, dup the pipes over fd 0 and 1, write
 * to it, see that you get the same back.
 */
char filename[512];
int main(int argc, char *argv[]) 
{ 
	struct childfdmap childfdmap[3];
	int ret;
	int flag = 0;
	int kid;
	int talk[2];
	char hi[3] = {0};
	char *child_argv[3];

	/* detect the child by the number of args. */
	if (argc > 1) {
		read(0, hi, 3);
		assert(!strcmp(hi, "HI"));
		/* pass something else back */
		hi[0] = 'Y';
		hi[1] = 'O';
		hi[2] = '\0';
		write(1, hi, 3);
		exit(0);
	}

	if (pipe(talk) < 0) {
		perror("pipe");
		exit(1);
	}
	printd("pipe [%d, %d]\n", talk[0], talk[1]);

	/* parent will read and write on talk[0], and the child does the same for
	 * talk[1].  internally, writing to talk 0 gets read on talk 1.  the child
	 * gets talk1 mapped for both stdin (fd 0) and stdout (fd 1). */
	childfdmap[0].parentfd = talk[1];
	childfdmap[0].childfd = 0;
	childfdmap[1].parentfd = talk[1];
	childfdmap[1].childfd = 1;

	sprintf(filename, "/bin/%s", argv[0]);
	child_argv[0] = filename;
	child_argv[1] = "1"; /* dummy arg, signal so we know they're the child */
	child_argv[2] = 0;

	kid = sys_proc_create(filename, strlen(filename), child_argv, NULL, 0);
	if (kid < 0) {
		perror("create failed");
		exit(1);
	}

	ret = syscall(SYS_dup_fds_to, kid, childfdmap, 2);
	if (ret != 2) {
		perror("childfdmap faled");
		exit(2);
	}

	/* close the pipe endpoint that we duped in the child.  it doesn't matter
	 * for this test, but after the child exits, the pipe will still be open
	 * unless we close our side of it. */
	close(talk[1]);

	sys_proc_run(kid);

	if (write(talk[0], "HI", 3) < 3) {
		perror("write HI");
		exit(3);
	}

	if (read(talk[0], hi, 3) < 3) {
		perror("read YO");
		exit(4);
	}
	assert(!strcmp(hi, "YO"));

	printf("Passed\n");

	return 0;
}
