]> git.ipfire.org Git - thirdparty/qemu.git/blame - block.c
IDE emulation
[thirdparty/qemu.git] / block.c
CommitLineData
fc01f7e7
FB
1/*
2 * QEMU System Emulator block driver
3 *
4 * Copyright (c) 2003 Fabrice Bellard
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
24#include <stdlib.h>
25#include <stdio.h>
26#include <stdarg.h>
27#include <string.h>
28#include <getopt.h>
29#include <inttypes.h>
30#include <unistd.h>
31#include <sys/mman.h>
32#include <fcntl.h>
33#include <signal.h>
34#include <time.h>
35#include <sys/time.h>
36#include <malloc.h>
37#include <termios.h>
38#include <sys/poll.h>
39#include <errno.h>
40#include <sys/wait.h>
41
42#include "vl.h"
43
44struct BlockDriverState {
45 int fd;
46 int64_t total_sectors;
47};
48
49BlockDriverState *bdrv_open(const char *filename)
50{
51 BlockDriverState *bs;
52 int fd;
53 int64_t size;
54
55 bs = malloc(sizeof(BlockDriverState));
56 if(!bs)
57 return NULL;
58 fd = open(filename, O_RDWR);
59 if (fd < 0) {
60 close(fd);
61 free(bs);
62 return NULL;
63 }
64 size = lseek64(fd, 0, SEEK_END);
65 bs->total_sectors = size / 512;
66 bs->fd = fd;
67 return bs;
68}
69
70void bdrv_close(BlockDriverState *bs)
71{
72 close(bs->fd);
73 free(bs);
74}
75
76/* return -1 if error */
77int bdrv_read(BlockDriverState *bs, int64_t sector_num,
78 uint8_t *buf, int nb_sectors)
79{
80 int ret;
81
82 lseek64(bs->fd, sector_num * 512, SEEK_SET);
83 ret = read(bs->fd, buf, nb_sectors * 512);
84 if (ret != nb_sectors * 512)
85 return -1;
86 else
87 return 0;
88}
89
90/* return -1 if error */
91int bdrv_write(BlockDriverState *bs, int64_t sector_num,
92 const uint8_t *buf, int nb_sectors)
93{
94 int ret;
95
96 lseek64(bs->fd, sector_num * 512, SEEK_SET);
97 ret = write(bs->fd, buf, nb_sectors * 512);
98 if (ret != nb_sectors * 512)
99 return -1;
100 else
101 return 0;
102}
103
104void bdrv_get_geometry(BlockDriverState *bs, int64_t *nb_sectors_ptr)
105{
106 *nb_sectors_ptr = bs->total_sectors;
107}