#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>

#define DUMMY_STR "AAAaaaBBBbbb"
int main() 
{ 
	FILE *file; 
	file = fopen("/dir1/f1.txt","w+b");
	if (file == NULL)
		printf ("Failed to open file \n");
	fprintf(file,"%s","hello, world\n"); 
	fclose(file); 

	int fd = open("../../..//////dir1/test.txt", O_RDWR | O_CREAT );
	char rbuf[256] = {0}, wbuf[256] = {0};
	int retval;
	retval = read(fd, rbuf, 16);
	printf("Tried to read, got %d bytes of buf: %s\n", retval, rbuf);
	strcpy(wbuf, DUMMY_STR);
	retval = write(fd, wbuf, strlen(DUMMY_STR));
	printf("Tried to write, wrote %d bytes\n", retval);

	printf("Trying to seek to 0\n");
	lseek(fd, 0, SEEK_SET);
	retval = read(fd, rbuf, 64);
	printf("Tried to read again, got %d bytes of buf: %s\n", retval, rbuf);
	if (strcmp(DUMMY_STR, rbuf)) {
		printf("Failed to read back our dummy string!\n");
		return -1;
	}
	printf("Trying to lseek64 to 0\n");
	lseek64(fd, 0, SEEK_SET);
	retval = read(fd, rbuf, 64);
	printf("Tried to read again, got %d bytes of buf: %s\n", retval, rbuf);
	if (strcmp(DUMMY_STR, rbuf)) {
		printf("Failed to read back our dummy string!\n");
		return -1;
	}

	retval = access("/bin/laden", X_OK);
	if (errno != ENOENT)
		printf("WARNING! Access error for Osama!\n");
	retval = access("////../../////dir1/f1.txt", R_OK);
	if (retval < 0)
		printf("WARNING! Access error for f1.txt!\n");

	struct stat st = {0};
	//retval = stat("/bin/mhello", &st);
	retval = fstat(fd, &st);
	printf("Tried to stat, was told %d\n", retval);
	#if 0
	printf("STAT RESULTS\n---------------------\n");
	printf("dev       : %d\n", st.st_dev);
	printf("ino       : %d\n", st.st_ino);
	printf("mode      : %d\n", st.st_mode);
	printf("nlink     : %d\n", st.st_nlink);
	printf("uid       : %d\n", st.st_uid);
	printf("gid       : %d\n", st.st_gid);
	printf("rdev      : %d\n", st.st_rdev);
	printf("size      : %d\n", st.st_size);
	printf("blksize   : %d\n", st.st_blksize);
	printf("blocks    : %d\n", st.st_blocks);
	printf("atime     : %d\n", st.st_atime);
	printf("mtime     : %d\n", st.st_mtime);
	printf("ctime     : %d\n", st.st_ctime);
	#endif

	retval = symlink("/dir1/random.txt", "/dir2/sym-test");
	if (retval < 0)
		printf("WARNING! Symlink creation failed!\n");
	retval = readlink("/dir2/sym-test", rbuf, 256);
	if (retval < 0)
		printf("WARNING! Readlink failed!\n");
	else
		printf("Readlink read %d bytes\n", retval);
	
	/* Readdir tests: two ways to do it: */
	DIR *dir = opendir("/dir1/");
	struct dirent dirent_r, *dirent, *result = 0;
	#if 0
	dirent = readdir(dir);
	printf("Readdir: d_ino %lld, d_off: %lld, d_reclen: %d, d_name: %s\n",
	       dirent->d_ino, dirent->d_off, dirent->d_reclen, dirent->d_name);
	printf("TAKE TWO:\n-----------\n");
	dirent = readdir(dir);
	printf("Readdir: d_ino %lld, d_off: %lld, d_reclen: %d, d_name: %s\n",
	       dirent->d_ino, dirent->d_off, dirent->d_reclen, dirent->d_name);
	#endif

	retval = readdir_r(dir, &dirent_r, &result);
	if (retval > 0)
		printf("WARNING! Readdir_r failed!, retval %d\n", retval);
	if (!result)
		printf("End of the directory\n");
	else
		printf("Dirent name: %s\n", result->d_name);
	printf("TAKE TWO:\n-----------\n");
	memset(&dirent_r, 0, sizeof(struct dirent));
	retval = readdir_r(dir, &dirent_r, &result);
	if (retval > 0)
		printf("WARNING! Readdir_r failed!, retval %d\n", retval);
	if (!result)
		printf("End of the directory\n");
	else
		printf("Dirent name: %s\n", result->d_name);
	closedir(dir);
	
	/* Hardlink tests */
	printf("Linking to /bin/hello at /dir1/hardhello\n");
	retval = link("/bin/hello", "/dir1/hardhello");
	if (retval < 0)
		printf("WARNING! Link failed!\n");
	//breakpoint();
	printf("Now unlinking /dir1/hardhello\n");
	retval = unlink("/dir1/hardhello");
	if (retval < 0)
		printf("WARNING! Unlink failed!\n");
	printf("Linking to /bin/hello at /bin/hardhello2\n");
	retval = link("/bin/hello", "/bin/hardhello2");
	if (retval < 0)
		printf("WARNING! Link failed!\n");
	printf("Now unlinking symlink /dir2/sym-test\n");
	retval = unlink("/dir2/sym-test");
	if (retval < 0)
		printf("WARNING! Unlink failed!\n");

	/* getcwd, on the root dir */
	char *cwd = getcwd(0, 0);
	if (!cwd)
		printf("WARNING! Couldn't get a CWD!\n");
	else
		printf("Got CWD (/): %s\n", cwd);
	free(cwd);
	/* chdir() tests */
	printf("Testing basic chdir\n");
	retval = access("dir1/f1.txt", R_OK);
	if (retval < 0)
		printf("WARNING! Access error for dir1/f1.txt!\n");
	fd = open("/dir1", O_RDONLY);
	printf("OPENED DIR1, got fd %d\n", fd);
	if (fd < 1)
		printf("WARNING!, failed to open /dir1!\n");
	retval = fchdir(fd);
	if (retval < 0)
		printf("WARNING! fchdir failed for /dir1!\n");
	close(fd);
	retval = access("f1.txt", R_OK);
	if (retval < 0)
		printf("WARNING! Access error for f1.txt!\n");
	cwd = getcwd(0, 0);
	if (!cwd)
		printf("WARNING! Couldn't get a CWD!\n");
	else
		printf("Got CWD (/dir1/): %s\n", cwd);
	free(cwd);
	/* change to a weird directory, see if we can still getcwd() */
	retval = chdir("../dir2/../dir1/dir1-1");
	if (retval < 0)
		printf("WARNING! Chdir failed for dir1-1!\n");
	cwd = getcwd(0, 0);
	if (!cwd)
		printf("WARNING! Couldn't get a CWD!\n");
	else
		printf("Got CWD (/dir1/dir1-1/): %s\n", cwd);
	free(cwd);
	fd = open("/hello.txt", O_RDONLY);
	if (fd < 1)
		printf("WARNING! failed to open hello.txt!\n");
	retval = fchdir(fd);
	if (!retval || errno != ENOTDIR)
		printf("WARNING! didn't fail to fchdir to hello.txt %d %d\n", retval,
		       errno);
	close(fd);

	/* Try a chmod() */
	printf("Trying a chmod\n");
	retval = chmod("/dir1/dir1-1/f1-1.txt", S_IRWXO);
	if (retval < 0)
		printf("WARNING! chmod failed with %d!\n", errno);

	/* Try adding a directory or two! */
	printf("Add dir3 and dir4, then remove dir4\n");
	retval = mkdir("/dir3", S_IRWXU | S_IRWXG | S_IRWXO);
	if (retval < 0)
		printf("WARNING! mkdir failed with %d!\n", errno);
	retval = mkdir("/dir4", S_IRWXU | S_IRWXG | S_IRWXO);
	if (retval < 0)
		printf("WARNING! mkdir failed with %d!\n", errno);
	retval = rmdir("/dir4");
	if (retval < 0)
		printf("WARNING! rmdir failed with %d!\n", errno);
	breakpoint();

}
