From 0175cb4a8dc7e622141b464d7c5eb41720411f52 Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Wed, 2 Feb 2022 17:06:11 +0300 Subject: [PATCH] fixed bug with EOLs --- .gitignore | 6 ++--- CMakeLists.txt | 2 +- ncurses_and_readline.c | 8 ++++-- ttysocket.c | 61 +++++++++++++++++++++++++++++++++--------- 4 files changed, 59 insertions(+), 18 deletions(-) diff --git a/.gitignore b/.gitignore index 60663b5..1b3ee92 100644 --- a/.gitignore +++ b/.gitignore @@ -14,10 +14,10 @@ *.so *.so.* -# qt-creator +# Qt creator *.config -*.cflags -*.cxxflags *.creator* *.files *.includes +*.cflags +*.cxxflags diff --git a/CMakeLists.txt b/CMakeLists.txt index b7ddeb8..128d481 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,7 +19,7 @@ set(CMAKE_COLOR_MAKEFILE ON) # here is one of two variants: all .c in directory or .c files in list aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} SOURCES) -# cmake -DDEBUG=1 -> debugging +# cmake -DEBUG=1 -> debugging if(DEFINED EBUG) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wextra -Wall -Werror -W") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra -Wall -Werror -W") diff --git a/ncurses_and_readline.c b/ncurses_and_readline.c index 11ccc3b..293a09c 100644 --- a/ncurses_and_readline.c +++ b/ncurses_and_readline.c @@ -147,8 +147,12 @@ static void show_mode(bool for_resize){ dtty->name, dtty->seol, dtty->port); break; case DEV_UNIXSOCKET: - snprintf(buf, 127, "INSERT (TAB to switch, ctrl+D to quit) HOST: %s, ENDLINE: %s, PATH: %s", - dtty->name, dtty->seol, dtty->port); + if(*dtty->name) + snprintf(buf, 127, "INSERT (TAB to switch, ctrl+D to quit) PATH: %s, ENDLINE: %s", + dtty->name, dtty->seol); + else // name starting from \0 + snprintf(buf, 127, "INSERT (TAB to switch, ctrl+D to quit) PATH: \\0%s, ENDLINE: %s", + dtty->name+1, dtty->seol); break; case DEV_TTY: snprintf(buf, 127, "INSERT (TAB to switch, ctrl+D to quit) DEV: %s, ENDLINE: %s, SPEED: %d", diff --git a/ttysocket.c b/ttysocket.c index 451c060..c10656f 100644 --- a/ttysocket.c +++ b/ttysocket.c @@ -72,11 +72,40 @@ static int waittoread(int fd){ return 0; } +// substitute all EOL's by '\n' +static size_t rmeols(chardevice *d){ + if(!d) return 0; + TTY_descr *D = d->dev; + if(!D || D->comfd < 0) return 0; + if(0 == strcmp(d->eol, "\n")){ + DBG("No subs need"); + return D->buflen; // don't need to do this + } + int L = strlen(D->buf); + char *newbuf = MALLOC(char, L), *ptr = D->buf, *eptr = D->buf + L; + while(ptr < eptr){ + char *eol = strstr(ptr, d->eol); + if(eol){ + eol[0] = '\n'; + eol[1] = 0; + } + strcat(newbuf, ptr); + if(!eol) break; + ptr = eol + d->eollen; + } + strcpy(D->buf, newbuf); + FREE(newbuf); + D->buflen = strlen(D->buf); + return D->buflen; +} + // get data drom TTY -static char *getttydata(TTY_descr *D, int *len){ - if(!D || D->comfd < 0) return NULL; - size_t L = 0; - size_t length = D->bufsz; +static char *getttydata(chardevice *d, int *len){ + if(!d || !d->dev) return NULL; + TTY_descr *D = d->dev; + if(D->comfd < 0) return NULL; + int L = 0; + int length = D->bufsz; char *ptr = D->buf; int s = 0; do{ @@ -85,22 +114,29 @@ static char *getttydata(TTY_descr *D, int *len){ if(len) *len = 0; return NULL; } - ssize_t l = read(D->comfd, ptr, length); + int l = read(D->comfd, ptr, length); if(l < 1){ // disconnected if(len) *len = -1; return NULL; } ptr += l; L += l; length -= l; + if(L >= d->eollen && 0 == strcmp(&ptr[-(d->eollen)], d->eol)){ // found end of line + break; + } }while(length); D->buflen = L; D->buf[L] = 0; if(len) *len = L; + if(!L) return NULL; + rmeols(d); return D->buf; } -static char *getsockdata(TTY_descr *D, int *len){ - if(!D || D->comfd < 0) return NULL; +static char *getsockdata(chardevice *d, int *len){ + if(!d || !d->dev) return NULL; + TTY_descr *D = d->dev; + if(D->comfd < 0) return NULL; char *ptr = NULL; int n = waittoread(D->comfd); if(n == 1){ @@ -108,7 +144,8 @@ static char *getsockdata(TTY_descr *D, int *len){ if(n > 0){ ptr = D->buf; ptr[n] = 0; - DBG("got %d: %s", n, ptr); + n = rmeols(d); + DBG("got %d: ..%s..", n, ptr); }else{ DBG("Got nothing"); n = -1; @@ -130,12 +167,11 @@ char *ReadData(chardevice *d, int *len){ char *r = NULL; switch(d->type){ case DEV_TTY: - if(!d || !d->dev) return NULL; - r = getttydata(d->dev, len); + r = getttydata(d, len); break; case DEV_NETSOCKET: case DEV_UNIXSOCKET: - r = getsockdata(d->dev, len); + r = getsockdata(d, len); break; default: break; @@ -159,10 +195,11 @@ int SendData(chardevice *d, char *str){ if(!str) return 0; int ret = 0; if(0 == pthread_mutex_lock(&d->mutex)){ - int l = strlen(str), lplus = l + d->eollen + 1; + int l = strlen(str), lplus = l + d->eollen; if(l < 1) return 0; if(lplus > BUFSIZ-1) lplus = BUFSIZ-1; snprintf(buf, lplus+1, "%s%s", str, d->eol); + DBG("SENDBUF (%d): _%s_", lplus, buf); switch(d->type){ case DEV_TTY: if(write_tty(d->dev->comfd, buf, lplus)) ret = 0;