Adds devalarm (#A)
[akaros.git] / tests / file_test.c
1 #define _LARGEFILE64_SOURCE /* needed to use lseek64 */
2
3 #include <stdio.h> 
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <fcntl.h>
7 #include <arch/arch.h>
8 #include <unistd.h>
9 #include <errno.h>
10 #include <dirent.h>
11 #include <stdlib.h>
12 #include <string.h>
13
14 #define DUMMY_STR "AAAaaaBBBbbb"
15 int main() 
16
17         FILE *file; 
18         file = fopen("/dir1/f1.txt","w+b");
19         if (file == NULL)
20                 printf ("Failed to open file \n");
21         fprintf(file,"%s","hello, world\n"); 
22         fclose(file); 
23
24         int fd = open("../../..//////dir1/test.txt", O_RDWR | O_CREAT );
25         char rbuf[256] = {0}, wbuf[256] = {0};
26         int retval;
27         retval = read(fd, rbuf, 16);
28         printf("Tried to read, got %d bytes of buf: %s\n", retval, rbuf);
29         strcpy(wbuf, DUMMY_STR);
30         retval = write(fd, wbuf, strlen(DUMMY_STR));
31         printf("Tried to write, wrote %d bytes\n", retval);
32
33         printf("Trying to seek to 0\n");
34         lseek(fd, 0, SEEK_SET);
35         retval = read(fd, rbuf, 64);
36         printf("Tried to read again, got %d bytes of buf: %s\n", retval, rbuf);
37         if (strcmp(DUMMY_STR, rbuf)) {
38                 printf("Failed to read back our dummy string!\n");
39                 return -1;
40         }
41         printf("Trying to lseek64 to 0\n");
42         lseek64(fd, 0, SEEK_SET);
43         retval = read(fd, rbuf, 64);
44         printf("Tried to read again, got %d bytes of buf: %s\n", retval, rbuf);
45         if (strcmp(DUMMY_STR, rbuf)) {
46                 printf("Failed to read back our dummy string!\n");
47                 return -1;
48         }
49
50         retval = access("/bin/laden", X_OK);
51         if (errno != ENOENT)
52                 printf("WARNING! Access error for Osama!\n");
53         retval = access("////../../////dir1/f1.txt", R_OK);
54         if (retval < 0)
55                 printf("WARNING! Access error for f1.txt!\n");
56
57         struct stat st = {0};
58         //retval = stat("/bin/mhello", &st);
59         retval = fstat(fd, &st);
60         printf("Tried to stat, was told %d\n", retval);
61         #if 0
62         printf("STAT RESULTS\n---------------------\n");
63         printf("dev       : %d\n", st.st_dev);
64         printf("ino       : %d\n", st.st_ino);
65         printf("mode      : %d\n", st.st_mode);
66         printf("nlink     : %d\n", st.st_nlink);
67         printf("uid       : %d\n", st.st_uid);
68         printf("gid       : %d\n", st.st_gid);
69         printf("rdev      : %d\n", st.st_rdev);
70         printf("size      : %d\n", st.st_size);
71         printf("blksize   : %d\n", st.st_blksize);
72         printf("blocks    : %d\n", st.st_blocks);
73         printf("atime     : %d\n", st.st_atime);
74         printf("mtime     : %d\n", st.st_mtime);
75         printf("ctime     : %d\n", st.st_ctime);
76         #endif
77
78         retval = symlink("/dir1/random.txt", "/dir2/sym-test");
79         if (retval < 0)
80                 printf("WARNING! Symlink creation failed!\n");
81         retval = readlink("/dir2/sym-test", rbuf, 256);
82         if (retval < 0)
83                 printf("WARNING! Readlink failed!\n");
84         else
85                 printf("Readlink read %d bytes\n", retval);
86         
87         /* Readdir tests: two ways to do it: */
88         DIR *dir = opendir("/dir1/");
89         struct dirent dirent_r, *dirent, *result = 0;
90         #if 0
91         dirent = readdir(dir);
92         printf("Readdir: d_ino %lld, d_off: %lld, d_reclen: %d, d_name: %s\n",
93                dirent->d_ino, dirent->d_off, dirent->d_reclen, dirent->d_name);
94         printf("TAKE TWO:\n-----------\n");
95         dirent = readdir(dir);
96         printf("Readdir: d_ino %lld, d_off: %lld, d_reclen: %d, d_name: %s\n",
97                dirent->d_ino, dirent->d_off, dirent->d_reclen, dirent->d_name);
98         #endif
99
100         retval = readdir_r(dir, &dirent_r, &result);
101         if (retval > 0)
102                 printf("WARNING! Readdir_r failed!, retval %d\n", retval);
103         if (!result)
104                 printf("End of the directory\n");
105         else
106                 printf("Dirent name: %s\n", result->d_name);
107         printf("TAKE TWO:\n-----------\n");
108         memset(&dirent_r, 0, sizeof(struct dirent));
109         retval = readdir_r(dir, &dirent_r, &result);
110         if (retval > 0)
111                 printf("WARNING! Readdir_r failed!, retval %d\n", retval);
112         if (!result)
113                 printf("End of the directory\n");
114         else
115                 printf("Dirent name: %s\n", result->d_name);
116         
117         /* Hardlink tests */
118         printf("Linking to /bin/hello at /dir1/hardhello\n");
119         retval = link("/bin/hello", "/dir1/hardhello");
120         if (retval < 0)
121                 printf("WARNING! Link failed!\n");
122         //breakpoint();
123         printf("Now unlinking /dir1/hardhello\n");
124         retval = unlink("/dir1/hardhello");
125         if (retval < 0)
126                 printf("WARNING! Unlink failed!\n");
127         printf("Linking to /bin/hello at /bin/hardhello2\n");
128         retval = link("/bin/hello", "/bin/hardhello2");
129         if (retval < 0)
130                 printf("WARNING! Link failed!\n");
131         printf("Now unlinking symlink /dir2/sym-test\n");
132         retval = unlink("/dir2/sym-test");
133         if (retval < 0)
134                 printf("WARNING! Unlink failed!\n");
135
136         /* getcwd, on the root dir */
137         char *cwd = getcwd(0, 0);
138         if (!cwd)
139                 printf("WARNING! Couldn't get a CWD!\n");
140         else
141                 printf("Got CWD (/): %s\n", cwd);
142         free(cwd);
143         /* chdir() tests */
144         printf("Testing basic chdir\n");
145         retval = access("dir1/f1.txt", R_OK);
146         if (retval < 0)
147                 printf("WARNING! Access error for dir1/f1.txt!\n");
148         retval = chdir("/dir1");
149         if (retval < 0)
150                 printf("WARNING! Chdir failed for /dir1!\n");
151         retval = access("f1.txt", R_OK);
152         if (retval < 0)
153                 printf("WARNING! Access error for f1.txt!\n");
154         cwd = getcwd(0, 0);
155         if (!cwd)
156                 printf("WARNING! Couldn't get a CWD!\n");
157         else
158                 printf("Got CWD (/dir1/): %s\n", cwd);
159         free(cwd);
160         /* change to a weird directory, see if we can still getcwd() */
161         retval = chdir("../dir2/../dir1/dir1-1");
162         if (retval < 0)
163                 printf("WARNING! Chdir failed for dir1-1!\n");
164         cwd = getcwd(0, 0);
165         if (!cwd)
166                 printf("WARNING! Couldn't get a CWD!\n");
167         else
168                 printf("Got CWD (/dir1/dir1-1/): %s\n", cwd);
169         free(cwd);
170
171         /* Try a chmod() */
172         printf("Trying a chmod\n");
173         retval = chmod("/dir1/dir1-1/f1-1.txt", S_IRWXO);
174         if (retval < 0)
175                 printf("WARNING! chmod failed with %d!\n", errno);
176
177         /* Try adding a directory or two! */
178         printf("Add dir3 and dir4, then remove dir4\n");
179         retval = mkdir("/dir3", S_IRWXU | S_IRWXG | S_IRWXO);
180         if (retval < 0)
181                 printf("WARNING! mkdir failed with %d!\n", errno);
182         retval = mkdir("/dir4", S_IRWXU | S_IRWXG | S_IRWXO);
183         if (retval < 0)
184                 printf("WARNING! mkdir failed with %d!\n", errno);
185         retval = rmdir("/dir4");
186         if (retval < 0)
187                 printf("WARNING! rmdir failed with %d!\n", errno);
188         breakpoint();
189
190 }