aboutsummaryrefslogtreecommitdiffstats
path: root/win32/patches/libical.patch
diff options
context:
space:
mode:
Diffstat (limited to 'win32/patches/libical.patch')
-rw-r--r--win32/patches/libical.patch169
1 files changed, 169 insertions, 0 deletions
diff --git a/win32/patches/libical.patch b/win32/patches/libical.patch
new file mode 100644
index 0000000000..96a0c1e4b3
--- /dev/null
+++ b/win32/patches/libical.patch
@@ -0,0 +1,169 @@
+diff -upr -x .deps -x .libs -x '*.la' libical-1.0.old/src/libical/icaltime.c libical-1.0/src/libical/icaltime.c
+--- libical-1.0.old/src/libical/icaltime.c 2013-04-14 17:24:42 +0000
++++ libical-1.0/src/libical/icaltime.c 2014-08-03 13:58:29 +0000
+@@ -61,7 +61,7 @@
+ #undef gmtime_r
+
+ /* The gmtime() in Microsoft's C library is MT-safe */
+-#define gmtime_r(tp,tmp) (gmtime(tp)?(*(tmp)=*gmtime(tp),(tmp)):0)
++#define gmtime_r(tp,tmp) (gmtime(tp)?(*(tmp)=*gmtime(tp),(tmp)):memset(tmp, 0, sizeof(*tmp)))
+ #endif
+
+ #ifdef HAVE_PTHREAD
+@@ -205,11 +205,7 @@ icaltime_from_timet_with_zone(const time
+
+ /* Convert the time_t to a struct tm in UTC time. We can trust gmtime
+ for this. */
+-#ifdef HAVE_PTHREAD
+ gmtime_r (&tm, &t);
+-#else
+- t = *(gmtime (&tm));
+-#endif
+
+ tt.year = t.tm_year + 1900;
+ tt.month = t.tm_mon + 1;
+diff -upr -x .deps -x .libs -x '*.la' libical-1.0.old/src/libical/icaltimezone.c libical-1.0/src/libical/icaltimezone.c
+--- libical-1.0.old/src/libical/icaltimezone.c 2013-04-14 17:24:42 +0000
++++ libical-1.0/src/libical/icaltimezone.c 2014-08-03 13:59:38 +0000
+@@ -61,12 +61,19 @@ static pthread_mutex_t builtin_mutex = P
+ #undef gmtime_r
+
+ /* The gmtime() in Microsoft's C library is MT-safe */
+-#define gmtime_r(tp,tmp) (gmtime(tp)?(*(tmp)=*gmtime(tp),(tmp)):0)
++#define gmtime_r(tp,tmp) (gmtime(tp)?(*(tmp)=*gmtime(tp),(tmp)):memset(tmp, 0, sizeof(*tmp)))
+
+ // MSVC lacks the POSIX macro S_ISDIR, however it's a trivial one:
+ #ifndef S_ISDIR
+ #define S_ISDIR(m) (((m) & _S_IFMT) == _S_IFDIR)
+ #endif
++
++#define DIR_SEPARATOR "\\"
++
++#else
++
++#define DIR_SEPARATOR "/"
++
+ #endif
+
+ #if defined(_MSC_VER)
+@@ -75,7 +82,7 @@ static pthread_mutex_t builtin_mutex = P
+ #endif
+
+ /** This is the toplevel directory where the timezone data is installed in. */
+-#define ZONEINFO_DIRECTORY PACKAGE_DATA_DIR "/zoneinfo"
++#define ZONEINFO_DIRECTORY PACKAGE_DATA_DIR DIR_SEPARATOR "zoneinfo"
+
+ /** The prefix we use to uniquely identify TZIDs.
+ It must begin and end with forward slashes.
+@@ -1702,10 +1709,10 @@ icaltimezone_parse_zone_tab (void)
+ return;
+ }
+ #ifndef USE_BUILTIN_TZDATA
+- snprintf (filename, filename_len, "%s/%s", icaltzutil_get_zone_directory (),
++ snprintf (filename, filename_len, "%s" DIR_SEPARATOR "%s", icaltzutil_get_zone_directory (),
+ ZONES_TAB_SYSTEM_FILENAME);
+ #else
+- snprintf (filename, filename_len, "%s/%s", get_zone_directory(),
++ snprintf (filename, filename_len, "%s" DIR_SEPARATOR "%s", get_zone_directory(),
+ ZONES_TAB_FILENAME);
+ #endif
+
+@@ -1823,7 +1830,7 @@ icaltimezone_load_builtin_timezone (ical
+ goto out;
+ }
+
+- snprintf (filename, filename_len, "%s/%s.ics", get_zone_directory(),
++ snprintf (filename, filename_len, "%s " DIR_SEPARATOR " %s.ics", get_zone_directory(),
+ zone->location);
+
+ fp = fopen (filename, "r");
+diff -upr -x .deps -x .libs -x '*.la' libical-1.0.old/src/libical/icaltz-util.c libical-1.0/src/libical/icaltz-util.c
+--- libical-1.0.old/src/libical/icaltz-util.c 2013-04-14 17:24:42 +0000
++++ libical-1.0/src/libical/icaltz-util.c 2014-08-03 12:54:17 +0000
+@@ -50,7 +50,7 @@
+ # endif
+ #endif
+
+-#ifdef _MSC_VER
++#ifdef WIN32
+ #if !defined(HAVE_BYTESWAP_H) && !defined(HAVE_SYS_ENDIAN_H) && !defined(HAVE_ENDIAN_H)
+ #define bswap_16(x) (((x) << 8) & 0xff00) | (((x) >> 8 ) & 0xff)
+ #define bswap_32(x) (((x) << 24) & 0xff000000) \
+@@ -67,6 +67,11 @@
+ | (((x) & 0x00000000000000ffull) << 56))
+ #endif
+ #include <io.h>
++#include <sys/param.h> /* for BYTE_ORDER */
++#endif
++
++#ifdef WIN32
++#include <windows.h>
+ #endif
+
+ #if defined(__APPLE__)
+@@ -191,6 +196,7 @@ zname_from_stridx (char *str, long int i
+ static void
+ set_zonedir (void)
+ {
++ #ifndef WIN32
+ char file_path[PATH_MAX];
+ const char *fname = ZONES_TAB_SYSTEM_FILENAME;
+ int i;
+@@ -202,6 +208,42 @@ set_zonedir (void)
+ break;
+ }
+ }
++
++ #else
++ #define ZONEINFO_REL_PATH "..\\share\\zoneinfo"
++ if (!zdir) {
++ HMODULE lib = LoadLibrary("libical.dll");
++ if (lib) {
++ static char win32_path[PATH_MAX * 2 + 32 + 1];
++ DWORD read = GetModuleFileNameA (lib, win32_path, PATH_MAX * 2);
++ FreeLibrary(lib);
++
++ if (read > 0) {
++ char *backslash;
++ int cut_path_at;
++
++ win32_path[read] = 0;
++
++ backslash = strrchr(win32_path, '\\');
++ if (backslash)
++ backslash[1] = 0;
++
++ strcat (win32_path, ZONEINFO_REL_PATH);
++ cut_path_at = strlen (win32_path);
++ strcat (win32_path, "\\");
++ strcat (win32_path, ZONES_TAB_SYSTEM_FILENAME);
++
++ if (!access (win32_path, F_OK|R_OK)) {
++ win32_path[cut_path_at] = 0;
++ zdir = win32_path;
++ } else {
++ fprintf (stderr, "libical: Failed to find '%s'\n", win32_path);
++ }
++ }
++ }
++ }
++ #undef ZONEINFO_REL_PATH
++ #endif
+ }
+
+
+@@ -256,6 +298,14 @@ icaltzutil_fetch_timezone (const char *l
+
+ full_path = (char *) malloc (strlen (basedir) + strlen (location) + 2);
+ sprintf (full_path,"%s/%s",basedir, location);
++ #ifdef WIN32
++ pos = strlen(basedir);
++ while(full_path[pos]) {
++ if (full_path[pos] == '/')
++ full_path[pos] = '\\';
++ pos++;
++ }
++ #endif
+
+ if ((f = fopen (full_path, "rb")) == 0) {
+ icalerror_set_errno (ICAL_FILE_ERROR);