| ... | ... |
@@ -11,6 +11,15 @@ |
| 11 | 11 |
#ifdef _WIN32 |
| 12 | 12 |
#include <libiberty/libiberty.h> |
| 13 | 13 |
#define realpath(s, dummy) lrealpath(s) |
| 14 |
+#define DIR_SEP_CHAR '\\' |
|
| 15 |
+#define DIR_SEP_STR "\\" |
|
| 16 |
+#define pathcmp(path1,path2,length) strncasecmp(path1,path2,length) /* strncasecmp provided by libiberty */ |
|
| 17 |
+#define notdriveroot(file_name) (file_name[0] != DIR_SEP_CHAR && ((strlen(file_name)>2 && file_name[1] != ':') || strlen(file_name)<=2)) |
|
| 18 |
+#else |
|
| 19 |
+#define DIR_SEP_CHAR '/' |
|
| 20 |
+#define DIR_SEP_STR "/" |
|
| 21 |
+#define pathcmp(path1,path2,length) strncmp(path1,path2,length) |
|
| 22 |
+#define notdriveroot(file_name) (file_name[0] != DIR_SEP_CHAR) |
|
| 14 | 23 |
#endif |
| 15 | 24 |
|
| 16 | 25 |
#ifndef PATH_MAX |
| ... | ... |
@@ -124,17 +133,17 @@ retry_realpath(const char *file_name) |
| 124 | 133 |
errno = ENAMETOOLONG; |
| 125 | 134 |
return NULL; |
| 126 | 135 |
} |
| 127 |
- if(file_name[0] != '/') {
|
|
| 136 |
+ if(notdriveroot(file_name)) {
|
|
| 128 | 137 |
/* TODO: use a macro instead of '/' for absolute path first character so that other systems can work */ |
| 129 | 138 |
/* if a relative path, prepend cwd */ |
| 130 | 139 |
getcwd(p, sizeof(p)); |
| 131 |
- strcat(p, "/"); /* TODO: use a macro instead of '/' for the path delimiter */ |
|
| 140 |
+ strcat(p, DIR_SEP_STR); /* TODO: use a macro instead of '/' for the path delimiter */ |
|
| 132 | 141 |
} |
| 133 | 142 |
strcat(p, file_name); |
| 134 | 143 |
while((r = realpath(p, NULL)) == NULL) {
|
| 135 | 144 |
if(errno != ENOENT) |
| 136 | 145 |
return NULL; |
| 137 |
- x = strrchr(p, '/'); /* TODO: path delimiter macro */ |
|
| 146 |
+ x = strrchr(p, DIR_SEP_CHAR); /* TODO: path delimiter macro */ |
|
| 138 | 147 |
if(x) |
| 139 | 148 |
*x = '\0'; |
| 140 | 149 |
else |
| ... | ... |
@@ -149,7 +158,7 @@ file_check_sandbox(UxnFile *c) |
| 149 | 158 |
char *x, *rp, cwd[PATH_MAX] = {'\0'};
|
| 150 | 159 |
x = getcwd(cwd, sizeof(cwd)); |
| 151 | 160 |
rp = retry_realpath(c->current_filename); |
| 152 |
- if(rp == NULL || (x && strncmp(cwd, rp, strlen(cwd)) != 0)) {
|
|
| 161 |
+ if(rp == NULL || (x && pathcmp(cwd, rp, strlen(cwd)) != 0)) {
|
|
| 153 | 162 |
c->outside_sandbox = 1; |
| 154 | 163 |
fprintf(stderr, "file warning: blocked attempt to access %s outside of sandbox\n", c->current_filename); |
| 155 | 164 |
} |
| ... | ... |
@@ -213,7 +222,7 @@ file_write(UxnFile *c, void *src, Uint16 len, Uint8 flags) |
| 213 | 222 |
static Uint16 |
| 214 | 223 |
file_stat(UxnFile *c, void *dest, Uint16 len) |
| 215 | 224 |
{
|
| 216 |
- char *basename = strrchr(c->current_filename, '/'); |
|
| 225 |
+ char *basename = strrchr(c->current_filename, DIR_SEP_CHAR); |
|
| 217 | 226 |
if(c->outside_sandbox) return 0; |
| 218 | 227 |
if(basename != NULL) |
| 219 | 228 |
basename++; |
| ... | ... |
@@ -16,8 +16,11 @@ |
| 16 | 16 |
#include "devices/controller.h" |
| 17 | 17 |
#include "devices/mouse.h" |
| 18 | 18 |
#include "devices/datetime.h" |
| 19 |
-#ifdef _WIN32 |
|
| 19 |
+#if defined(_WIN32) && defined(_WIN32_WINNT) && _WIN32_WINNT > 0x0602 |
|
| 20 | 20 |
#include <processthreadsapi.h> |
| 21 |
+#elif defined(_WIN32) |
|
| 22 |
+#include <windows.h> |
|
| 23 |
+#include <string.h> |
|
| 21 | 24 |
#endif |
| 22 | 25 |
#pragma GCC diagnostic pop |
| 23 | 26 |
#pragma clang diagnostic pop |