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