瀏覽代碼

Add some replacement functions for WinCE

Merge code from SpaceLord (part 1/?)
bel 9 年之前
父節點
當前提交
3d93a5fad2
共有 2 個文件被更改,包括 70 次插入6 次删除
  1. 2 1
      CREDITS.md
  2. 68 5
      src/civetweb.c

+ 2 - 1
CREDITS.md

@@ -68,8 +68,9 @@
 * Richard Screene
 * Sage Weil
 * Sangwhan Moon
-* shantanugadgil
 * Scott Nations
+* shantanugadgil
+* SpaceLord
 * sunfch
 * thewaterymoon
 * Thomas Davis

+ 68 - 5
src/civetweb.c

@@ -373,7 +373,9 @@ typedef unsigned short uint16_t;
 typedef unsigned int uint32_t;
 typedef unsigned __int64 uint64_t;
 typedef __int64 int64_t;
+#ifndef INT64_MAX
 #define INT64_MAX (9223372036854775807)
+#endif
 #endif /* HAVE_STDINT */
 
 /* POSIX dirent interface */
@@ -599,7 +601,7 @@ time(time_t *ptime)
 
 
 static struct tm *
-localtime(const time_t *ptime, struct tm *ptm)
+localtime_s(const time_t *ptime, struct tm *ptm)
 {
 	int64_t t = ((int64_t)*ptime) * RATE_DIFF + EPOCH_DIFF;
 	FILETIME ft, lft;
@@ -629,27 +631,88 @@ localtime(const time_t *ptime, struct tm *ptm)
 
 
 static struct tm *
-gmtime(const time_t *ptime, struct tm *ptm)
+gmtime_s(const time_t *ptime, struct tm *ptm)
 {
 	/* FIXME(lsm): fix this. */
-	return localtime(ptime, ptm);
+	return localtime_s(ptime, ptm);
+}
+
+
+static struct tm tm_array[MAX_WORKER_THREADS];
+static int tm_index = 0;
+
+static struct tm *
+localtime(const time_t *ptime)
+{
+	int i = mg_atomic_inc(&tm_index) % (sizeof(tm_array) / sizeof(tm_array[0]));
+	return localtime_s(ptime, tls_tm + i);
+}
+
+
+static struct tm *
+gmtime(const time_t *ptime)
+{
+	int i = mg_atomic_inc(&tm_index) % ARRAY_SIZE(tm_array);
+	return gmtime_s(ptime, tls_tm + i);
 }
 
 
 static size_t
 strftime(char *dst, size_t dst_size, const char *fmt, const struct tm *tm)
 {
-	(void)mg_snprintf(NULL, dst, dst_size, "implement strftime() for WinCE");
+	/* TODO */ //(void)mg_snprintf(NULL, dst, dst_size, "implement strftime()
+	// for WinCE");
 	return 0;
 }
 
+#define _beginthreadex(psec, stack, func, prm, flags, ptid)                    \
+	(uintptr_t) CreateThread(psec, stack, func, prm, flags, ptid)
+
+#define remove(f) mg_remove(NULL, f)
+
+static int
+rename(const char *a, const char *b)
+{
+	wchar_t wa[PATH_MAX];
+	wchar_t wb[PATH_MAX];
+	path_to_unicode(conn, path, wa, ARRAY_SIZE(wa));
+	path_to_unicode(conn, path, wb, ARRAY_SIZE(wb));
+
+	return MoveFileW(wa, wb) ? 0 : -1;
+}
+
+struct stat {
+	int64_t st_size;
+};
+
+static int
+stat(const char *name, struct stat *st)
+{
+	wchar_t wbuf[PATH_MAX];
+	WIN32_FILE_ATTRIBUTE_DATA attr;
+	path_to_unicode(conn, path, wbuf, ARRAY_SIZE(wbuf));
+	memset(&attr, 0, sizeof(attr));
+
+	GetFileAttributesExW(wbuf, GetFileExInfoStandard, &attr);
+	st->st_size = ((int64_t)attr.nFileSizeHigh)
+	              << 32 + (int64_t)attr.nFileSizeLow;
+	/* TODO ... */
+}
+
+#define access(x, a) 1 /* not required anyway */
+
+/* WinCE-TODO: define stat, remove, rename, _rmdir, _lseeki64 */
+#define EEXIST 1 /* TODO: See Windows error codes */
+#define EACCES 2 /* TODO: See Windows error codes */
+#define ENOENT 3 /* TODO: See Windows Error codes */
 
 #if defined(__MINGW32__)
 /* Enable unused function warning again */
 #pragma GCC diagnostic pop
 #endif
 
-#endif
+#endif /* defined(_WIN32_WCE) */
+
 static void DEBUG_TRACE_FUNC(const char *func,
                              unsigned line,
                              PRINTF_FORMAT_STRING(const char *fmt),