Skip to content

Instantly share code, notes, and snippets.

@jordemort
Created September 22, 2023 15:56
Show Gist options
  • Save jordemort/2c5b090b66189304172113e404f241e5 to your computer and use it in GitHub Desktop.
Save jordemort/2c5b090b66189304172113e404f241e5 to your computer and use it in GitHub Desktop.
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