]> git.proxmox.com Git - qemu.git/blobdiff - qemu-img.c
-no-fd-bootchk option (Lonnie Mendez)
[qemu.git] / qemu-img.c
index 5f8362235859dd329e674f8b08bf3cb182944039..c5a8e1a61ca19e09d94f34fbf79584d05de6dc4d 100644 (file)
  */
 #include "vl.h"
 
+#ifdef _WIN32
+#include <windows.h>
+#endif
+
 void *get_mmap_addr(unsigned long size)
 {
     return NULL;
@@ -127,7 +131,7 @@ static void format_print(void *opaque, const char *name)
 
 void help(void)
 {
-    printf("qemu-img version " QEMU_VERSION ", Copyright (c) 2004 Fabrice Bellard\n"
+    printf("qemu-img version " QEMU_VERSION ", Copyright (c) 2004-2005 Fabrice Bellard\n"
            "usage: qemu-img command [command options]\n"
            "QEMU disk image utility\n"
            "\n"
@@ -160,12 +164,12 @@ void help(void)
 
 static void get_human_readable_size(char *buf, int buf_size, int64_t size)
 {
-    char suffixes[NB_SUFFIXES] = "KMGT";
+    static const char suffixes[NB_SUFFIXES] = "KMGT";
     int64_t base;
     int i;
 
     if (size <= 999) {
-        snprintf(buf, buf_size, "%lld", size);
+        snprintf(buf, buf_size, "%" PRId64, size);
     } else {
         base = 1024;
         for(i = 0; i < NB_SUFFIXES; i++) {
@@ -175,8 +179,8 @@ static void get_human_readable_size(char *buf, int buf_size, int64_t size)
                          suffixes[i]);
                 break;
             } else if (size < (1000 * base) || i == (NB_SUFFIXES - 1)) {
-                snprintf(buf, buf_size, "%lld%c", 
-                         (size + (base >> 1)) / base,
+                snprintf(buf, buf_size, "%" PRId64 "%c", 
+                         ((size + (base >> 1)) / base),
                          suffixes[i]);
                 break;
             }
@@ -333,7 +337,6 @@ static int img_create(int argc, char **argv)
             break;
         }
     }
-    optind++;
     if (optind >= argc) 
         help();
     filename = argv[optind++];
@@ -370,11 +373,11 @@ static int img_create(int argc, char **argv)
         printf(", backing_file=%s",
                base_filename);
     }
-    printf(", size=%lld kB\n", size / 1024);
+    printf(", size=%" PRId64 " kB\n", (int64_t) (size / 1024));
     ret = bdrv_create(drv, filename, size / 512, base_filename, encrypted);
     if (ret < 0) {
         if (ret == -ENOTSUP) {
-            error("Formatting or formatting option not suppored for file format '%s'", fmt);
+            error("Formatting or formatting option not supported for file format '%s'", fmt);
         } else {
             error("Error while formatting");
         }
@@ -403,7 +406,6 @@ static int img_commit(int argc, char **argv)
             break;
         }
     }
-    optind++;
     if (optind >= argc) 
         help();
     filename = argv[optind++];
@@ -511,7 +513,6 @@ static int img_convert(int argc, char **argv)
             break;
         }
     }
-    optind++;
     if (optind >= argc) 
         help();
     filename = argv[optind++];
@@ -534,7 +535,7 @@ static int img_convert(int argc, char **argv)
     ret = bdrv_create(drv, out_filename, total_sectors, NULL, encrypt);
     if (ret < 0) {
         if (ret == -ENOTSUP) {
-            error("Formatting not suppored for file format '%s'", fmt);
+            error("Formatting not supported for file format '%s'", fmt);
         } else {
             error("Error while formatting '%s'", out_filename);
         }
@@ -562,7 +563,8 @@ static int img_convert(int argc, char **argv)
                 memset(buf + n * 512, 0, cluster_size - n * 512);
             if (is_not_zero(buf, cluster_size)) {
                 if (qcow_compress_cluster(out_bs, sector_num, buf) != 0)
-                    error("error while compressing sector %lld", sector_num);
+                    error("error while compressing sector %" PRId64,
+                          sector_num);
             }
             sector_num += n;
         }
@@ -601,7 +603,19 @@ static int img_convert(int argc, char **argv)
 #ifdef _WIN32
 static int64_t get_allocated_file_size(const char *filename)
 {
+    typedef DWORD (WINAPI * get_compressed_t)(const char *filename, DWORD *high);
+    get_compressed_t get_compressed;
     struct _stati64 st;
+
+    /* WinNT support GetCompressedFileSize to determine allocate size */
+    get_compressed = (get_compressed_t) GetProcAddress(GetModuleHandle("kernel32"), "GetCompressedFileSizeA");
+    if (get_compressed) {
+       DWORD high, low;
+       low = get_compressed(filename, &high);
+       if (low != 0xFFFFFFFFlu || GetLastError() == NO_ERROR)
+           return (((int64_t) high) << 32) + low;
+    }
+
     if (_stati64(filename, &st) < 0) 
         return -1;
     return st.st_size;
@@ -639,7 +653,6 @@ static int img_info(int argc, char **argv)
             break;
         }
     }
-    optind++;
     if (optind >= argc) 
         help();
     filename = argv[optind++];
@@ -662,15 +675,16 @@ static int img_info(int argc, char **argv)
     get_human_readable_size(size_buf, sizeof(size_buf), total_sectors * 512);
     allocated_size = get_allocated_file_size(filename);
     if (allocated_size < 0)
-        error("Could not get file size '%s'", filename);
-    get_human_readable_size(dsize_buf, sizeof(dsize_buf), 
-                            allocated_size);
+       sprintf(dsize_buf, "unavailable");
+    else
+        get_human_readable_size(dsize_buf, sizeof(dsize_buf), 
+                                allocated_size);
     printf("image: %s\n"
            "file format: %s\n"
-           "virtual size: %s (%lld bytes)\n"
+           "virtual size: %s (%" PRId64 " bytes)\n"
            "disk size: %s\n",
            filename, fmt_name, size_buf, 
-           total_sectors * 512,
+           (total_sectors * 512),
            dsize_buf);
     if (bdrv_is_encrypted(bs))
         printf("encrypted: yes\n");
@@ -686,6 +700,7 @@ int main(int argc, char **argv)
     if (argc < 2)
         help();
     cmd = argv[1];
+    optind++;
     if (!strcmp(cmd, "create")) {
         img_create(argc, argv);
     } else if (!strcmp(cmd, "commit")) {