10 #include <lib/string.h>
12 #include "drv/vfs_new.h"
13 #include "io/serial_port.h"
15 #include "lib/split.h"
26 void __milla_setLogin(
char* login){
32 void __milla_setPasswd(
char* passwd){
38 int __milla_getCode(){
52 __com_formatString(PORT_COM2,
"%s |$MC#|",msg);
68 tmp = serial_readchar(PORT_COM2);
69 if ((
int) tmp == 10 && inx == 0)
continue;
85 int __milla_getSizeFile(
char* path){
87 __com_formatString(PORT_COM2,
"SIZE %s |$MC#|",path);
90 qemu_log(
"[Milla] [getSizeFile] ERR! Return %d:%s",answer,
__milla_buffer);
97 char* __milla_getDiskInfo_Name(){
99 __com_formatString(PORT_COM2,
"DISKNAME |$MC#|");
106 int __milla_getDiskInfo_Free(){
108 __com_formatString(PORT_COM2,
"DISKSIZE_FREE |$MC#|");
111 qemu_log(
"[Milla] [getDiskInfo_Free] ERR! Return %d:%s",answer,
__milla_buffer);
118 int __milla_getDiskInfo_Use(){
120 __com_formatString(PORT_COM2,
"DISKSIZE_USE |$MC#|");
123 qemu_log(
"[Milla] [getDiskInfo_Use] ERR! Return %d:%s",answer,
__milla_buffer);
130 int __milla_getDiskInfo_All(){
132 __com_formatString(PORT_COM2,
"DISKSIZE_ALL |$MC#|");
135 qemu_log(
"[Milla] [getDiskInfo_All] ERR! Return %d:%s",answer,
__milla_buffer);
150 for (
size_t i = 0;i < 5;i++){
159 qemu_log(
"[Milla] [Clean] OK! Return %d:%s",answer,
__milla_buffer);
162 qemu_log(
"[Milla] [Clean] ERR! Return %d:%s",answer,
__milla_buffer);
167 char* __milla_getFile(
const char *path) {
169 __com_formatString(PORT_COM2,
"READ %s |$MC#|",path);
172 qemu_log(
"[Milla] [getFile] ERR! Return %d:%s",answer,
__milla_buffer);
174 }
else if (answer == 0){
175 qemu_log(
"[Milla] [getFile] ERR! Return %d:%s",answer,
__milla_buffer);
178 qemu_log(
"[Milla] [getFile] OK! Return %d:%s",answer,
__milla_buffer);
182 char* buf = (
char*)kmalloc(
sizeof(
char*) * answer);
186 if (inx >= answer)
break;
187 tmp = serial_readchar_timeout(PORT_COM2,10000,
false);
188 if (tmp == 0xFFFFFFFF && !st1){
192 if (tmp != 0xFFFFFFFF && !st1) st1 =
true;
200 int __milla_writeFile(
char* path,
char* data){
202 __com_formatString(PORT_COM2,
"WRITE %s |$MC#|",path);
205 qemu_log(
"[Milla] [writeFile] ERR1! Return %d:%s",answer,
__milla_buffer);
208 __com_formatString(PORT_COM2,
"WRITE %d |$MC#|",
strlen(data));
211 qemu_log(
"[Milla] [writeFile] ERR2! Return %d:%s",answer,
__milla_buffer);
214 __com_formatString(PORT_COM2,
"%s",data);
216 if (answer !=
strlen(data)){
217 qemu_log(
"[Milla] [writeFile] ERR3! Return %d:%s",answer,
__milla_buffer);
220 qemu_log(
"[Milla] [writeFile] OK! %d:%s",
strlen(data),data);
224 int __milla_delete(
char* path){
226 __com_formatString(PORT_COM2,
"DEL %s |$MC#|",path);
232 int __milla_mkdir(
char* path){
234 __com_formatString(PORT_COM2,
"MKDIR %s |$MC#|",path);
240 size_t __milla_findID(
char* path,
char* type){
242 __com_formatString(PORT_COM2,
"FIND %s %s |$MC#|",type,path);
247 size_t __milla_isDir(
size_t inx){
249 __com_formatString(PORT_COM2,
"ISDIR %d |$MC#|",inx);
253 size_t __milla_isFile(
size_t inx){
255 __com_formatString(PORT_COM2,
"ISFILE %d |$MC#|",inx);
259 char* __milla_getRootID(
size_t inx){
261 __com_formatString(PORT_COM2,
"ROOT %d |$MC#|",inx);
266 int __milla_touch(
char* path){
268 __com_formatString(PORT_COM2,
"TOUCH %s |$MC#|",path);
277 char* __milla_getList(
char* path){
279 __com_formatString(PORT_COM1,
"\n< LIST %s |$MC#|\n",path);
280 __com_formatString(PORT_COM2,
"LIST %s |$MC#|",path);
282 __com_formatString(PORT_COM1,
"> %d\n",answer);
284 qemu_log(
"[Milla] [getFile] ERR! Return %d:%s",answer,
__milla_buffer);
286 }
else if (answer == 0){
287 qemu_log(
"[Milla] [getFile] OK! Folder EMPTY Return %d:%s",answer,
__milla_buffer);
291 qemu_log(
"[Milla] [getFile] OK! Return %d:%s",answer,
__milla_buffer);
292 __com_formatString(PORT_COM1,
"\n> LIST GET\n");
293 __com_formatString(PORT_COM2,
"LIST GET|$MC#|");
297 char* buf = (
char*)kmalloc(
sizeof(
char*) * answer);
301 if (inx >= answer)
break;
303 tmp = serial_readchar_timeout(PORT_COM2,10000,
false);
304 if (tmp == 0xFFFFFFFF && !st1){
308 if (tmp != 0xFFFFFFFF && !st1) st1 =
true;
313 __com_formatString(PORT_COM1,
"< %s\n",buf);
317 size_t __milla_getCountFiles(
char* path){
319 __com_formatString(PORT_COM2,
"COUNT %s |$MC#|",path);
330 int cominit = __com_init(PORT_COM2);
335 qemu_log(
"[Milla] Step 1 PASSED");
349 qemu_log(
"[Milla] Step 2 PASSED");
351 qemu_log(
"[Milla] Step 3 ERROR");
355 qemu_log(
"[Milla] Step 3 PASSED");
363 void __milla_destroy(){
385 qemu_log(
"[NatSuki] [nat_readChar] ");
399 uint32_t
nat_read(uint32_t node,
size_t offset,
size_t size,
void *buffer){
402 substr(buffer,(
void*)__milla_getFile(__milla_getRootID(node)),offset,size);
405 qemu_log(
"[NatSuki] [nat_read] [Offset:%d] [Size:%d] Node: %d | Data: %d",offset,size,
strlen(buffer));
419 uint32_t
nat_write(uint32_t node,
size_t offset,
size_t size,
void *buffer){
421 qemu_log(
"[NatSuki] [nat_write] ");
436 return __milla_getSizeFile(__milla_getRootID(node));
447 qemu_log(
"[NatSuki] [nat_getOffsetFile] ");
461 return __milla_findID(filename,
"FILE");
475 return __milla_findID(path,
"DIR");
484 return __milla_getCountFiles(path);
498 qemu_log(
"[NatSuki] [nat_list] %s",path);
499 char* listt = __milla_getList(path);
502 uint32_t _m_d1 =
str_cdsp(listt,
"\n");
503 char* _m_d[256] = {0};
507 char* _m_s[256] = {0};
509 tty_printf(
"Найдено файлов и папок: %d\n",_m_d1);
510 struct dirent* testFS = kcalloc(_m_d1,
sizeof(
struct dirent));
514 for(
size_t ind = 0; ind < _m_d1; ind++){
516 if (_m_d2 < 1)
continue;
519 testFS[inxFile].
type = ((
strcmpn(_m_s[0],
"file")?FS_FILE:FS_DIRECTORY));
520 testFS[inxFile].
ino = inxFile;
521 testFS[inxFile].
next = inxFile+1;
525 qemu_log(
"[Milla] [%s] %s (%d b.) Date: %s Owner: %s",_m_s[0],_m_s[1],(
atoi(_m_s[4])),_m_s[3],_m_s[5]);
527 testFS[inxFile].
next = 0;
544 qemu_log(
"[NatSuki] [nat_diskUsed] ");
556 qemu_log(
"[NatSuki] [nat_diskSpace] ");
568 qemu_log(
"[NatSuki] [nat_diskSize] ");
580 qemu_log(
"[NatSuki] [nat_getDevName] ");
585 void nat_dirfree(
struct dirent* ptr) {
586 qemu_log(
"[NatSuki] [nat_dirfree] ");
589 bool isInitNatSuki(){
601 qemu_log(
"[NatSuki] [Init] loc: %x | state: %d",location,
__milla_b_init);
607 qemu_log(
"NatSuki -> %d",cominit);
638 nat_root->unlistElem = &nat_dirfree;
int32_t nat_findDir(char *path)
[SEFS] Поиск папки на устройстве
char __milla_login[256]
Логин для авторизации
struct dirent * nat_list(char *path)
[SEFS] Выводит список файлов
size_t nat_getOffsetFile(int node)
[SEFS] Получить отступ в файловой системе у файла
fs_node_t * nat_root
Ссылка на виртуальную фс
size_t nat_getLengthFile(int node)
[SEFS] Получить размер файла (поиск по индексу)
int __milla_return_code
Код ошибки
size_t nat_diskUsed(int node)
[SEFS] Количество используемого места устройства
int __milla_init()
Инициализация проекта Милла
int32_t nat_findFile(char *filename)
[SEFS] Поиск файла на устройстве
void __milla_sendcmd(char *msg)
[Milla] Отправка пакета
fs_node_t * NatSuki_initrd(uint32_t location)
[SEFS] Инициализация Sayori Easy File System
char * __milla_getcmd()
[Milla] Чтение пакета
size_t nat_countElemFolder(char *path)
[SEFS] Считает количество элементов в папке
char * __milla_null
Ответ, если Milla не готовa.
size_t nat_diskSpace(int node)
[SEFS] Количество свободного места устройства
char __milla_passwd[256]
Пароль для авторизации
char * __milla_buffer
Буфер
int __milla_cleanState()
Сбрасывает состояние Milla.
size_t nat_diskSize(int node)
[SEFS] Количество всего места устройства
uint32_t nat_read(uint32_t node, size_t offset, size_t size, void *buffer)
[SEFS] Чтение файла
char * nat_getDevName(int node)
[SEFS] Получение имени устройства
bool __milla_b_init
Milla готова к работе?
uint32_t nat_write(uint32_t node, size_t offset, size_t size, void *buffer)
[SEFS] запись в файл
char * nat_readChar(uint32_t node)
[SEFS] Полное чтение файла
size_t strlen(const char *str)
Возращает длину строки
int strcmp(const char *s1, const char *s2)
Сравнение строк
uint32_t atoi(const char s[])
Превращает строку в число
bool strcmpn(const char *str1, const char *str2)
Сравнение строк
void * memset(void *ptr, char value, size_t num)
Заполнение массива указанными символами
void * memcpy(void *restrict destination, const void *restrict source, size_t n)
Копирование непересекающихся массивов используя SSE.
void substr(char *restrict dest, const char *restrict source, int from, int length)
Вырезает и возвращает подстроку из строки
int strcpy(char *dest, const char *src)
Копирование строк
uint32_t str_cdsp(const char *a_str, const char *del)
Функция отладки
void str_split(const char a_str[], char *out[], char *del)
Функция для деления строк
Согласно POSIX, один из них возвращается вызовом readdir.
uint8_t next
Следующая позиция
uint32_t ino
Номер inode. Требеся для POSIX.
size_t length
Размер файла
getDeviceSize_type_t diskSpace
Сколько свободно места
read_type_t read
Функция FS - Чтение файла с указанием параметров
getLengthFile_type_t getOffsetFile
Функция FS - Функция для получения позиции файла (отступ)
struct fs_node * ptr
Используется для точек монтирования и символических ссылок.
dirlist_type_t getListElem
Функция FS - Функция для получения списка файлов
charintData_type_t getDevName
Функция для получения имени устройства
write_type_t write
Функция FS - Запись в файл
readChar_type_t readChar
Функция FS - Полное чтение файла
countElemFolder_type_t getCountElemFolder
Функция FS - Функция для получения количества файлов в папке
uint32_t uid
Пользователь, владеющий файлом.
open_type_t open
Функция FS - Функция для открытия файла (не исп)
getLengthFile_type_t getLengthFile
Функция FS - Функция для получения размера файла
getDeviceSize_type_t diskUsed
Сколько использовано места
uint32_t impl
Номер, зависящий от реализации.
uint32_t flags
Включает тип нода. Смотрите определение #defines, приведенное выше.
uint32_t inode
Зависит от устройства, позволяет файловой системе идентифицировать файлы.
findFile_type_t findDir
Функция FS - Функция для поиска файла
uint32_t gid
Группа, владеющая файлом.
close_type_t close
Функция FS - Функция для закрытия файла (не исп)
char devName[512]
Имя устройства
findFile_type_t findFile
Функция FS - Функция для поиска файла
uint32_t mask
Маска прав доступа.
getDeviceSize_type_t diskSize
Размер диска
uint32_t length
Размер файла в байтах.