added block.c
[qemu] / block.c
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
44 struct BlockDriverState {
45     int fd;
46     int64_t total_sectors;
47 };
48
49 BlockDriverState *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
70 void bdrv_close(BlockDriverState *bs)
71 {
72     close(bs->fd);
73     free(bs);
74 }
75
76 /* return -1 if error */
77 int 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 */
91 int 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
104 void bdrv_get_geometry(BlockDriverState *bs, int64_t *nb_sectors_ptr)
105 {
106     *nb_sectors_ptr = bs->total_sectors;
107 }