From 85dc2ffc4c376b5e06a0ef5060de566afedcc659 Mon Sep 17 00:00:00 2001 From: Lunaixsky Date: Mon, 31 Mar 2025 17:36:34 +0100 Subject: [PATCH 1/1] release the dnode lock after EACCESS in path walk make struct stats conforming to POSIX minor tweaks stock shell environment for better look and feel --- lunaix-os/includes/lunaix/fs_acl.h | 4 ++++ lunaix-os/includes/lunaix/types.h | 3 --- lunaix-os/includes/usr/lunaix/fcntl_defs.h | 27 +++++++++++++++------- lunaix-os/includes/usr/lunaix/types.h | 2 ++ lunaix-os/kernel/device/devfs.c | 4 ++-- lunaix-os/kernel/fs/path_walk.c | 2 ++ lunaix-os/kernel/fs/ramfs/ramfs.c | 2 +- lunaix-os/kernel/fs/twifs/twifs.c | 2 +- lunaix-os/kernel/fs/vfs.c | 21 ++++++++++++----- lunaix-os/kernel/kprint/kprintf.c | 2 +- lunaix-os/usr/cat.c | 2 +- lunaix-os/usr/init/init.c | 2 +- lunaix-os/usr/libc/src/_vprintf.c | 3 +++ lunaix-os/usr/ls.c | 26 +++++++++++++++++---- lunaix-os/usr/rm.c | 2 +- lunaix-os/usr/sh/sh.c | 9 +++----- lunaix-os/usr/stat.c | 17 ++++++++++---- 17 files changed, 90 insertions(+), 40 deletions(-) diff --git a/lunaix-os/includes/lunaix/fs_acl.h b/lunaix-os/includes/lunaix/fs_acl.h index 23aab23..fde7225 100644 --- a/lunaix-os/includes/lunaix/fs_acl.h +++ b/lunaix-os/includes/lunaix/fs_acl.h @@ -8,6 +8,7 @@ #define FSACL_WRITE 2 #define FSACL_EXEC 1 +#define FSACL_MASK 03777 #define FSACL_RWXMASK 0777 #define FSACL_U(x) (((x) & 0b111) << 6) #define FSACL_G(x) (((x) & 0b111) << 3) @@ -57,6 +58,9 @@ #define FSACL_o(r, w, x) \ (v__(__fsacl_sel(o, r)) | v__(__fsacl_sel(o, w)) | v__(__fsacl_sel(o, x))) +#define FSACL_DEFAULT \ + (FSACL_u(R, W, X) | FSACL_g(R, W, X) | FSACL_o(R, _, X)) + #define fsacl_test(acl, type) ((acl) & (FSACL_##type)) static inline bool must_inline diff --git a/lunaix-os/includes/lunaix/types.h b/lunaix-os/includes/lunaix/types.h index fe06333..6ce5fcf 100644 --- a/lunaix-os/includes/lunaix/types.h +++ b/lunaix-os/includes/lunaix/types.h @@ -16,9 +16,6 @@ typedef unsigned int u32_t; typedef unsigned long ptr_t; typedef unsigned long reg_t; -typedef unsigned int uid_t; -typedef unsigned int gid_t; - #ifndef CONFIG_ARCH_BITS_64 typedef unsigned long long u64_t; #else diff --git a/lunaix-os/includes/usr/lunaix/fcntl_defs.h b/lunaix-os/includes/usr/lunaix/fcntl_defs.h index 81be1e7..36af62e 100644 --- a/lunaix-os/includes/usr/lunaix/fcntl_defs.h +++ b/lunaix-os/includes/usr/lunaix/fcntl_defs.h @@ -42,16 +42,27 @@ /* Mount with block-cache-disabled flag */ #define MNT_NC (1 << 1) +typedef unsigned int mode_t; +typedef unsigned int nlink_t; + struct file_stat { - dev_t st_dev; - ino_t st_ino; - unsigned int mode; - dev_t st_rdev; - off_t st_size; - size_t st_blksize; - size_t st_ioblksize; - size_t st_blocks; + dev_t st_dev; + ino_t st_ino; + mode_t st_mode; + nlink_t st_nlink; + uid_t st_uid; + gid_t st_gid; + dev_t st_rdev; + off_t st_size; + size_t st_blksize; + size_t st_blocks; + + unsigned long st_atim; + unsigned long st_ctim; + unsigned long st_mtim; + + size_t st_ioblksize; }; #endif /* __LUNAIX_FNCTL_DEFS_H */ diff --git a/lunaix-os/includes/usr/lunaix/types.h b/lunaix-os/includes/usr/lunaix/types.h index 19094e9..3dbddb5 100644 --- a/lunaix-os/includes/usr/lunaix/types.h +++ b/lunaix-os/includes/usr/lunaix/types.h @@ -24,6 +24,8 @@ typedef signed long ssize_t; typedef int pid_t; typedef int tid_t; +typedef int uid_t; +typedef int gid_t; typedef __SIZE_TYPE__ size_t; diff --git a/lunaix-os/kernel/device/devfs.c b/lunaix-os/kernel/device/devfs.c index 7884617..969c828 100644 --- a/lunaix-os/kernel/device/devfs.c +++ b/lunaix-os/kernel/device/devfs.c @@ -180,10 +180,10 @@ devfs_init_inode(struct v_superblock* vsb, struct v_inode* inode) inode->ops = &devfs_inode_ops; inode->default_fops = &devfs_file_ops; - // we set default access right to be 0660. + // we set default access right to be 0775. // TODO need a way to allow this to be changed - fsapi_inode_setaccess(inode, FSACL_u(R, W, X) | FSACL_g(R, W, X) | FSACL_oX); + fsapi_inode_setaccess(inode, FSACL_DEFAULT); fsapi_inode_setowner(inode, 0, 0); } diff --git a/lunaix-os/kernel/fs/path_walk.c b/lunaix-os/kernel/fs/path_walk.c index 7b49219..246e903 100644 --- a/lunaix-os/kernel/fs/path_walk.c +++ b/lunaix-os/kernel/fs/path_walk.c @@ -95,6 +95,7 @@ __vfs_walk(struct v_dnode* start, if (!check_allow_execute(current_inode)) { errno = EACCESS; + unlock_dnode(current_level); goto error; } @@ -106,6 +107,7 @@ __vfs_walk(struct v_dnode* start, if (!dnode) { errno = ENOMEM; + unlock_dnode(current_level); goto error; } diff --git a/lunaix-os/kernel/fs/ramfs/ramfs.c b/lunaix-os/kernel/fs/ramfs/ramfs.c index d4e2f6f..0944088 100644 --- a/lunaix-os/kernel/fs/ramfs/ramfs.c +++ b/lunaix-os/kernel/fs/ramfs/ramfs.c @@ -135,7 +135,7 @@ ramfs_mount(struct v_superblock* vsb, struct v_dnode* mount_point) int errno = __ramfs_mknod(mount_point, NULL, RAMF_DIR); if (!errno) { - fsapi_inode_setaccess(mount_point->inode, FSACL_aX | FSACL_aR); + fsapi_inode_setaccess(mount_point->inode, FSACL_DEFAULT); } return errno; diff --git a/lunaix-os/kernel/fs/twifs/twifs.c b/lunaix-os/kernel/fs/twifs/twifs.c index 3679ee1..9d47495 100644 --- a/lunaix-os/kernel/fs/twifs/twifs.c +++ b/lunaix-os/kernel/fs/twifs/twifs.c @@ -63,7 +63,7 @@ __twifs_init_inode(struct v_superblock* vsb, struct v_inode* inode) // we set default access right to be 0660. // TODO need a way to allow this to be changed - fsapi_inode_setaccess(inode, FSACL_u(R, W, _) | FSACL_g(R, W, _)); + fsapi_inode_setaccess(inode, FSACL_DEFAULT); fsapi_inode_setowner(inode, 0, 0); } diff --git a/lunaix-os/kernel/fs/vfs.c b/lunaix-os/kernel/fs/vfs.c index c117f18..32014d3 100644 --- a/lunaix-os/kernel/fs/vfs.c +++ b/lunaix-os/kernel/fs/vfs.c @@ -1733,12 +1733,21 @@ __DEFINE_LXSYSCALL2(int, fstat, int, fd, struct file_stat*, stat) struct v_inode* vino = fds->file->inode; struct device* fdev = vino->sb->dev; - *stat = (struct file_stat){.st_ino = vino->id, - .st_blocks = vino->lb_usage, - .st_size = vino->fsize, - .mode = vino->itype, - .st_ioblksize = PAGE_SIZE, - .st_blksize = vino->sb->blksize}; + stat->st_ino = vino->id; + stat->st_blocks = vino->lb_usage; + stat->st_size = vino->fsize; + stat->st_blksize = vino->sb->blksize; + stat->st_nlink = vino->link_count; + stat->st_uid = vino->uid; + stat->st_gid = vino->gid; + + stat->st_ctim = vino->ctime; + stat->st_atim = vino->atime; + stat->st_mtim = vino->mtime; + + stat->st_mode = (vino->itype << 16) | vino->acl; + + stat->st_ioblksize = PAGE_SIZE; if (check_device_node(vino)) { struct device* rdev = resolve_device(vino->data); diff --git a/lunaix-os/kernel/kprint/kprintf.c b/lunaix-os/kernel/kprint/kprintf.c index 363abc6..376df36 100644 --- a/lunaix-os/kernel/kprint/kprintf.c +++ b/lunaix-os/kernel/kprint/kprintf.c @@ -112,7 +112,7 @@ __twimap_kprintf_read(struct twimap* map) { time_t s = pos->time / 1000; time_t ms = pos->time % 1000; - twimap_printf(map, "[%05d.%03d] %s\n", s, ms, pos->content); + twimap_printf(map, "[%05d.%03d] %s", s, ms, pos->content); } } diff --git a/lunaix-os/usr/cat.c b/lunaix-os/usr/cat.c index cd8cad0..1fe6c16 100644 --- a/lunaix-os/usr/cat.c +++ b/lunaix-os/usr/cat.c @@ -26,7 +26,7 @@ main(int argc, const char* argv[]) return 1; } - if ((stat.mode & F_DIR)) { + if (((stat.st_mode >> 16) & F_DIR)) { printf("%s is a directory", argv[i]); return 1; } diff --git a/lunaix-os/usr/init/init.c b/lunaix-os/usr/init/init.c index 25996ce..804b8f8 100644 --- a/lunaix-os/usr/init/init.c +++ b/lunaix-os/usr/init/init.c @@ -39,7 +39,7 @@ init_termios(int fd) { check(tcgetattr(fd, &term)); - term.c_lflag = ICANON | IEXTEN | ISIG | ECHO | ECHOE | ECHONL; + term.c_lflag = ICANON | IEXTEN | ISIG | ECHO | ECHOE; term.c_iflag = ICRNL | IGNBRK; term.c_oflag = ONLCR | OPOST; term.c_cflag = CREAD | CLOCAL | CS8 | CPARENB; diff --git a/lunaix-os/usr/libc/src/_vprintf.c b/lunaix-os/usr/libc/src/_vprintf.c index 16d8133..7659e28 100644 --- a/lunaix-os/usr/libc/src/_vprintf.c +++ b/lunaix-os/usr/libc/src/_vprintf.c @@ -112,6 +112,9 @@ __vprintf_internal(char* buffer, const char* fmt, size_t max_len, va_list vargs) flags = flags | FLAG_CAPS; base = 16; goto format_unsigned; + case 'o': + base = 8; + goto format_unsigned; case 'p': num = (uintptr_t)va_arg(vargs, void*); base = 16; diff --git a/lunaix-os/usr/ls.c b/lunaix-os/usr/ls.c index caea32d..3fdfc6e 100644 --- a/lunaix-os/usr/ls.c +++ b/lunaix-os/usr/ls.c @@ -13,27 +13,43 @@ main(int argc, const char* argv[]) DIR* dir = opendir(path); if (!dir) { - return errno; + goto done; } struct dirent* dent; + int i = 0, sz; + char bf[100]; while ((dent = readdir(dir))) { if (dent->d_type == DT_DIR) { - printf(" %s/\n", dent->d_name); + sz = snprintf(bf, 100, "%s/", dent->d_name); } else if (dent->d_type == DT_SYMLINK) { - printf(" %s@\n", dent->d_name); + sz = snprintf(bf, 100, "%s@", dent->d_name); } else { - printf(" %s\n", dent->d_name); + sz = snprintf(bf, 100, "%s", dent->d_name); } + + bf[sz] = 0; + printf("%-15s ", bf); + + i++; + if ((i % 4) == 0) { + printf("\n"); + } + } + + if ((i % 4) != 0) { + printf("\n"); } +done: int err = errno; if (err) { printf("failed: %d\n",err); } - closedir(dir); + if (dir) + closedir(dir); return err; } \ No newline at end of file diff --git a/lunaix-os/usr/rm.c b/lunaix-os/usr/rm.c index 7fea833..c6046ce 100644 --- a/lunaix-os/usr/rm.c +++ b/lunaix-os/usr/rm.c @@ -29,7 +29,7 @@ main(int argc, const char* argv[]) close(fd); - if ((stat.mode & F_DIR)) { + if (((stat.st_mode >> 16) & F_DIR)) { err = rmdir(path); } else { diff --git a/lunaix-os/usr/sh/sh.c b/lunaix-os/usr/sh/sh.c index 5ca47ed..764404b 100644 --- a/lunaix-os/usr/sh/sh.c +++ b/lunaix-os/usr/sh/sh.c @@ -182,7 +182,7 @@ sh_loop() while (1) { getcwd(pwd, 512); - printf("[%s]$ ", pwd); + printf("%s # ", pwd); int sz = read(stdin, buf, 511); if (sz < 0) { @@ -195,8 +195,7 @@ sh_loop() // currently, this shell only support single argument if (!parse_cmdline(buf, argv)) { - printf("\n"); - goto cont; + continue; } // cmd=="exit" @@ -204,9 +203,7 @@ sh_loop() break; } - sh_exec((const char**)argv); - cont: - printf("\n"); + sh_exec((const char**)argv); } } diff --git a/lunaix-os/usr/stat.c b/lunaix-os/usr/stat.c index ea40200..1bd79f3 100644 --- a/lunaix-os/usr/stat.c +++ b/lunaix-os/usr/stat.c @@ -28,7 +28,7 @@ main(int argc, char* argv[]) printf("File: %s ", argv[1]); char* ftype = "directory"; - int mode = stat.mode; + int mode = stat.st_mode >> 16; if ((mode & F_DEV)) { ftype = "mappable (sequential) device"; @@ -53,16 +53,25 @@ main(int argc, char* argv[]) stat.st_blocks, stat.st_blksize, stat.st_ioblksize); - printf("Inode: %d; ", stat.st_ino); dev_t* dev; - if (!(stat.mode & F_DEV)) { + if (!(mode & F_DEV)) { dev = &stat.st_dev; } else { dev = &stat.st_rdev; } + printf("Device: %xh:%xh@%d; Inode: %d; Links: %d\n", + dev->meta, dev->unique, dev->index, + stat.st_ino, stat.st_nlink); - printf("Device: %xh:%xh@%d;\n", dev->meta, dev->unique, dev->index); + printf("Access: 0%o; Uid: %d; Gid: %d\n", + stat.st_mode & 0xffff, + stat.st_uid, + stat.st_gid); + + printf("Access: %lu\n", stat.st_atim); + printf("Modify: %lu\n", stat.st_mtim); + printf("Create: %lu\n", stat.st_ctim); close(fd); return 0; -- 2.27.0