Created
September 22, 2023 15:56
-
-
Save jordemort/2c5b090b66189304172113e404f241e5 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/base/misc/ioctl.c b/src/base/misc/ioctl.c | |
index 39c0b005a..b55042bbd 100644 | |
--- a/src/base/misc/ioctl.c | |
+++ b/src/base/misc/ioctl.c | |
@@ -125,10 +125,12 @@ static void io_select(void) | |
{ | |
int selrtn, i; | |
fd_set fds; | |
+ fd_set exceptfds; | |
int nfds; | |
pthread_mutex_lock(&fds_mtx); | |
fds = fds_sigio; | |
+ exceptfds = fds_sigio; | |
nfds = max_fd + 1; | |
pthread_mutex_unlock(&fds_mtx); | |
@@ -140,7 +142,7 @@ static void io_select(void) | |
pthread_mutex_unlock(&blk_mtx); | |
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); | |
- selrtn = RPT_SYSCALL(select(nfds, &fds, NULL, NULL, NULL)); | |
+ selrtn = RPT_SYSCALL(select(nfds, &fds, NULL, &exceptfds, NULL)); | |
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); | |
switch (selrtn) { | |
@@ -156,7 +158,7 @@ static void io_select(void) | |
for (i = 0; i < nfds; i++) { | |
if (FD_ISSET(i, &fds_masked)) | |
continue; | |
- if (FD_ISSET(i, &fds)) { | |
+ if (FD_ISSET(i, &fds) || FD_ISSET(i, &exceptfds)) { | |
if (io_callback_func[i].flags & IOFLG_IMMED) { | |
if (io_callback_func[i].flags & IOFLG_MASKED) | |
FD_SET(i, &fds_masked); | |
diff --git a/src/base/serial/ser_defs.h b/src/base/serial/ser_defs.h | |
index 8e97c2e8d..dcefd4d65 100644 | |
--- a/src/base/serial/ser_defs.h | |
+++ b/src/base/serial/ser_defs.h | |
@@ -337,6 +337,7 @@ typedef struct { | |
int opened; | |
int wr_fd; | |
boolean is_file; | |
+ boolean is_closed; | |
boolean dev_locked; /* Flag to indicate that device is locked */ | |
boolean fossil_active; /* Flag: FOSSIL emulation active */ | |
fossil_info_t fossil_info; /* FOSSIL driver info structure */ | |
diff --git a/src/base/serial/ser_irq.c b/src/base/serial/ser_irq.c | |
index d61faa974..211706560 100644 | |
--- a/src/base/serial/ser_irq.c | |
+++ b/src/base/serial/ser_irq.c | |
@@ -199,10 +199,16 @@ void modstat_engine(int num) /* Internal Modem Status processing */ | |
com[num].ms_timer += MS_MIN_FREQ; | |
#endif | |
- if(com_cfg[num].pseudo) | |
- newmsr = UART_MSR_CTS | UART_MSR_DSR | UART_MSR_DCD; | |
- else | |
+ if(com_cfg[num].pseudo) { | |
+ if (com[num].is_closed) { | |
+ newmsr = 0; | |
+ } else { | |
+ newmsr = UART_MSR_CTS | UART_MSR_DSR | UART_MSR_DCD; | |
+ } | |
+ if(s3_printf) s_printf("SER%d: pseudo MSR is %d\n",num,newmsr); | |
+ } else { | |
newmsr = serial_get_msr(num); | |
+ } | |
delta = msr_compute_delta_bits(com[num].MSR, newmsr); | |
com[num].MSR = (com[num].MSR & UART_MSR_DELTA) | newmsr | delta; | |
diff --git a/src/base/serial/tty_io.c b/src/base/serial/tty_io.c | |
index 2876b0987..b65f10437 100644 | |
--- a/src/base/serial/tty_io.c | |
+++ b/src/base/serial/tty_io.c | |
@@ -468,8 +468,13 @@ static int tty_uart_fill(com_t *c) | |
ioselect_complete(c->fd); | |
if (size <= 0) | |
return 0; | |
- if(s3_printf) s_printf("SER%d: Got %i bytes, %i in buffer\n", c->num, | |
- size, RX_BUF_BYTES(c->num)); | |
+ if (size == 0) { | |
+ c->is_closed = TRUE; | |
+ if(s3_printf) s_printf("SER%d: Got 0 bytes, setting is_closed\n", c->num); | |
+ } else { | |
+ if(s3_printf) s_printf("SER%d: Got %i bytes, %i in buffer\n", c->num, | |
+ size, RX_BUF_BYTES(c->num)); | |
+ } | |
if (debug_level('s') >= 9) { | |
int i; | |
for (i = 0; i < size; i++) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment