#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();
	return 0;

}
