--- Urlader/urlib.c 2012/01/02 09:23:04 1.2 +++ Urlader/urlib.c 2012/01/09 14:13:54 1.5 @@ -23,7 +23,7 @@ #define u_mkdir(path) !CreateDirectory (path, NULL) #define u_chdir(path) !SetCurrentDirectory (path) #define u_rename(fr,to) !MoveFile (fr, to) - #define u_open(path) CreateFile (path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL) + #define u_open(path) CreateFile (path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL) #define u_creat(path,exec) CreateFile (path, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL) #define u_creat(path,exec) CreateFile (path, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL) #define u_close(handle) CloseHandle (handle) @@ -33,7 +33,7 @@ #define u_fsync(handle) FlushFileBuffers (handle) #define u_sync() - #define u_lockfile(path) CreateFile (path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) + #define u_lockfile(path) CreateFile (path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) #define u_cloexec(handle) #else @@ -112,15 +112,20 @@ { void *addr; -#ifdef _WIN32 - HANDLE handle = CreateFileMapping (0, 0, PAGE_READWRITE, 0, size, NULL); - - if (!handle) + if (!size) return 0; - addr = MapViewOfFile (handle, FILE_MAP_WRITE, 0, 0, size); +#ifdef _WIN32 + { + HANDLE handle = CreateFileMapping (0, 0, PAGE_READWRITE, 0, size, NULL); - CloseHandle (handle); + addr = 0; + if (handle) + { + addr = MapViewOfFile (handle, FILE_MAP_WRITE, 0, 0, size); + CloseHandle (handle); + } + } #elif defined (MAP_ANONYMOUS) addr = mmap (0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); @@ -130,12 +135,18 @@ addr = malloc (size); #endif + if (!addr) + u_fatal ("memory allocation failure, aborting."); + return addr; } static void u_free (void *addr, unsigned int size) { + if (!addr) + return; + #ifdef _WIN32 UnmapViewOfFile (addr); #elif defined (MAP_ANONYMOUS) @@ -146,6 +157,16 @@ } static void * +u_realloc (void *addr, unsigned int old_size, unsigned int new_size) +{ + void *addr2 = u_malloc (new_size); + memcpy (addr2, addr, (new_size < old_size ? new_size : old_size)); + u_free (addr, old_size); + + return addr2; +} + +static void * u_mmap (u_handle h, unsigned int size) { void *addr; @@ -180,6 +201,35 @@ } ///////////////////////////////////////////////////////////////////////////// + +typedef struct +{ + char *addr; + unsigned int used; + unsigned int size; +} u_dynbuf; + +static void * +u_dynbuf_append (u_dynbuf *dynbuf, void *data, unsigned int len) +{ + char *dest; + + if ((dynbuf->used += len) > dynbuf->size) + { + unsigned int new_size = dynbuf->size ? dynbuf->size * 2 : 4096; + dynbuf->addr = u_realloc (dynbuf->addr, dynbuf->size, new_size); + dynbuf->size = new_size; + } + + dest = dynbuf->addr + dynbuf->used - len; + + if (data) + memcpy (dest, data, len); + + return dest; +} + +///////////////////////////////////////////////////////////////////////////// static void u_set_datadir (void)