]> git.proxmox.com Git - qemu.git/blame - block.c
added IDE WIN_READ_NATIVE_MAX command (2.5.xx fix) - added support for proper system...
[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;
0849bf08 47 int read_only;
fc01f7e7
FB
48};
49
50BlockDriverState *bdrv_open(const char *filename)
51{
52 BlockDriverState *bs;
53 int fd;
54 int64_t size;
55
56 bs = malloc(sizeof(BlockDriverState));
57 if(!bs)
58 return NULL;
0849bf08 59 bs->read_only = 0;
fc01f7e7
FB
60 fd = open(filename, O_RDWR);
61 if (fd < 0) {
0849bf08
FB
62 fd = open(filename, O_RDONLY);
63 if (fd < 0) {
64 close(fd);
65 free(bs);
66 return NULL;
67 }
68 bs->read_only = 1;
fc01f7e7
FB
69 }
70 size = lseek64(fd, 0, SEEK_END);
71 bs->total_sectors = size / 512;
72 bs->fd = fd;
73 return bs;
74}
75
76void bdrv_close(BlockDriverState *bs)
77{
78 close(bs->fd);
79 free(bs);
80}
81
82/* return -1 if error */
83int bdrv_read(BlockDriverState *bs, int64_t sector_num,
84 uint8_t *buf, int nb_sectors)
85{
86 int ret;
87
88 lseek64(bs->fd, sector_num * 512, SEEK_SET);
89 ret = read(bs->fd, buf, nb_sectors * 512);
90 if (ret != nb_sectors * 512)
91 return -1;
92 else
93 return 0;
94}
95
96/* return -1 if error */
97int bdrv_write(BlockDriverState *bs, int64_t sector_num,
98 const uint8_t *buf, int nb_sectors)
99{
100 int ret;
101
0849bf08
FB
102 if (bs->read_only)
103 return -1;
104
fc01f7e7
FB
105 lseek64(bs->fd, sector_num * 512, SEEK_SET);
106 ret = write(bs->fd, buf, nb_sectors * 512);
107 if (ret != nb_sectors * 512)
108 return -1;
109 else
110 return 0;
111}
112
113void bdrv_get_geometry(BlockDriverState *bs, int64_t *nb_sectors_ptr)
114{
115 *nb_sectors_ptr = bs->total_sectors;
116}