fs Add mount subcommand
This commit is contained in:
@ -1 +1,2 @@
|
||||
print 'Mounting filesystems...\n'
|
||||
$fs mount -mp system -fs LittleFS -dev atasd-mst -fmt no
|
||||
|
||||
@ -2,4 +2,4 @@
|
||||
|
||||
rm -f base.img
|
||||
cat user/FILES.txt | while read line; do cp -v $line base/bin; done
|
||||
mklittlefs -c base -b 4096 -s $((1<<20)) base.img
|
||||
mklittlefs -c base -b 512 -s $((1<<20)) base.img
|
||||
|
||||
@ -43,3 +43,11 @@ int32_t devctl(Dev_t *devh, uint64_t cmd, uint8_t *buffer, size_t len, uint64_t
|
||||
int32_t rand(void) {
|
||||
return syscall(SYS_RAND, 0, 0, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
int32_t vfsmount(char *mountpoint, char *fstype, Dev_t *dev, bool format) {
|
||||
return syscall(SYS_VFSMOUNT, (uint64_t)mountpoint, (uint64_t)fstype, (uint64_t)dev, (uint64_t)format, 0, 0);
|
||||
}
|
||||
|
||||
int32_t vfsunmount(char *mountpoint) {
|
||||
return syscall(SYS_VFSUNMOUNT, (uint64_t)mountpoint, 0, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
#include <sysdefs/devctl.h>
|
||||
|
||||
void debugprint(const char *string);
|
||||
@ -14,5 +15,7 @@ int32_t mman_unmap(uint8_t *addr);
|
||||
int32_t schedrelease(void);
|
||||
int32_t devctl(Dev_t *devh, uint64_t cmd, uint8_t *buffer, size_t len, uint64_t extra);
|
||||
int32_t rand(void);
|
||||
int32_t vfsmount(char *mountpoint, char *fstype, Dev_t *dev, bool format);
|
||||
int32_t vfsunmount(char *mountpoint);
|
||||
|
||||
#endif // ULIB_SYSTEM_SYSTEM_H_
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
#define CMDS(X) \
|
||||
X(fetch) X(mkf) X(mkd) \
|
||||
X(tree)
|
||||
X(tree) X(mount)
|
||||
|
||||
void main(void) {
|
||||
if (argslen() == 0) {
|
||||
|
||||
@ -27,6 +27,10 @@ void fs_mkf(void) {
|
||||
}
|
||||
|
||||
IOH ioh = ioctl(IOCTL_NOHANDLE, IOCTL_OPENF, (uint64_t)path, IOCTL_F_MAKE | IOCTL_F_WRITE, 0);
|
||||
if (ioh < 0) {
|
||||
uprintf("fs mkf: could not create %s\n", path);
|
||||
return;
|
||||
}
|
||||
if (FS_MKF_CONFIG.write != NULL) {
|
||||
if (ioctl(ioh, IOCTL_WRITE, (uint64_t)FS_MKF_CONFIG.write, string_len(FS_MKF_CONFIG.write), 0) < 0) {
|
||||
uprintf("fs mkf: could not write to %s\n", path);
|
||||
|
||||
56
user/fs/mount.c
Normal file
56
user/fs/mount.c
Normal file
@ -0,0 +1,56 @@
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <ulib.h>
|
||||
|
||||
struct {
|
||||
char *mountpoint;
|
||||
char *fstype;
|
||||
char *devname;
|
||||
bool format;
|
||||
} FS_MOUNT_CONFIG = {0};
|
||||
|
||||
static Arg ARGS[] = {
|
||||
ARG("-mp", ARG_STRING, &FS_MOUNT_CONFIG.mountpoint),
|
||||
ARG("-fs", ARG_STRING, &FS_MOUNT_CONFIG.fstype),
|
||||
ARG("-dev", ARG_STRING, &FS_MOUNT_CONFIG.devname),
|
||||
ARG("-fmt", ARG_BOOL, &FS_MOUNT_CONFIG.format),
|
||||
ARG_END(),
|
||||
};
|
||||
|
||||
void fs_mount(void) {
|
||||
int32_t ret;
|
||||
if ((ret = parse_args(args()+1, argslen()-1, ARGS)) < 0) {
|
||||
uprintf("fs: could not parse args: %d\n", ret);
|
||||
return;
|
||||
}
|
||||
|
||||
if (FS_MOUNT_CONFIG.mountpoint == NULL) {
|
||||
uprintf("fs: mountpoint missing\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (FS_MOUNT_CONFIG.fstype == NULL) {
|
||||
uprintf("fs: filesystem type missing\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (FS_MOUNT_CONFIG.devname == NULL) {
|
||||
uprintf("fs: device name missing\n");
|
||||
return;
|
||||
}
|
||||
|
||||
Dev_t dev;
|
||||
ret = devctl(&dev, DEVCTL_GET_HANDLE, (uint8_t *)FS_MOUNT_CONFIG.devname, 0, 0);
|
||||
if (ret != E_OK) {
|
||||
uprintf("fs: device %s not found\n", FS_MOUNT_CONFIG.devname);
|
||||
return;
|
||||
}
|
||||
|
||||
ret = vfsmount(FS_MOUNT_CONFIG.mountpoint, FS_MOUNT_CONFIG.fstype, &dev, FS_MOUNT_CONFIG.format);
|
||||
if (ret != E_OK) {
|
||||
uprintf("fs: mount error %s\n", ERRSTRING(ret));
|
||||
return;
|
||||
} else {
|
||||
uprintf("OK %s\n", FS_MOUNT_CONFIG.mountpoint);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user