|  | #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> | 
|  |  | 
|  | #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); | 
|  |  | 
|  | /* 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"); | 
|  | retval = chdir("/dir1"); | 
|  | if (retval < 0) | 
|  | printf("WARNING! Chdir failed for /dir1!\n"); | 
|  | 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); | 
|  |  | 
|  | /* 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(); | 
|  |  | 
|  | } |