--- freem/src/service.c 2025/03/24 04:05:36 1.12 +++ freem/src/service.c 2026/01/07 19:51:33 1.14 @@ -1,5 +1,5 @@ /* - * $Id: service.c,v 1.12 2025/03/24 04:05:36 snw Exp $ + * $Id: service.c,v 1.14 2026/01/07 19:51:33 snw Exp $ * terminal and sequential I/O handling, * file and global locking * @@ -25,6 +25,12 @@ * along with FreeM. If not, see . * * $Log: service.c,v $ + * Revision 1.14 2026/01/07 19:51:33 snw + * Fix segfault in reverse $QUERY + * + * Revision 1.13 2025/04/09 19:52:02 snw + * Eliminate as many warnings as possible while building with -Wall + * * Revision 1.12 2025/03/24 04:05:36 snw * Replace crlf with frm_crlf to avoid symbol conflict with readline on OS/2 * @@ -65,6 +71,7 @@ #define MAXZAS NESTLEVLS #include "mpsdef.h" +#include "shmmgr.h" #include @@ -91,10 +98,9 @@ int scosgr (short att, short bwflag); # endif # define termio termios # else -# if !defined(MSDOS) +# if !defined(MSDOS) && !defined(__linux__) # include -# endif -# if defined(__OS2__) +# else # include # define termio termios # endif @@ -103,6 +109,7 @@ int scosgr (short att, short bwflag); # include #endif + #include /* search 'string' for occurence of 'pattrn' @@ -2761,13 +2768,15 @@ void part_ref (struct vtstyp *scr, short short l; short max; unsigned char exa; +#if !defined(LINUX) && defined(COLOR) unsigned char exc; +#endif short i; unsigned char *linea; unsigned char *linex; unsigned char *linec; unsigned char ch; - unsigned char tmp[1300]; + char tmp[1300]; /* was unsigned char tmp... (snw 4-9-2025) */ /* build up alternate screen */ /* reset SGR,TBM;white on black,go HOME; 25 Lines */ @@ -2837,7 +2846,10 @@ void part_ref (struct vtstyp *scr, short } exa = ~linea[0]; /* dummy value to trigger argument codes on 1st char */ + +#if !defined(LINUX) && defined(COLOR) exc = ~linec[0]; /* dummy value to trigger argument codes on 1st char */ +#endif for (l = 0; l <= max; l++) { @@ -3415,9 +3427,7 @@ void read_m (char *stuff, long read_time static char term_key[256] = {EOL, EOL}; static short int escptr; static short int single; - static short int timoflag; /* timeout flag */ - static long int timex; - static short int timexms; + static short int timoflag; /* timeout flag */ static short int i; static int ch; @@ -3439,10 +3449,7 @@ void read_m (char *stuff, long read_time stuff[0] = EOL; if (length < 1) single = length = 1; - - timex = 0L; - timexms = 0; - + if (io == HOME) opnfile[HOME] = stdin; if (io == HOME && !frm_filter) { @@ -4338,6 +4345,11 @@ int locking (int fd, int action, long co struct flock lock; + /* skip locking if we own the TP semaphore */ + if (shm_config->hdr->tp_owner == pid) { + return 0; + } + lock.l_whence = 1; /* lock from current position */ lock.l_start = 0; lock.l_len = count;