Rewrite gdbHioDevRedirectStdStreams

This commit is contained in:
TuxSH 2019-06-19 03:03:14 +02:00
parent b34182d53d
commit d8119b1dc2

View File

@ -7,6 +7,8 @@
#include <errno.h> #include <errno.h>
#include <string.h> #include <string.h>
static int g_gdbHioStdinFd = -1, g_gdbHioStdoutFd = -1, g_gdbHioStderrFd = -1;
static int _gdbHioGetFd(int fd) static int _gdbHioGetFd(int fd)
{ {
__handle *handle = __get_handle(fd); __handle *handle = __get_handle(fd);
@ -22,19 +24,6 @@ static int _gdbHioGetFd(int fd)
return *(int *)handle->fileStruct; return *(int *)handle->fileStruct;
} }
static bool _gdbHioCompareFd(int fd, int fdval)
{
__handle *handle = __get_handle(fd);
if (handle == NULL) {
return false;
}
if(strcmp(devoptab_list[handle->device]->name, "gdbhio") != 0) {
return false;
}
return *(int *)handle->fileStruct == fdval;
}
static inline int _gdbHioGetFdFromPtr(void *fdptr) static inline int _gdbHioGetFdFromPtr(void *fdptr)
{ {
return *(int *)fdptr; return *(int *)fdptr;
@ -62,7 +51,18 @@ static int _gdbHioDevOpen(struct _reent *r, void *fdptr, const char *pathname, i
static int _gdbHioDevClose(struct _reent *r, void *fdptr) static int _gdbHioDevClose(struct _reent *r, void *fdptr)
{ {
(void)r; (void)r;
return gdbHioClose(_gdbHioGetFdFromPtr(fdptr));
int fd = _gdbHioGetFdFromPtr(fdptr);
if (fd == g_gdbHioStdinFd)
g_gdbHioStdinFd = -1;
else if (fd == g_gdbHioStdoutFd)
g_gdbHioStdoutFd = -1;
else if (fd == g_gdbHioStderrFd)
g_gdbHioStderrFd = -1;
else
return gdbHioClose(fd);
return 0;
} }
static ssize_t _gdbHioDevRead(struct _reent *r, void *fdptr, char *buf, size_t count) static ssize_t _gdbHioDevRead(struct _reent *r, void *fdptr, char *buf, size_t count)
@ -176,50 +176,75 @@ int gdbHioDevInit(void)
} }
dev = AddDevice(&g_gdbHioDevoptab); dev = AddDevice(&g_gdbHioDevoptab);
return dev >= 0 ? 0 : -1; if (dev < 0) return -1;
return 0;
} }
void gdbHioDevExit(void) void gdbHioDevExit(void)
{ {
close(g_gdbHioStdinFd);
close(g_gdbHioStdoutFd);
close(g_gdbHioStderrFd);
RemoveDevice("gdbhio:"); RemoveDevice("gdbhio:");
} }
int gdbHioDevGetStdin(void) int gdbHioDevGetStdin(void)
{ {
return _gdbHioDevImportFd(GDBHIO_STDIN_FILENO); if (g_gdbHioStdinFd < 0)
g_gdbHioStdinFd = _gdbHioDevImportFd(GDBHIO_STDIN_FILENO);
return g_gdbHioStdinFd;
} }
int gdbHioDevGetStdout(void) int gdbHioDevGetStdout(void)
{ {
return _gdbHioDevImportFd(GDBHIO_STDOUT_FILENO); if (g_gdbHioStdoutFd < 0)
g_gdbHioStdoutFd = _gdbHioDevImportFd(GDBHIO_STDOUT_FILENO);
return g_gdbHioStdoutFd;
} }
int gdbHioDevGetStderr(void) int gdbHioDevGetStderr(void)
{ {
return _gdbHioDevImportFd(GDBHIO_STDERR_FILENO); if (g_gdbHioStderrFd < 0)
g_gdbHioStderrFd = _gdbHioDevImportFd(GDBHIO_STDERR_FILENO);
return g_gdbHioStderrFd;
} }
int gdbHioDevRedirectStdStreams(bool in, bool out, bool err) int gdbHioDevRedirectStdStreams(bool in, bool out, bool err)
{ {
int ret = 0; int ret = 0;
int fd = -1; if (in) {
if (in && !_gdbHioCompareFd(STDIN_FILENO, GDBHIO_STDIN_FILENO)) { if (gdbHioDevGetStdin() < 0) return -1;
fd = gdbHioDevGetStdin(); ret = dup2(g_gdbHioStdinFd, STDIN_FILENO);
ret = dup2(fd, STDIN_FILENO);
close(fd);
if (ret < 0) return -1; if (ret < 0) return -1;
if (ret != g_gdbHioStdinFd) {
close(g_gdbHioStdinFd);
g_gdbHioStdinFd = STDIN_FILENO;
}
} }
if (out && !_gdbHioCompareFd(STDOUT_FILENO, GDBHIO_STDOUT_FILENO)) {
fd = gdbHioDevGetStdout(); if (out) {
ret = dup2(fd, STDOUT_FILENO); if (gdbHioDevGetStdout() < 0) return -2;
close(fd); ret = dup2(g_gdbHioStdoutFd, STDOUT_FILENO);
if (ret < 0) return -2; if (ret < 0) return -2;
if (ret != g_gdbHioStdoutFd) {
close(g_gdbHioStdoutFd);
g_gdbHioStdoutFd = STDOUT_FILENO;
}
} }
if (err && !_gdbHioCompareFd(STDERR_FILENO, GDBHIO_STDERR_FILENO)) {
fd = gdbHioDevGetStderr(); if (err) {
ret = dup2(fd, STDERR_FILENO); if (gdbHioDevGetStderr() < 0) return -3;
close(fd); ret = dup2(g_gdbHioStderrFd, STDERR_FILENO);
if (ret < 0) return -3; if (ret < 0) return -3;
if (ret != g_gdbHioStderrFd) {
close(g_gdbHioStderrFd);
g_gdbHioStderrFd = STDERR_FILENO;
}
} }
return ret;
return 0;
} }