| ... | ... |
@@ -70,6 +70,7 @@ CC="${CC:-cc}"
|
| 70 | 70 |
CFLAGS="${CFLAGS:--std=c89 -Wall -Wno-unknown-pragmas}"
|
| 71 | 71 |
case "$(uname -s 2>/dev/null)" in |
| 72 | 72 |
MSYS_NT*|MINGW*) # MSYS2 on Windows |
| 73 |
+ FILE_LDFLAGS="-liberty" |
|
| 73 | 74 |
if [ $console = 1 ]; |
| 74 | 75 |
then |
| 75 | 76 |
UXNEMU_LDFLAGS="-static $(sdl2-config --cflags --static-libs | sed -e 's/ -mwindows//g')" |
| ... | ... |
@@ -98,8 +99,8 @@ fi |
| 98 | 99 |
|
| 99 | 100 |
echo "Building.." |
| 100 | 101 |
${CC} ${CFLAGS} src/uxnasm.c -o bin/uxnasm
|
| 101 |
-${CC} ${CFLAGS} ${CORE} src/devices/system.c src/devices/file.c src/devices/datetime.c src/devices/mouse.c src/devices/controller.c src/devices/screen.c src/devices/audio.c src/uxnemu.c ${UXNEMU_LDFLAGS} -o bin/uxnemu
|
|
| 102 |
-${CC} ${CFLAGS} ${CORE} src/devices/system.c src/devices/file.c src/devices/datetime.c src/uxncli.c -o bin/uxncli
|
|
| 102 |
+${CC} ${CFLAGS} ${CORE} src/devices/system.c src/devices/file.c src/devices/datetime.c src/devices/mouse.c src/devices/controller.c src/devices/screen.c src/devices/audio.c src/uxnemu.c ${UXNEMU_LDFLAGS} ${FILE_LDFLAGS} -o bin/uxnemu
|
|
| 103 |
+${CC} ${CFLAGS} ${CORE} src/devices/system.c src/devices/file.c src/devices/datetime.c src/uxncli.c ${FILE_LDFLAGS} -o bin/uxncli
|
|
| 103 | 104 |
|
| 104 | 105 |
if [ $install = 1 ] |
| 105 | 106 |
then |
| ... | ... |
@@ -8,6 +8,11 @@ |
| 8 | 8 |
#include <sys/stat.h> |
| 9 | 9 |
#include <unistd.h> |
| 10 | 10 |
|
| 11 |
+#ifdef _WIN32 |
|
| 12 |
+#include <libiberty/libiberty.h> |
|
| 13 |
+#define realpath(s, dummy) lrealpath(s) |
|
| 14 |
+#endif |
|
| 15 |
+ |
|
| 11 | 16 |
#ifndef PATH_MAX |
| 12 | 17 |
#define PATH_MAX 4096 |
| 13 | 18 |
#endif |
| ... | ... |
@@ -84,14 +89,17 @@ file_read_dir(UxnFile *c, char *dest, Uint16 len) |
| 84 | 89 |
continue; |
| 85 | 90 |
if(strcmp(c->de->d_name, "..") == 0) {
|
| 86 | 91 |
/* hide "sandbox/.." */ |
| 87 |
- char cwd[PATH_MAX] = {'\0'}, t[PATH_MAX] = {'\0'};
|
|
| 92 |
+ char cwd[PATH_MAX] = {'\0'}, *t;
|
|
| 88 | 93 |
/* Note there's [currently] no way of chdir()ing from uxn, so $PWD |
| 89 | 94 |
* is always the sandbox top level. */ |
| 90 | 95 |
getcwd(cwd, sizeof(cwd)); |
| 91 | 96 |
/* We already checked that c->current_filename exists so don't need a wrapper. */ |
| 92 |
- realpath(c->current_filename, t); |
|
| 93 |
- if(strcmp(cwd, t) == 0) |
|
| 97 |
+ t = realpath(c->current_filename, NULL); |
|
| 98 |
+ if(strcmp(cwd, t) == 0) {
|
|
| 99 |
+ free(t); |
|
| 94 | 100 |
continue; |
| 101 |
+ } |
|
| 102 |
+ free(t); |
|
| 95 | 103 |
} |
| 96 | 104 |
if(strlen(c->current_filename) + 1 + strlen(c->de->d_name) < sizeof(pathname)) |
| 97 | 105 |
sprintf(pathname, "%s/%s", c->current_filename, c->de->d_name); |
| ... | ... |
@@ -108,7 +116,7 @@ file_read_dir(UxnFile *c, char *dest, Uint16 len) |
| 108 | 116 |
static char * |
| 109 | 117 |
retry_realpath(const char *file_name) |
| 110 | 118 |
{
|
| 111 |
- char r[PATH_MAX] = {'\0'}, p[PATH_MAX] = {'\0'}, *x;
|
|
| 119 |
+ char *r, p[PATH_MAX] = {'\0'}, *x;
|
|
| 112 | 120 |
if(file_name == NULL) {
|
| 113 | 121 |
errno = EINVAL; |
| 114 | 122 |
return NULL; |
| ... | ... |
@@ -123,7 +131,7 @@ retry_realpath(const char *file_name) |
| 123 | 131 |
strcat(p, "/"); /* TODO: use a macro instead of '/' for the path delimiter */ |
| 124 | 132 |
} |
| 125 | 133 |
strcat(p, file_name); |
| 126 |
- while(realpath(p, r) == NULL) {
|
|
| 134 |
+ while((r = realpath(p, NULL)) == NULL) {
|
|
| 127 | 135 |
if(errno != ENOENT) |
| 128 | 136 |
return NULL; |
| 129 | 137 |
x = strrchr(p, '/'); /* TODO: path delimiter macro */ |
| ... | ... |
@@ -134,6 +142,7 @@ retry_realpath(const char *file_name) |
| 134 | 142 |
} |
| 135 | 143 |
x = malloc(strlen(r) + 1); |
| 136 | 144 |
strcpy(x, r); |
| 145 |
+ free(r); |
|
| 137 | 146 |
return x; |
| 138 | 147 |
} |
| 139 | 148 |
|