libzip win32 patch(修正版)

アーカイブを作るとやたらとCRCエラーが出るので、なんで?なんで?と思ってたら、fwriteでバイナリデータの改行コードが書き換えられていたせいだった…orz

fopenではバイナリモードで開いているので、openを修正。

#define open(p, f, m) _open((p), ((f) | _O_BINARY), _S_IREAD | _S_IWRITE)

修正後のパッチは以下の通り。

diff -ru libzip-0.8.orig/lib/mkstemp.c libzip-0.8/lib/mkstemp.c
--- libzip-0.8.orig/lib/mkstemp.c	2007-05-16 10:41:34.000000000 +0900
+++ libzip-0.8/lib/mkstemp.c	2008-04-22 23:14:12.140625000 +0900
@@ -43,6 +43,15 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+#ifdef _WIN32
+#include <io.h>
+#include <process.h>
+#define getpid() _getpid()
+typedef int pid_t;
+#define S_ISDIR(m) (((m) & (_S_IFMT)) == (_S_IFDIR))
+#define open(p, f, m) _open((p), ((f) | _O_BINARY), _S_IREAD | _S_IWRITE)
+#endif
+
 int
 _zip_mkstemp(char *path)
 {
diff -ru libzip-0.8.orig/lib/zip.h libzip-0.8/lib/zip.h
--- libzip-0.8.orig/lib/zip.h	2007-06-05 00:21:20.000000000 +0900
+++ libzip-0.8/lib/zip.h	2008-04-22 23:14:12.140625000 +0900
@@ -46,6 +46,10 @@
 #include <stdio.h>
 #include <time.h>
 
+#ifdef _WIN32
+typedef int ssize_t;
+#endif
+
 /* flags for zip_open */
 
 #define ZIP_CREATE           1
diff -ru libzip-0.8.orig/lib/zip_close.c libzip-0.8/lib/zip_close.c
--- libzip-0.8.orig/lib/zip_close.c	2007-06-05 00:21:20.000000000 +0900
+++ libzip-0.8/lib/zip_close.c	2008-04-22 23:15:48.203125000 +0900
@@ -42,6 +42,13 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 
+#ifdef _WIN32
+#include <windows.h>
+#include <io.h>
+#define close(f) _close(f)
+#define rename(s, d) (MoveFileExA((s), (d), MOVEFILE_REPLACE_EXISTING) ? 0 : -1)
+#endif
+
 #include "zip.h"
 #include "zipint.h"
 
@@ -65,7 +72,9 @@
     int i, j, error;
     char *temp;
     FILE *out;
+#ifndef _WIN32
     mode_t mask;
+#endif
     struct zip_cdir *cd;
     struct zip_dirent de;
     int reopen_on_error;
@@ -242,9 +251,11 @@
 	}
 	return -1;
     }
+#ifndef _WIN32
     mask = umask(0);
     umask(mask);
     chmod(za->zn, 0666&~mask);
+#endif
 
     _zip_free(za);
     free(temp);
diff -ru libzip-0.8.orig/lib/zip_error_to_str.c libzip-0.8/lib/zip_error_to_str.c
--- libzip-0.8.orig/lib/zip_error_to_str.c	2007-05-16 10:41:34.000000000 +0900
+++ libzip-0.8/lib/zip_error_to_str.c	2008-04-22 23:14:12.140625000 +0900
@@ -40,6 +40,10 @@
 #include <stdlib.h>
 #include <string.h>
 
+#ifdef _WIN32
+#define snprintf _snprintf
+#endif
+
 #include "zip.h"
 #include "zipint.h"
 
diff -ru libzip-0.8.orig/lib/zip_name_locate.c libzip-0.8/lib/zip_name_locate.c
--- libzip-0.8.orig/lib/zip_name_locate.c	2007-06-05 00:21:21.000000000 +0900
+++ libzip-0.8/lib/zip_name_locate.c	2008-04-22 23:14:12.156250000 +0900
@@ -37,6 +37,10 @@
 
 #include <string.h>
 
+#ifdef _WIN32
+#define strcasecmp _stricmp
+#endif
+
 #include "zip.h"
 #include "zipint.h"
 
diff -ru libzip-0.8.orig/lib/zipint.h libzip-0.8/lib/zipint.h
--- libzip-0.8.orig/lib/zipint.h	2007-06-05 00:21:21.000000000 +0900
+++ libzip-0.8/lib/zipint.h	2008-04-22 23:14:12.156250000 +0900
@@ -39,7 +39,9 @@
 #include <zlib.h>
 
 #include "zip.h"
+#ifndef _WIN32
 #include "config.h"
+#endif
 
 #ifndef HAVE_MKSTEMP
 int _zip_mkstemp(char *);