/* * mount a file system */ int mount(const char * dev, const char * dir, const char * fs, u32_t flags) { char dev_path[MAX_PATH]; char dir_path[MAX_PATH]; struct stat st; int err; if((err = vfs_path_conv(dir, dir_path)) != 0) return err; if(dev != NULL) { if((err = vfs_path_conv(dev, dev_path)) != 0) return err; if(stat(dev_path, &st) != 0) return EEXIST; if(! S_ISBLK(st.st_mode)) return EACCES; return sys_mount(dev_path, dir_path, (char *)fs, flags); } else return sys_mount(NULL, dir_path, (char *)fs, flags); }
/* * open a file with flags and mode and return file descriptor. */ int open(const char * path, u32_t flags, u32_t mode) { char buf[MAX_PATH]; struct file * fp; int fd; int err; if((fd = fd_alloc(0)) < 0) return -1; if(vfs_path_conv(path, buf) !=0 ) { fd_free(fd); return -1; } if((err = sys_open(buf, flags, mode, &fp)) != 0) { fd_free(fd); return err; } set_fp(fd, fp); return fd; }
/* * unmount file systems */ int umount(const char * dir) { char buf[MAX_PATH]; int err; if((err = vfs_path_conv(dir, buf)) != 0) return err; return sys_umount(buf); }
/* * get file's status */ int stat(const char * path, struct stat * st) { char buf[MAX_PATH]; int err; if((err = vfs_path_conv(path, buf)) !=0 ) return err; return sys_stat(buf, st); }
/* * remove a empty directories */ int rmdir(const char * path) { char buf[MAX_PATH]; int err; if((err = vfs_path_conv(path, buf)) !=0 ) return err; return sys_rmdir(buf); }
/* * create a directory with mode */ int mkdir(const char * path, u32_t mode) { char buf[MAX_PATH]; int err; if((err = vfs_path_conv(path, buf)) !=0 ) return err; return sys_mkdir(buf, mode); }
/* * mount a file system */ int mount(const char * dev, const char * dir, const char * fs, u32_t flags) { char dir_path[MAX_PATH]; int err; if((err = vfs_path_conv(dir, dir_path)) != 0) return err; return sys_mount((char *)dev, dir_path, (char *)fs, flags); }
/* * change the current working directory to the specified path */ int chdir(const char * path) { char buf[MAX_PATH]; struct file * fp; int err; if((err = vfs_path_conv(path, buf)) !=0 ) return err; /* check if directory exits */ if((err = sys_opendir(buf, &fp)) != 0) return err; /* new fp for current work directory */ if(vfs_getcwdfp()) sys_closedir(vfs_getcwdfp()); vfs_setcwdfp(fp); /* set current work directory */ vfs_setcwd(buf); return 0; }
/* * open a directory */ void * opendir(const char * name) { char buf[MAX_PATH]; struct dir * dir; struct file * fp; int fd; int err; if((dir = malloc(sizeof(struct dir))) == NULL) return NULL; /* find empty slot for file descriptor. */ if((fd = fd_alloc(0)) < 0) { free(dir); return NULL; } if((err = vfs_path_conv(name, buf)) !=0 ) { free(dir); fd_free(fd); return NULL; } if((err = sys_opendir(buf, &fp)) != 0) { free(dir); fd_free(fd); return NULL; } set_fp(fd, fp); dir->fd = fd; return (void *)dir; }