rp_t fs_cons(const char *path, const char *type) { char *dirname; char *name; rp_t dir; rp_t rp; // check for existing entries if (fs_find(path)) { errno = EEXIST; return 1; } // find parent directory dirname = path_parent(path); dir = fs_find(dirname); free(dirname); if (!dir) return RP_NULL; // construct new robject rp = rp_cons(dir, type); if (!rp) return RP_NULL; // add to directory name = path_name(path); if (rp_link(dir, name, rp)) { free(name); return RP_NULL; } free(name); return rp; }
off_t fs_size(const char *path) { off_t size; rp_t file; file = fs_find(path); size = rp_size(file); return size; }
int fs_link(const char *path, const char *link) { uint64_t dir; uint64_t rp; char *parent; char *name; int err; parent = path_parent(path); name = path_name(path); rp = fs_find(link); dir = fs_find(parent); err = rp_link(dir, name, rp); free(parent); free(name); return err; }
int main(int argc, char **argv) { char *name, *path, list[1000]; size_t i, l = 0; uint64_t dir; if (argc == 1) { path = (char*) getenv("PWD"); } else { path = argv[1]; } dir = fs_find(0, path); if (!dir) { fprintf(stderr, "%s: ", path_simplify(path)); perror(NULL); abort(); } list[0] = '\0'; for (i = 0;; i++) { name = fs_list(dir, i); if (name) { strlcat(list, name, 1000); l += 8 * ((strlen(name) / 8) + 1); if (l > 48) { strlcat(list, "\n", 1000); l = 0; } else { strlcat(list, "\t", 1000); } free(name); } else { if (errno == ENOTDIR) { fprintf(stderr, "%s: ", path); perror(NULL); abort(); } printf("%s", list); if (l) printf("\n"); return EXIT_SUCCESS; } } return 0; }
int main(int argc, char **argv) { char *path, *args, *reply; uint64_t ctrl; int i; if (argc < 2) { fprintf(stderr, "%s: missing operand\n", argv[0]); return 1; } if (argv[1][0] == '/') { path = strdup(argv[1]); } else if (argv[1][0] == '@') { path = strdup(argv[1]); } else { path = strvcat("/sys/", argv[1]); } ctrl = fs_find(path); if (!ctrl) { fprintf(stderr, "%s: %s: control file not accessible\n", argv[0], path); return 1; } args = malloc(1000); args[0] = '\0'; for (i = 2; i < argc; i++) { strlcat(args, argv[i], 1000); strlcat(args, " ", 1000); } if (args[0]) args[strlen(args)-1] = '\0'; reply = rcall(ctrl, args); if (!reply) { printf("! nosys (not implemented)\n"); return 1; } if (iserror(reply)) { printf("%s (%s)\n", reply, strerror(geterror(reply))); } else { printf("%s\n", reply); } return 0; }
int main(int argc, char **argv) { uint64_t mousefd; mousefd = fs_find("/dev/mouse"); if (!mousefd) { fprintf(stderr, "%s: couldn't find mouse\n", argv[0]); return 1; } event_subscribe(mousefd); event_hook("mouse", mouse_event); _done(); return 0; }
int fs_ulink(const char *path) { uint64_t dir; char *parent; char *name; int err; parent = path_parent(path); name = path_name(path); dir = fs_find(parent); err = rp_ulink(dir, name); free(parent); free(name); return err; }
void *load_exec(const char *name) { int fd; uint64_t size; char *path; void *image; /* attempt to find requested file */ if (name[0] == '/' || name[0] == '@') { path = strdup(name); } else { path = strvcat(getenv("PATH"), "/", name, NULL); } fd = ropen(-1, fs_find(path), STAT_READER); if (fd < 0 || !rp_type(fd_rp(fd), "file")) { /* file not found */ return NULL; } else { /* read whole file into buffer */ size = rp_size(fd_rp(fd)); if (!size) { return NULL; } image = aalloc(size, PAGESZ); if (!image) { return NULL; } if (rp_read(fd_rp(fd), image, size, 0) != size) { free(image); close(fd); return NULL; } close(fd); return image; } }
int fish_cd(int argc, char **argv) { char *path; if (argc < 2) { setenv("PWD", "/"); return 0; } path = path_simplify(argv[1]); if (path && fs_find(path)) { setenv("PWD", path); } else { fprintf(stderr, "%s: %s: no such directory\n", getname_s(), argv[1]); free(path); return 1; } free(path); return 0; }
int main() { struct tar_file *boot_image, *file; char const **argv; uint64_t temp, temp1, temp2; argv = malloc(sizeof(char*) * 4); /* Boot Image */ boot_image = tar_parse((void*) BOOT_IMAGE); /* Dynamic Linker */ file = tar_find(boot_image, "lib/dl.so"); dl_load(file->start); /* Initial Root Filesystem / Device Filesystem / System Filesystem (tmpfs) */ argv[0] = "tmpfs"; argv[1] = NULL; file = tar_find(boot_image, "sbin/tmpfs"); fs_root = start(file, argv); fs_cons("/dev", "dir"); fs_cons("/sys", "dir"); /* Serial Driver */ argv[0] = "serial"; argv[1] = NULL; file = tar_find(boot_image, "sbin/serial"); fs_plink("/dev/serial", start(file, argv), NULL); ropen(1, fs_find("/dev/serial"), STAT_WRITER); ropen(2, fs_find("/dev/serial"), STAT_WRITER); stdout = fdopen(1, "w"); stderr = fdopen(2, "w"); fs_plink("/dev/stderr", fs_find("/dev/serial"), NULL); /* Keyboard Driver */ argv[0] = "kbd"; argv[1] = NULL; file = tar_find(boot_image, "sbin/kbd"); temp = start(file, argv); /* Graphics Driver */ argv[0] = "svga"; argv[1] = NULL; file = tar_find(boot_image, "sbin/svga"); start(file, argv); /* Init control file */ fs_plink("/sys/init", RP_CONS(getpid(), 0), NULL); /* Initrd */ initrd_init(); fs_plink("/dev/initrd", RP_CONS(getpid(), 1), NULL); /* Root filesystem (tarfs) */ argv[0] = "tarfs"; argv[1] = "/dev/initrd"; argv[2] = NULL; file = tar_find(boot_image, "sbin/tarfs"); temp = start(file, argv); /* Link /dev and /sys and change root */ temp1 = fs_find("/dev"); temp2 = fs_find("/sys"); fs_root = temp; fs_plink("/dev", temp1, NULL); fs_plink("/sys", temp2, NULL); /* Terminal Driver */ argv[0] = "biterm"; argv[1] = "/dev/kbd"; argv[2] = "/dev/svga0"; argv[3] = NULL; file = tar_find(boot_image, "sbin/biterm"); fs_plink("/dev/tty", start(file, argv), NULL); /* Temporary filesystem */ argv[0] = "tmpfs"; argv[1] = NULL; file = tar_find(boot_image, "sbin/tmpfs"); fs_plink("/tmp", start(file, argv), NULL); /* Time Driver */ argv[0] = "time"; argv[1] = NULL; file = tar_find(boot_image, "sbin/time"); fs_plink("/dev/time", start(file, argv), NULL); /* Pipe Driver */ argv[0] = "pipe"; argv[1] = NULL; file = tar_find(boot_image, "sbin/pipe"); fs_plink("/sys/pipe", start(file, argv), NULL); setname("init"); mwait(PORT_CHILD, 0); printf("INIT PANIC: system daemon died\n"); for(;;); return 0; }
uint64_t io_find(const char *name) { return fs_find(RP_NULL, name); }