Add ranged ls and f70status enum.

This commit is contained in:
Ivan Baravy 2018-05-14 10:54:05 +03:00
parent d02cbfd7ef
commit 2c3cd9c7c1
6 changed files with 55 additions and 17 deletions

1
.gitignore vendored
View File

@ -1,5 +1,6 @@
*.swp *.swp
.vim .vim
.exrc
*.o *.o
kofu kofu
kofuse kofuse

41
kofu.c
View File

@ -1,6 +1,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include <inttypes.h>
#include <stdlib.h> #include <stdlib.h>
#include <stddef.h> #include <stddef.h>
#include <string.h> #include <string.h>
@ -37,25 +38,49 @@ char **split_args(char *s) {
return argv; return argv;
} }
void kofu_ls(char **arg) { void ls_range(struct f70s1arg *f70) {
struct f70s1ret *dir = (struct f70s1ret*)malloc(sizeof(struct f70s1ret) + sizeof(struct bdfe) * DIRENTS_TO_READ); int status = kos_fuse_lfn(f70);
struct f70s1arg f70 = {1, 0, CP866, DIRENTS_TO_READ, dir, 0, arg[1]}; // printf("status = %d\n", status);
if (status == F70_SUCCESS || status == F70_END_OF_FILE) {
struct f70s1ret *dir = f70->buf;
for (size_t i = 0; i < dir->cnt; i++) {
printf("%s\n", dir->bdfes[i].name);
}
}
}
void ls_all(struct f70s1arg *f70) {
while (true) { while (true) {
int status = kos_fuse_lfn(&f70); int status = kos_fuse_lfn(f70);
printf("status = %d\n", status); // printf("status = %d\n", status);
if (status != 0 && status != 6) { if (status != F70_SUCCESS && status != F70_END_OF_FILE) {
abort(); abort();
} }
f70.offset += dir->cnt; struct f70s1ret *dir = f70->buf;
f70->offset += dir->cnt;
for (size_t i = 0; i < dir->cnt; i++) { for (size_t i = 0; i < dir->cnt; i++) {
printf("%s\n", dir->bdfes[i].name); printf("%s\n", dir->bdfes[i].name);
} }
if (status == 6) { if (status == F70_END_OF_FILE) {
break; break;
} }
} }
}
void kofu_ls(char **arg) {
struct f70s1ret *dir = (struct f70s1ret*)malloc(sizeof(struct f70s1ret) + sizeof(struct bdfe) * DIRENTS_TO_READ);
struct f70s1arg f70 = {1, 0, CP866, DIRENTS_TO_READ, dir, 0, arg[1]};
if (arg[2]) {
sscanf(arg[2], "%"SCNu32, &f70.size);
if (arg[3]) {
sscanf(arg[3], "%"SCNu32, &f70.offset);
}
ls_range(&f70);
} else {
ls_all(&f70);
}
free(dir); free(dir);
return; return;
} }

View File

@ -52,7 +52,7 @@ static int kofuse_getattr(const char *path, struct stat *stbuf,
static int kofuse_readdir(const char *path, void *buf, fuse_fill_dir_t filler, static int kofuse_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
off_t offset, struct fuse_file_info *fi, off_t offset, struct fuse_file_info *fi,
enum fuse_readdir_flags flags) { enum fuse_readdir_flags flags) {
(void) offset; (void) offset; // TODO
(void) fi; (void) fi;
(void) flags; (void) flags;

View File

@ -44,10 +44,9 @@ kos_fuse_init:
mov [file_disk.Sectors], eax mov [file_disk.Sectors], eax
mov [file_disk.Logical], 512 mov [file_disk.Logical], 512
stdcall disk_add, disk_functions, disk_name, file_disk, DISK_NO_INSERT_NOTIFICATION stdcall disk_add, disk_functions, disk_name, file_disk, DISK_NO_INSERT_NOTIFICATION
mov [disk], eax push eax
stdcall disk_media_changed, [disk], 1 stdcall disk_media_changed, eax, 1
pop eax
mov eax, [disk]
mov eax, [eax + DISK.NumPartitions] mov eax, [eax + DISK.NumPartitions]
pop ebp edi esi ebx pop ebp edi esi ebx
@ -279,7 +278,6 @@ ide_channel8_mutex MUTEX
section '.bss' writeable align 16 section '.bss' writeable align 16
file_disk FILE_DISK file_disk FILE_DISK
disk dd ?
alloc_base rb 8*1024*1024 alloc_base rb 8*1024*1024
IncludeUGlobals IncludeUGlobals
; crap ; crap

View File

@ -10,6 +10,22 @@ enum encoding {
UTF8, UTF8,
}; };
enum f70status {
F70_SUCCESS,
F70_DISK_BASE,
F70_UNSUPPORTED_FS,
F70_UNKNOWN_FS,
F70_PARTITION,
F70_FILE_NOT_FOUND,
F70_END_OF_FILE,
F70_MEMORY_POINTER,
F70_DISK_FULL,
F70_FS_FAIL,
F70_ACCESS_DENIED,
F70_DEVICE,
F70_OUT_OF_MEMORY,
};
struct bdfe { struct bdfe {
uint32_t attr; uint32_t attr;
uint32_t enc; uint32_t enc;

View File

@ -1,4 +1,2 @@
ls /hd0/1
ls /hd0/1/ ls /hd0/1/
ls /hd0/1/123 ls /hd0/1/shortform/
ls /hd0/1/123/