7 #include "sys/file_descriptors.h"
8 #include "../src/lib/libvector/include/vector.h"
13 int last_descriptor_number = 0;
15 void file_descriptors_init() {
16 descriptors = vector_new();
18 qemu_log(
"File descriptors initialized");
22 size_t file_descriptor_allocate(
const char *filename,
size_t mode,
int *out) {
23 FILE* file = fopen_binmode(filename,
mode);
30 struct fd_info* inf = kcalloc(
sizeof *inf, 1);
32 inf->fd = last_descriptor_number++;
35 vector_push_back(descriptors, (
size_t) inf);
39 qemu_ok(
"Written to: %d", out);
40 qemu_log(
"allocated fd: %d", inf->fd);
45 struct fd_info* file_descriptor_get(
int descriptor_number) {
46 for(
int i = 0; i < descriptors->size; i++) {
47 struct fd_info *inf = (
struct fd_info *) vector_get(descriptors, i).element;
49 if (inf->fd == descriptor_number) {
57 size_t file_descriptor_read(
int descriptor_number,
size_t count,
void* buffer) {
58 qemu_log(
"FD: %d; Size: %d; Buffer: %x", descriptor_number, count, buffer);
60 if(descriptor_number < 0 || descriptor_number >= last_descriptor_number) {
61 qemu_err(
"Invalid descriptor: %d!", descriptor_number);
65 if(!file_descriptor_get(descriptor_number)) {
69 struct fd_info* inf = file_descriptor_get(descriptor_number);
71 qemu_note(
"[%x] Read: %d bytes (buffer at: %x)", inf, count, buffer);
73 fread(inf->file, count, 1, buffer);
75 qemu_note(
"Read finished!");
77 qemu_log(
"%s\n", buffer);
82 size_t file_descriptor_write(
int descriptor_number,
size_t count,
const void* buffer) {
83 qemu_log(
"FD: %d; Size: %d; Buffer: %x", descriptor_number, count, buffer);
85 if(descriptor_number < 0 || descriptor_number >= last_descriptor_number) {
86 qemu_err(
"Invalid descriptor: %d!", descriptor_number);
90 if(!file_descriptor_get(descriptor_number)) {
94 struct fd_info* inf = file_descriptor_get(descriptor_number);
96 qemu_note(
"[%x] Write: %d bytes (buffer at: %x)", inf, count, buffer);
98 fwrite(inf->file, count, 1, buffer);
103 size_t file_descriptor_close(
int descriptor_number) {
104 if(descriptor_number < 0 || descriptor_number >= last_descriptor_number)
107 for(
int i = 0; i < descriptors->size; i++) {
108 struct fd_info *inf = (
struct fd_info *) vector_get(descriptors, i).element;
110 if (inf->fd == descriptor_number) {
113 vector_erase_nth(descriptors, i);
117 qemu_ok(
"Destroyed: %d", descriptor_number);
123 qemu_err(
"FAILED TO DESTROY fd: %d", descriptor_number);
128 size_t file_descriptor_seek(
int descriptor_number, ssize_t value,
size_t whence) {
142 if(descriptor_number < 0 || descriptor_number >= last_descriptor_number) {
143 qemu_err(
"Invalid descriptor: %d!", descriptor_number);
147 if(!file_descriptor_get(descriptor_number)) {
151 struct fd_info* inf = file_descriptor_get(descriptor_number);
153 qemu_note(
"[%x] Seek: Value: %x; Whence: %x", inf, value, whence);
155 fseek(inf->file, value, whence);
161 size_t file_descriptor_tell(
int descriptor_number,
int* out) {
162 if(descriptor_number < 0 || descriptor_number >= last_descriptor_number) {
166 if(!file_descriptor_get(descriptor_number)) {
170 struct fd_info* inf = file_descriptor_get(descriptor_number);
172 *out =
ftell(inf->file);
uint32_t mode
Режим работы (0 - Обычный | 1 - Режим логирования)
ssize_t fseek(FILE *stream, ssize_t offset, uint8_t whence)
Установка позиции в потоке данных относительно текущей позиции
void fclose(FILE *stream)
Закончить работу с файлом
size_t fwrite(FILE *stream, size_t size, size_t count, const void *ptr)
Запись файла
int ftell(FILE *stream)
Текущая позиция считывания в файле
int fread(FILE *stream, size_t count, size_t size, void *buffer)
Чтение файла
Структура файла. Требуется для работы с VFS.