gdb hio: lseek returns off_t, fix other bugs & style fixes

Newest Luma commit needed
This commit is contained in:
TuxSH 2019-05-04 17:13:42 +02:00
parent f5bd002984
commit d6f173251c
2 changed files with 49 additions and 46 deletions

View File

@ -17,7 +17,7 @@ int gdbHioOpen(const char *pathname, int flags, mode_t mode);
int gdbHioClose(int fd); int gdbHioClose(int fd);
int gdbHioRead(int fd, void *buf, unsigned int count); int gdbHioRead(int fd, void *buf, unsigned int count);
int gdbHioWrite(int fd, const void *buf, unsigned int count); int gdbHioWrite(int fd, const void *buf, unsigned int count);
int gdbHioLseek(int fd, off_t offset, int flag); off_t gdbHioLseek(int fd, off_t offset, int flag);
int gdbHioRename(const char *oldpath, const char *newpath); int gdbHioRename(const char *oldpath, const char *newpath);
int gdbHioUnlink(const char *pathname); int gdbHioUnlink(const char *pathname);
int gdbHioStat(const char *pathname, struct stat *st); int gdbHioStat(const char *pathname, struct stat *st);

View File

@ -12,14 +12,15 @@
#define GDBHIO_O_RDONLY 0x0 #define GDBHIO_O_RDONLY 0x0
#define GDBHIO_O_WRONLY 0x1 #define GDBHIO_O_WRONLY 0x1
#define GDBHIO_O_RDWR 0x2 #define GDBHIO_O_RDWR 0x2
#define GDBHIO_O_ACCMODE 0x3
#define GDBHIO_O_APPEND 0x8 #define GDBHIO_O_APPEND 0x8
#define GDBHIO_O_CREAT 0x200 #define GDBHIO_O_CREAT 0x200
#define GDBHIO_O_TRUNC 0x400 #define GDBHIO_O_TRUNC 0x400
#define GDBHIO_O_EXCL 0x800 #define GDBHIO_O_EXCL 0x800
#define GDBHIO_O_SUPPORTED (GDBHIO_O_RDONLY | GDBHIO_O_WRONLY| \ #define GDBHIO_O_SUPPORTED (GDBHIO_O_RDONLY | GDBHIO_O_WRONLY| \
GDBHIO_O_RDWR | GDBHIO_O_APPEND| \ GDBHIO_O_RDWR | GDBHIO_O_APPEND| \
GDBHIO_O_CREAT | GDBHIO_O_TRUNC| \ GDBHIO_O_CREAT | GDBHIO_O_TRUNC| \
GDBHIO_O_EXCL) GDBHIO_O_EXCL)
#define GDBHIO_S_IFREG 0100000 #define GDBHIO_S_IFREG 0100000
#define GDBHIO_S_IFDIR 040000 #define GDBHIO_S_IFDIR 040000
@ -27,15 +28,15 @@
#define GDBHIO_S_IRUSR 0400 #define GDBHIO_S_IRUSR 0400
#define GDBHIO_S_IWUSR 0200 #define GDBHIO_S_IWUSR 0200
#define GDBHIO_S_IXUSR 0100 #define GDBHIO_S_IXUSR 0100
#define GDBHIO_S_IRWXU 0700 #define GDBHIO_S_IRWXU (GDBHIO_S_IRUSR | GDBHIO_S_IWUSR | GDBHIO_S_IXUSR)
#define GDBHIO_S_IRGRP 040 #define GDBHIO_S_IRGRP 040
#define GDBHIO_S_IWGRP 020 #define GDBHIO_S_IWGRP 020
#define GDBHIO_S_IXGRP 010 #define GDBHIO_S_IXGRP 010
#define GDBHIO_S_IRWXG 070 #define GDBHIO_S_IRWXG (GDBHIO_S_IRGRP | GDBHIO_S_IWGRP | GDBHIO_S_IXGRP)
#define GDBHIO_S_IROTH 04 #define GDBHIO_S_IROTH 04
#define GDBHIO_S_IWOTH 02 #define GDBHIO_S_IWOTH 02
#define GDBHIO_S_IXOTH 01 #define GDBHIO_S_IXOTH 01
#define GDBHIO_S_IRWXO 07 #define GDBHIO_S_IRWXO (GDBHIO_S_IROTH | GDBHIO_S_IWOTH | GDBHIO_S_IXOTH)
#define GDBHIO_S_SUPPORTED (GDBHIO_S_IFREG|GDBHIO_S_IFDIR| \ #define GDBHIO_S_SUPPORTED (GDBHIO_S_IFREG|GDBHIO_S_IFDIR| \
GDBHIO_S_IRWXU|GDBHIO_S_IRWXG| \ GDBHIO_S_IRWXU|GDBHIO_S_IRWXG| \
GDBHIO_S_IRWXO) GDBHIO_S_IRWXO)
@ -80,7 +81,7 @@ typedef struct PackedGdbHioRequest
size_t stringLengths[8]; size_t stringLengths[8];
// Return // Return
int retval; s64 retval;
int gdbErrno; int gdbErrno;
bool ctrlC; bool ctrlC;
} PackedGdbHioRequest; } PackedGdbHioRequest;
@ -127,16 +128,27 @@ static int _gdbHioExportOpenFlags(int flags)
if (flags & O_EXCL) outflags |= GDBHIO_O_EXCL; if (flags & O_EXCL) outflags |= GDBHIO_O_EXCL;
if (flags & O_TRUNC) outflags |= GDBHIO_O_TRUNC; if (flags & O_TRUNC) outflags |= GDBHIO_O_TRUNC;
if (flags & O_APPEND) outflags |= GDBHIO_O_APPEND; if (flags & O_APPEND) outflags |= GDBHIO_O_APPEND;
if (flags & O_RDONLY) outflags |= GDBHIO_O_RDONLY;
if (flags & O_WRONLY) outflags |= GDBHIO_O_WRONLY; switch (flags & O_ACCMODE) {
if (flags & O_RDWR) outflags |= GDBHIO_O_RDWR; case O_RDONLY:
outflags |= GDBHIO_O_RDONLY;
break;
case O_WRONLY:
outflags |= GDBHIO_O_WRONLY;
break;
case O_RDWR:
outflags |= GDBHIO_O_RDWR;
break;
default:
break;
}
// Note: O_BINARY is implicit if the host supports it // Note: O_BINARY is implicit if the host supports it
return outflags; return outflags;
} }
typedef int gdbhio_mode_t; typedef s32 gdbhio_mode_t;
static mode_t _gdbHioImportFileMode(gdbhio_mode_t gdbMode) static mode_t _gdbHioImportFileMode(gdbhio_mode_t gdbMode)
{ {
@ -149,22 +161,12 @@ static mode_t _gdbHioImportFileMode(gdbhio_mode_t gdbMode)
if (gdbMode & GDBHIO_S_IRUSR) mode |= S_IRUSR; if (gdbMode & GDBHIO_S_IRUSR) mode |= S_IRUSR;
if (gdbMode & GDBHIO_S_IWUSR) mode |= S_IWUSR; if (gdbMode & GDBHIO_S_IWUSR) mode |= S_IWUSR;
if (gdbMode & GDBHIO_S_IXUSR) mode |= S_IXUSR; if (gdbMode & GDBHIO_S_IXUSR) mode |= S_IXUSR;
#ifdef S_IRGRP
if (gdbMode & GDBHIO_S_IRGRP) mode |= S_IRGRP; if (gdbMode & GDBHIO_S_IRGRP) mode |= S_IRGRP;
#endif
#ifdef S_IWGRP
if (gdbMode & GDBHIO_S_IWGRP) mode |= S_IWGRP; if (gdbMode & GDBHIO_S_IWGRP) mode |= S_IWGRP;
#endif
#ifdef S_IXGRP
if (gdbMode & GDBHIO_S_IXGRP) mode |= S_IXGRP; if (gdbMode & GDBHIO_S_IXGRP) mode |= S_IXGRP;
#endif
if (gdbMode & GDBHIO_S_IROTH) mode |= S_IROTH; if (gdbMode & GDBHIO_S_IROTH) mode |= S_IROTH;
#ifdef S_IWOTH
if (gdbMode & GDBHIO_S_IWOTH) mode |= S_IWOTH; if (gdbMode & GDBHIO_S_IWOTH) mode |= S_IWOTH;
#endif
#ifdef S_IXOTH
if (gdbMode & GDBHIO_S_IXOTH) mode |= S_IXOTH; if (gdbMode & GDBHIO_S_IXOTH) mode |= S_IXOTH;
#endif
return mode; return mode;
} }
@ -180,22 +182,12 @@ static int _gdbHioExportFileMode(mode_t mode)
if (mode & S_IRUSR) gdbMode |= GDBHIO_S_IRUSR; if (mode & S_IRUSR) gdbMode |= GDBHIO_S_IRUSR;
if (mode & S_IWUSR) gdbMode |= GDBHIO_S_IWUSR; if (mode & S_IWUSR) gdbMode |= GDBHIO_S_IWUSR;
if (mode & S_IXUSR) gdbMode |= GDBHIO_S_IXUSR; if (mode & S_IXUSR) gdbMode |= GDBHIO_S_IXUSR;
#ifdef S_IRGRP
if (mode & S_IRGRP) gdbMode |= GDBHIO_S_IRGRP; if (mode & S_IRGRP) gdbMode |= GDBHIO_S_IRGRP;
#endif
#ifdef S_IWGRP
if (mode & S_IWGRP) gdbMode |= GDBHIO_S_IWGRP; if (mode & S_IWGRP) gdbMode |= GDBHIO_S_IWGRP;
#endif
#ifdef S_IXGRP
if (mode & S_IXGRP) gdbMode |= GDBHIO_S_IXGRP; if (mode & S_IXGRP) gdbMode |= GDBHIO_S_IXGRP;
#endif
if (mode & S_IROTH) gdbMode |= GDBHIO_S_IROTH; if (mode & S_IROTH) gdbMode |= GDBHIO_S_IROTH;
#ifdef S_IWOTH
if (mode & S_IWOTH) gdbMode |= GDBHIO_S_IWOTH; if (mode & S_IWOTH) gdbMode |= GDBHIO_S_IWOTH;
#endif
#ifdef S_IXOTH
if (mode & S_IXOTH) gdbMode |= GDBHIO_S_IXOTH; if (mode & S_IXOTH) gdbMode |= GDBHIO_S_IXOTH;
#endif
return mode; return mode;
} }
@ -213,13 +205,13 @@ static int _gdbExportSeekFlag(int flag)
// https://sourceware.org/gdb/onlinedocs/gdb/struct-stat.html#struct-stat // https://sourceware.org/gdb/onlinedocs/gdb/struct-stat.html#struct-stat
typedef u32 gdbhio_time_t; typedef u32 gdbhio_time_t;
struct gdbhio_stat { struct gdbhio_stat {
unsigned int st_dev; /* device */ u32 st_dev; /* device */
unsigned int st_ino; /* inode */ u32 st_ino; /* inode */
gdbhio_mode_t st_mode; /* protection */ gdbhio_mode_t st_mode; /* protection */
unsigned int st_nlink; /* number of hard links */ u32 st_nlink; /* number of hard links */
unsigned int st_uid; /* user ID of owner */ u32 st_uid; /* user ID of owner */
unsigned int st_gid; /* group ID of owner */ u32 st_gid; /* group ID of owner */
unsigned int st_rdev; /* device type (if inode device) */ u32 st_rdev; /* device type (if inode device) */
u64 st_size; /* total size, in bytes */ u64 st_size; /* total size, in bytes */
u64 st_blksize; /* blocksize for filesystem I/O */ u64 st_blksize; /* blocksize for filesystem I/O */
u64 st_blocks; /* number of blocks allocated */ u64 st_blocks; /* number of blocks allocated */
@ -243,7 +235,7 @@ static void _gdbHioImportStructStat(struct stat *out, const struct gdbhio_stat *
memset(out, 0, sizeof(struct stat)); memset(out, 0, sizeof(struct stat));
out->st_dev = _gdbHioImportScalar32(in->st_dev); out->st_dev = _gdbHioImportScalar32(in->st_dev);
out->st_ino = _gdbHioImportScalar32(in->st_ino); out->st_ino = _gdbHioImportScalar32(in->st_ino);
out->st_mode = _gdbHioImportFileMode(_gdbHioImportScalar32(in->st_dev)); out->st_mode = _gdbHioImportFileMode(_gdbHioImportScalar32(in->st_mode));
out->st_nlink = _gdbHioImportScalar32(in->st_nlink); out->st_nlink = _gdbHioImportScalar32(in->st_nlink);
out->st_uid = _gdbHioImportScalar32(in->st_uid); out->st_uid = _gdbHioImportScalar32(in->st_uid);
out->st_gid = _gdbHioImportScalar32(in->st_gid); out->st_gid = _gdbHioImportScalar32(in->st_gid);
@ -273,7 +265,7 @@ static void _gdbHioSetErrno(int gdbErrno, bool ctrlC)
g_gdbHioWasInterruptedByCtrlC = ctrlC; g_gdbHioWasInterruptedByCtrlC = ctrlC;
} }
static int _gdbHioSendSyncRequestV(const char *name, const char *paramFormat, va_list args) static s64 _gdbHioSendSyncRequest64V(const char *name, const char *paramFormat, va_list args)
{ {
PackedGdbHioRequest req = {{0}}; PackedGdbHioRequest req = {{0}};
memcpy(req.magic, "GDB", 4); memcpy(req.magic, "GDB", 4);
@ -289,6 +281,7 @@ static int _gdbHioSendSyncRequestV(const char *name, const char *paramFormat, va
case 'I': case 'I':
req.parameters[i] = va_arg(args, u32); req.parameters[i] = va_arg(args, u32);
break; break;
case 'l':
case 'L': case 'L':
req.parameters[i] = va_arg(args, u64); req.parameters[i] = va_arg(args, u64);
break; break;
@ -315,16 +308,26 @@ static int _gdbHioSendSyncRequestV(const char *name, const char *paramFormat, va
return req.retval; return req.retval;
} }
static int _gdbHioSendSyncRequest(const char *name, const char *paramFormat, ...) static s64 _gdbHioSendSyncRequest64(const char *name, const char *paramFormat, ...)
{ {
int ret = 0; s64 ret = 0;
va_list args; va_list args;
va_start(args, paramFormat); va_start(args, paramFormat);
ret = _gdbHioSendSyncRequestV(name, paramFormat, args); ret = _gdbHioSendSyncRequest64V(name, paramFormat, args);
va_end(args); va_end(args);
return ret; return ret;
} }
static int _gdbHioSendSyncRequest(const char *name, const char *paramFormat, ...)
{
s64 ret = 0;
va_list args;
va_start(args, paramFormat);
ret = _gdbHioSendSyncRequest64V(name, paramFormat, args);
va_end(args);
return (int)ret;
}
int gdbHioOpen(const char *pathname, int flags, mode_t mode) int gdbHioOpen(const char *pathname, int flags, mode_t mode)
{ {
return _gdbHioSendSyncRequest("open", "siI", pathname, _gdbHioExportOpenFlags(flags), _gdbHioExportFileMode(mode)); return _gdbHioSendSyncRequest("open", "siI", pathname, _gdbHioExportOpenFlags(flags), _gdbHioExportFileMode(mode));
@ -345,9 +348,9 @@ int gdbHioWrite(int fd, const void *buf, unsigned int count)
return _gdbHioSendSyncRequest("write", "ipI", fd, buf, count); return _gdbHioSendSyncRequest("write", "ipI", fd, buf, count);
} }
int gdbHioLseek(int fd, off_t offset, int flag) off_t gdbHioLseek(int fd, off_t offset, int flag)
{ {
return _gdbHioSendSyncRequest("lseek", "iLi", fd, offset, _gdbExportSeekFlag(flag)); return _gdbHioSendSyncRequest64("lseek", "ili", fd, offset, _gdbExportSeekFlag(flag));
} }
int gdbHioRename(const char *oldpath, const char *newpath) int gdbHioRename(const char *oldpath, const char *newpath)