Revision beac80cd

b/Changelog
10 10
  - USB updates (Paul Brook)
11 11
  - UDP character devices (Jason Wessel)
12 12
  - TCP character devices
13
  - Windows sparse file support (Frediano Ziglio)
13 14

  
14 15
version 0.8.1:
15 16

  
b/block.c
761 761
    close(s->fd);
762 762
}
763 763

  
764
#ifdef _WIN32
765
#include <windows.h>
766
#include <winioctl.h>
767

  
768
int qemu_ftruncate64(int fd, int64_t length)
769
{
770
    LARGE_INTEGER li;
771
    LONG high;
772
    HANDLE h;
773
    BOOL res;
774

  
775
    if ((GetVersion() & 0x80000000UL) && (length >> 32) != 0)
776
	return -1;
777

  
778
    h = (HANDLE)_get_osfhandle(fd);
779

  
780
    /* get current position, ftruncate do not change position */
781
    li.HighPart = 0;
782
    li.LowPart = SetFilePointer (h, 0, &li.HighPart, FILE_CURRENT);
783
    if (li.LowPart == 0xffffffffUL && GetLastError() != NO_ERROR)
784
	return -1;
785

  
786
    high = length >> 32;
787
    if (!SetFilePointer(h, (DWORD) length, &high, FILE_BEGIN))
788
	return -1;
789
    res = SetEndOfFile(h);
790

  
791
    /* back to old position */
792
    SetFilePointer(h, li.LowPart, &li.HighPart, FILE_BEGIN);
793
    return res ? 0 : -1;
794
}
795

  
796
static int set_sparse(int fd)
797
{
798
    DWORD returned;
799
    return (int) DeviceIoControl((HANDLE)_get_osfhandle(fd), FSCTL_SET_SPARSE,
800
				 NULL, 0, NULL, 0, &returned, NULL);
801
}
802
#else
803
static inline int set_sparse(int fd)
804
{
805
    return 1;
806
}
807
#endif
808

  
764 809
static int raw_create(const char *filename, int64_t total_size,
765 810
                      const char *backing_file, int flags)
766 811
{
......
773 818
              0644);
774 819
    if (fd < 0)
775 820
        return -EIO;
821
    set_sparse(fd);
776 822
    ftruncate(fd, total_size * 512);
777 823
    close(fd);
778 824
    return 0;
b/vl.h
51 51
#define fsync _commit
52 52
#define lseek _lseeki64
53 53
#define ENOTSUP 4096
54
/* XXX: find 64 bit version */
55
#define ftruncate chsize
54
extern int qemu_ftruncate64(int, int64_t);
55
#define ftruncate qemu_ftruncate64
56

  
56 57

  
57 58
static inline char *realpath(const char *path, char *resolved_path)
58 59
{

Also available in: Unified diff