diff options
author | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2003-06-30 10:03:06 +0000 |
---|---|---|
committer | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2003-06-30 10:03:06 +0000 |
commit | fc01f7e7f902ce96d985f44dc16f7c020b94f02b (patch) | |
tree | a605eae1357d6f00596eecadedaa8859790f9658 /block.c | |
parent | 3b0dca51b0cefb662f1d2757fcccfd563c58b2b9 (diff) |
IDE emulation
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@291 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'block.c')
-rw-r--r-- | block.c | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/block.c b/block.c new file mode 100644 index 0000000000..1ac8210e01 --- /dev/null +++ b/block.c @@ -0,0 +1,107 @@ +/* + * QEMU System Emulator block driver + * + * Copyright (c) 2003 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <getopt.h> +#include <inttypes.h> +#include <unistd.h> +#include <sys/mman.h> +#include <fcntl.h> +#include <signal.h> +#include <time.h> +#include <sys/time.h> +#include <malloc.h> +#include <termios.h> +#include <sys/poll.h> +#include <errno.h> +#include <sys/wait.h> + +#include "vl.h" + +struct BlockDriverState { + int fd; + int64_t total_sectors; +}; + +BlockDriverState *bdrv_open(const char *filename) +{ + BlockDriverState *bs; + int fd; + int64_t size; + + bs = malloc(sizeof(BlockDriverState)); + if(!bs) + return NULL; + fd = open(filename, O_RDWR); + if (fd < 0) { + close(fd); + free(bs); + return NULL; + } + size = lseek64(fd, 0, SEEK_END); + bs->total_sectors = size / 512; + bs->fd = fd; + return bs; +} + +void bdrv_close(BlockDriverState *bs) +{ + close(bs->fd); + free(bs); +} + +/* return -1 if error */ +int bdrv_read(BlockDriverState *bs, int64_t sector_num, + uint8_t *buf, int nb_sectors) +{ + int ret; + + lseek64(bs->fd, sector_num * 512, SEEK_SET); + ret = read(bs->fd, buf, nb_sectors * 512); + if (ret != nb_sectors * 512) + return -1; + else + return 0; +} + +/* return -1 if error */ +int bdrv_write(BlockDriverState *bs, int64_t sector_num, + const uint8_t *buf, int nb_sectors) +{ + int ret; + + lseek64(bs->fd, sector_num * 512, SEEK_SET); + ret = write(bs->fd, buf, nb_sectors * 512); + if (ret != nb_sectors * 512) + return -1; + else + return 0; +} + +void bdrv_get_geometry(BlockDriverState *bs, int64_t *nb_sectors_ptr) +{ + *nb_sectors_ptr = bs->total_sectors; +} |