--- freem/src/service.c 2025/03/24 02:00:30 1.11
+++ freem/src/service.c 2026/01/07 19:51:33 1.14
@@ -1,5 +1,5 @@
/*
- * $Id: service.c,v 1.11 2025/03/24 02:00:30 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,15 @@
* 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
+ *
* Revision 1.11 2025/03/24 02:00:30 snw
* Work around some OS/2 incompatibilities in service.c
*
@@ -62,6 +71,7 @@
#define MAXZAS NESTLEVLS
#include "mpsdef.h"
+#include "shmmgr.h"
#include
@@ -88,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
@@ -100,6 +109,7 @@ int scosgr (short att, short bwflag);
# include
#endif
+
#include
/* search 'string' for occurence of 'pattrn'
@@ -2758,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 */
@@ -2834,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++) {
@@ -3319,7 +3334,7 @@ void write_m (char *text)
ypos[io]++;
- if (crlf[io]) xpos[io] = 0;
+ if (frm_crlf[io]) xpos[io] = 0;
continue;
@@ -3412,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;
@@ -3436,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) {
@@ -4150,7 +4160,7 @@ void read_m (char *stuff, long read_time
if (single) break;
- if (ch == LF && crlf[io]) {
+ if (ch == LF && frm_crlf[io]) {
i--;
continue;
}
@@ -4335,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;