Files
umka/vdisk/raw.c
T

84 lines
2.4 KiB
C
Raw Normal View History

/*
SPDX-License-Identifier: GPL-2.0-or-later
UMKa - User-Mode KolibriOS developer tools
vdisk - virtual disk, raw format
Copyright (C) 2023 Ivan Baravy <dunkaist@gmail.com>
*/
2023-01-04 00:15:40 +00:00
#include <errno.h>
#include <fcntl.h>
2023-01-04 00:15:40 +00:00
#include <stdlib.h>
#include <unistd.h>
2023-01-04 00:15:40 +00:00
#include "../trace.h"
#include "umkaio.h"
2023-01-04 00:15:40 +00:00
#include "raw.h"
struct vdisk_raw {
struct vdisk vdisk;
int fd;
};
2023-01-04 00:15:40 +00:00
STDCALL void
vdisk_raw_close(void *userdata) {
COVERAGE_OFF();
struct vdisk_raw *disk = userdata;
close(disk->fd);
2023-01-04 00:15:40 +00:00
free(disk);
COVERAGE_ON();
}
STDCALL int
vdisk_raw_read(void *userdata, void *buffer, off_t startsector,
size_t *numsectors) {
COVERAGE_OFF();
struct vdisk_raw *disk = userdata;
lseek(disk->fd, startsector * disk->vdisk.sect_size, SEEK_SET);
io_read(disk->fd, buffer, *numsectors * disk->vdisk.sect_size,
2023-01-17 00:49:11 +00:00
disk->vdisk.io);
2023-01-04 00:15:40 +00:00
COVERAGE_ON();
return KOS_ERROR_SUCCESS;
2023-01-04 00:15:40 +00:00
}
STDCALL int
vdisk_raw_write(void *userdata, void *buffer, off_t startsector,
size_t *numsectors) {
COVERAGE_OFF();
struct vdisk_raw *disk = userdata;
lseek(disk->fd, startsector * disk->vdisk.sect_size, SEEK_SET);
io_write(disk->fd, buffer, *numsectors * disk->vdisk.sect_size,
2023-01-17 00:49:11 +00:00
disk->vdisk.io);
2023-01-04 00:15:40 +00:00
COVERAGE_ON();
return KOS_ERROR_SUCCESS;
2023-01-04 00:15:40 +00:00
}
struct vdisk*
2023-02-06 16:01:37 +00:00
vdisk_init_raw(const char *fname, const struct umka_io *io) {
2023-02-06 14:16:35 +00:00
int fd = open(fname, O_RDONLY | O_BINARY);
if (!fd) {
2023-01-04 00:15:40 +00:00
printf("[vdisk.raw]: can't open file '%s': %s\n", fname, strerror(errno));
return NULL;
}
off_t fsize = lseek(fd, 0, SEEK_END);
lseek(fd, 0, SEEK_SET);
2023-01-04 00:15:40 +00:00
size_t sect_size = 512;
if (strstr(fname, "s4096") != NULL || strstr(fname, "s4k") != NULL) {
sect_size = 4096;
}
struct vdisk_raw *disk = (struct vdisk_raw*)malloc(sizeof(struct vdisk_raw));
*disk = (struct vdisk_raw){
.vdisk = {.diskfunc = {.strucsize = sizeof(diskfunc_t),
.close = vdisk_raw_close,
.read = vdisk_raw_read,
.write = vdisk_raw_write,
},
.sect_size = sect_size,
.sect_cnt = (uint64_t)fsize / sect_size,
.io = io,
2023-01-04 00:15:40 +00:00
},
.fd = fd,
2023-01-04 00:15:40 +00:00
};
return (struct vdisk*)disk;
2023-01-04 00:15:40 +00:00
}