allow read only images
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Mon, 30 Jun 2003 23:17:31 +0000 (23:17 +0000)
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Mon, 30 Jun 2003 23:17:31 +0000 (23:17 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@299 c046a42c-6fe2-441c-8c8c-71466251a162

block.c

diff --git a/block.c b/block.c
index 1ac8210..c687ff7 100644 (file)
--- a/block.c
+++ b/block.c
@@ -44,6 +44,7 @@
 struct BlockDriverState {
     int fd;
     int64_t total_sectors;
+    int read_only;
 };
 
 BlockDriverState *bdrv_open(const char *filename)
@@ -55,11 +56,16 @@ BlockDriverState *bdrv_open(const char *filename)
     bs = malloc(sizeof(BlockDriverState));
     if(!bs)
         return NULL;
+    bs->read_only = 0;
     fd = open(filename, O_RDWR);
     if (fd < 0) {
-        close(fd);
-        free(bs);
-        return NULL;
+        fd = open(filename, O_RDONLY);
+        if (fd < 0) {
+            close(fd);
+            free(bs);
+            return NULL;
+        }
+        bs->read_only = 1;
     }
     size = lseek64(fd, 0, SEEK_END);
     bs->total_sectors = size / 512;
@@ -93,6 +99,9 @@ int bdrv_write(BlockDriverState *bs, int64_t sector_num,
 {
     int ret;
 
+    if (bs->read_only)
+        return -1;
+
     lseek64(bs->fd, sector_num * 512, SEEK_SET);
     ret = write(bs->fd, buf, nb_sectors * 512);
     if (ret != nb_sectors * 512)