diff --git a/user/counter.c b/user/counter.c new file mode 100644 index 0000000..fa1d9fe --- /dev/null +++ b/user/counter.c @@ -0,0 +1,18 @@ +#include "ulib.h" + +int main(void) +{ + long pid = userGetpid(); + + for (int step = 0; step < 5; step++) { + print("counter: pid="); + printDec(pid); + print(" step="); + printDec(step); + print("\n"); + userSleep(30); + } + + print("counter: finished counting\n"); + return 0; +} diff --git a/user/fileread.c b/user/fileread.c new file mode 100644 index 0000000..c9c7dd5 --- /dev/null +++ b/user/fileread.c @@ -0,0 +1,77 @@ +#include "ulib.h" +#include "fs.h" + +static const char* motdPath = "/etc/motd.txt"; +static const char* notePath = "/tmp/note.txt"; + +int main(void) +{ + print("fileread: start, pid="); + printDec(userGetpid()); + print("\n"); + + FbStat st; + if (userStat(motdPath, &st) == 0) { + print("fileread: stat "); + print(motdPath); + print(" size="); + printDec((long)st.size); + print("\n"); + } else { + print("fileread: stat failed\n"); + } + + int fd = (int)userOpen(motdPath, oReadOnly); + if (fd < 0) { + print("fileread: open failed\n"); + return 1; + } + + print("fileread: --- begin "); + print(motdPath); + print(" ---\n"); + char buffer[128]; + long n; + while ((n = userRead(fd, buffer, sizeof(buffer))) > 0) + userWrite(1, buffer, (unsigned long)n); + print("fileread: --- end ---\n"); + + userLseek(fd, 0, seekSet); + n = userRead(fd, buffer, 16); + print("fileread: lseek reread first bytes: "); + userWrite(1, buffer, (unsigned long)n); + print("\n"); + userClose(fd); + + int wfd = (int)userOpen(notePath, oReadWrite | oCreate | oTrunc); + if (wfd < 0) { + print("fileread: tmpfs open failed\n"); + return 2; + } + const char* payload = "frostbyte-tmpfs-rw-ok\n"; + userWrite(wfd, payload, stringLength(payload)); + userLseek(wfd, 0, seekSet); + char readback[64]; + long rn = userRead(wfd, readback, sizeof(readback)); + print("fileread: tmpfs read back: "); + userWrite(1, readback, (unsigned long)rn); + userClose(wfd); + + print("fileread: listing /etc via getdents:\n"); + int dfd = (int)userOpen("/etc", oReadOnly); + if (dfd >= 0) { + FbDirent entries[8]; + long bytes = userGetdents(dfd, entries, sizeof(entries)); + long records = bytes / (long)sizeof(FbDirent); + for (long i = 0; i < records; i++) { + print(" "); + print(entries[i].name); + print(entries[i].type == fsTypeDir ? "/" : ""); + print("\n"); + } + userClose(dfd); + } + + print("fileread: done\n"); + return 0; +} diff --git a/user/hello.c b/user/hello.c new file mode 100644 index 0000000..f804760 --- /dev/null +++ b/user/hello.c @@ -0,0 +1,13 @@ +#include "ulib.h" + +int main(void) +{ + print("hello: greetings from ring 3, pid="); + printDec(userGetpid()); + print("\n"); + + userYield(); + + print("hello: resumed after yield, exiting cleanly\n"); + return 7; +} diff --git a/user/sbrktest.c b/user/sbrktest.c new file mode 100644 index 0000000..a362675 --- /dev/null +++ b/user/sbrktest.c @@ -0,0 +1,27 @@ +#include "ulib.h" + +#define blockBytes 8192 + +int main(void) +{ + print("sbrktest: pid="); + printDec(userGetpid()); + print(" requesting 8192 bytes via sbrk\n"); + + char* block = (char*)userSbrk(blockBytes); + + for (int i = 0; i < blockBytes; i++) + block[i] = (char)(i & 0x7F); + + int intact = 1; + for (int i = 0; i < blockBytes; i++) + if (block[i] != (char)(i & 0x7F)) + intact = 0; + + if (intact) + print("sbrktest: heap page write and read-back verified OK\n"); + else + print("sbrktest: heap verification FAILED\n"); + + return 0; +}