blob: b0f3738790700952b3c5da9a7c4c81f6df9efdb2 [file] [log] [blame]
#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;
}