mirror of
https://github.com/digarok/gsplus.git
synced 2024-11-24 06:34:02 +00:00
bug fixes and more cleanup
This commit is contained in:
parent
192cfc724b
commit
7b66b3a070
@ -8,7 +8,7 @@ OBJECTS1 = adb.o clock.o config.o debug.o dis.o engine_c.o scc.o iwm.o \
|
||||
ATOBJ = atbridge/aarp.o atbridge/atbridge.o atbridge/elap.o atbridge/llap.o atbridge/port.o
|
||||
PCAPOBJ = atbridge/pcap_delay.o
|
||||
TFEOBJ = tfe/tfe.o tfe/tfearch.o tfe/tfesupp.o
|
||||
FSTOBJ = host_common.o host_fst.o host_mli.o
|
||||
FSTOBJ = unix_host_common.o host_common.o host_fst.o host_mli.o
|
||||
|
||||
include vars
|
||||
|
||||
|
265
src/host_mli.c
265
src/host_mli.c
@ -109,6 +109,121 @@ struct file_entry {
|
||||
struct file_entry files[MAX_FILES];
|
||||
|
||||
|
||||
|
||||
|
||||
#if _WIN32
|
||||
static word16 file_open(const char *path, struct file_entry *file) {
|
||||
|
||||
HANDLE h;
|
||||
|
||||
if (g_cfg_host_read_only) {
|
||||
h = CreateFile(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
} else {
|
||||
h = CreateFile(path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
if (h == INVALID_HANDLE_VALUE) {
|
||||
h = CreateFile(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
if (h == INVALID_HANDLE_VALUE) return host_map_win32_error(GetLastError());
|
||||
|
||||
file->h = h;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static word16 file_close(struct file_entry *file) {
|
||||
|
||||
if (!file->type) return invalidRefNum;
|
||||
|
||||
if (file->h != INVALID_HANDLE_VALUE) CloseHandle(file->h);
|
||||
|
||||
if (file->directory_buffer) free(file->directory_buffer);
|
||||
memset(file, 0, sizeof(*file));
|
||||
file->h = INVALID_HANDLE_VALUE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static word16 file_flush(struct file_entry *file) {
|
||||
if (!file->type) return invalidRefNum;
|
||||
|
||||
if (file->h != INVALID_HANDLE_VALUE)
|
||||
FlushFileBuffers(file->h);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static word16 file_eof(struct file_entry *file) {
|
||||
LARGE_INTEGER li;
|
||||
if (!GetFileSizeEx(file->h, &li))
|
||||
return host_map_win32_error(GetLastError());
|
||||
if (li.QuadPart > 0xffffff) {
|
||||
file->eof = 0xffffff;
|
||||
return outOfRange;
|
||||
}
|
||||
file->eof = li.QuadPart;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#else
|
||||
|
||||
static word16 file_open(const char *path, struct file_entry *file) {
|
||||
|
||||
int fd;
|
||||
|
||||
if (g_cfg_host_read_only) {
|
||||
fd = open(path, O_RDONLY | O_NONBLOCK);
|
||||
} else {
|
||||
fd = open(path, O_RDWR | O_NONBLOCK);
|
||||
if (fd < 0) {
|
||||
fd = open(path, O_RDONLY | O_NONBLOCK);
|
||||
}
|
||||
}
|
||||
if (fd < 0) return host_map_errno_path(errno, path);
|
||||
|
||||
file->fd = fd;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static word16 file_close(struct file_entry *file) {
|
||||
|
||||
if (!file->type) return invalidRefNum;
|
||||
|
||||
if (file->fd >= 0) close(file->fd);
|
||||
|
||||
if (file->directory_buffer) free(file->directory_buffer);
|
||||
memset(file, 0, sizeof(*file));
|
||||
file->fd = -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static word16 file_flush(struct file_entry *file) {
|
||||
if (!file->type) return invalidRefNum;
|
||||
|
||||
if (file->fd >= 0)
|
||||
fsync(file->fd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static word16 file_eof(struct file_entry *file) {
|
||||
off_t eof;
|
||||
eof = lseek(file->fd, 0, SEEK_END);
|
||||
if (eof < 0) return host_map_errno(errno);
|
||||
if (eof > 0xffffff) {
|
||||
file->eof = 0xffffff;
|
||||
return outOfRange;
|
||||
}
|
||||
file->eof = eof;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
static char *get_pstr(word32 ptr) {
|
||||
if (!ptr) return NULL;
|
||||
int length = get_memory_c(ptr, 0);
|
||||
@ -737,33 +852,22 @@ static int mli_set_buf(unsigned dcb, struct file_entry *file) {
|
||||
|
||||
static int mli_get_eof(unsigned dcb, struct file_entry *file) {
|
||||
|
||||
off_t eof = 0;
|
||||
#if _WIN32
|
||||
LARGE_INTEGER tmp;
|
||||
#endif
|
||||
|
||||
word16 terr = 0;
|
||||
|
||||
switch (file->type) {
|
||||
default:
|
||||
return invalidRefNum;
|
||||
|
||||
case file_directory:
|
||||
eof = file->eof;
|
||||
break;
|
||||
|
||||
case file_regular:
|
||||
#if _WIN32
|
||||
if (!GetFileSizeEx(file->h, &tmp))
|
||||
return host_map_win32_error(GetLastError());
|
||||
eof = tmp.QuadPart;
|
||||
#else
|
||||
eof = lseek(file->fd, SEEK_END, 0);
|
||||
if (eof < 0) return host_map_errno(errno);
|
||||
#endif
|
||||
terr = file_eof(file);
|
||||
if (terr) return terr;
|
||||
break;
|
||||
}
|
||||
if (eof > 0xffffff) return outOfRange;
|
||||
set_memory24_c(dcb + 2, eof, 0);
|
||||
}
|
||||
|
||||
set_memory24_c(dcb + 2, file->eof, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -821,10 +925,7 @@ static int mli_get_mark(unsigned dcb, struct file_entry *file) {
|
||||
static int mli_set_mark(unsigned dcb, struct file_entry *file) {
|
||||
|
||||
off_t eof = 0;
|
||||
|
||||
#if _WIN32
|
||||
LARGE_INTEGER tmp;
|
||||
#endif
|
||||
word16 terr = 0;
|
||||
|
||||
word32 position = get_memory24_c(dcb + 2, 0);
|
||||
|
||||
@ -835,18 +936,12 @@ static int mli_set_mark(unsigned dcb, struct file_entry *file) {
|
||||
eof = file->eof;
|
||||
break;
|
||||
case file_regular:
|
||||
#if _WIN32
|
||||
if (!GetFileSizeEx(file->h, &tmp))
|
||||
return host_map_win32_error(GetLastError());
|
||||
eof = tmp.QuadPart;
|
||||
#else
|
||||
eof = lseek(file->fd, SEEK_END, 0);
|
||||
if (eof < 0) return host_map_errno(errno);
|
||||
#endif
|
||||
terr = file_eof(file);
|
||||
if (terr) return terr;
|
||||
break;
|
||||
}
|
||||
|
||||
if (position > eof) return outOfRange;
|
||||
if (position > file->eof) return outOfRange;
|
||||
file->mark = position;
|
||||
|
||||
return 0;
|
||||
@ -860,53 +955,7 @@ static int mli_newline(unsigned dcb, struct file_entry *file) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
static word16 file_close(struct file_entry *file) {
|
||||
|
||||
if (!file->type) return invalidRefNum;
|
||||
|
||||
if (file->h != INVALID_HANDLE_VALUE) CloseHandle(file->h);
|
||||
|
||||
if (file->directory_buffer) free(file->directory_buffer);
|
||||
memset(file, 0, sizeof(*file));
|
||||
file->h = INVALID_HANDLE_VALUE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static word16 file_flush(struct file_entry *file) {
|
||||
if (!file->type) return invalidRefNum;
|
||||
|
||||
if (file->h != INVALID_HANDLE_VALUE)
|
||||
FlushFileBuffers(file->h);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
static word16 file_close(struct file_entry *file) {
|
||||
|
||||
if (!file->type) return invalidRefNum;
|
||||
|
||||
if (file->fd >= 0) close(file->fd);
|
||||
|
||||
if (file->directory_buffer) free(file->directory_buffer);
|
||||
memset(file, 0, sizeof(*file));
|
||||
file->fd = -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static word16 file_flush(struct file_entry *file) {
|
||||
if (!file->type) return invalidRefNum;
|
||||
|
||||
if (file->fd >= 0)
|
||||
fsync(file->fd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
static int mli_close(unsigned dcb, struct file_entry *file) {
|
||||
|
||||
@ -977,46 +1026,6 @@ static int mli_quit(unsigned dcb) {
|
||||
}
|
||||
|
||||
|
||||
#if _WIN32
|
||||
static word16 file_open(const char *path, struct file_entry *file) {
|
||||
|
||||
HANDLE h;
|
||||
|
||||
if (g_cfg_host_read_only) {
|
||||
h = CreateFile(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
} else {
|
||||
h = CreateFile(path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
if (h == INVALID_HANDLE_VALUE) {
|
||||
h = CreateFile(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
if (h == INVALID_HANDLE_VALUE) return host_map_win32_error(GetLastError());
|
||||
|
||||
file->h = h;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static word16 file_open(const char *path, struct file_entry *file) {
|
||||
|
||||
int fd;
|
||||
|
||||
if (g_cfg_host_read_only) {
|
||||
fd = open(path, O_RDONLY | O_NONBLOCK);
|
||||
} else {
|
||||
fd = open(path, O_RDWR | O_NONBLOCK);
|
||||
if (fd < 0) {
|
||||
fd = open(path, O_RDONLY | O_NONBLOCK);
|
||||
}
|
||||
}
|
||||
if (fd < 0) return host_map_errno_path(errno, path);
|
||||
|
||||
file->fd = fd;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
static int mli_open(unsigned dcb, const char *name, const char *path) {
|
||||
@ -1238,6 +1247,30 @@ static const char *call_name(unsigned call) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#ifdef __CYGWIN__
|
||||
|
||||
#include <sys/cygwin.h>
|
||||
|
||||
static char *expand_path(const char *path, word32 *error) {
|
||||
|
||||
char buffer[PATH_MAX];
|
||||
if (!path) return path;
|
||||
|
||||
ssize_t ok = cygwin_conv_path(CCP_POSIX_TO_WIN_A, path, buffer, sizeof(buffer));
|
||||
if (ok < 0) {
|
||||
*error = fstError;
|
||||
return NULL;
|
||||
}
|
||||
return host_gc_strdup(buffer);
|
||||
}
|
||||
|
||||
|
||||
#else
|
||||
#define expand_path(x, y) (x)
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* mli head patch. called before ProDOS mli.
|
||||
* this call will either
|
||||
|
@ -449,7 +449,7 @@ unsigned host_scan_directory(const char *path, char ***out, size_t *entries, uns
|
||||
|
||||
for(;;) {
|
||||
struct dirent *d = readdir(dp);
|
||||
if (!dp) break;
|
||||
if (!d) break;
|
||||
|
||||
const char *name = d->d_name;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user