--- freem/src/frmgbl.c 2025/02/28 20:51:20 1.3 +++ freem/src/frmgbl.c 2025/04/30 17:19:16 1.16 @@ -1,23 +1,11 @@ /* - * * - * * * - * * * - * *************** - * * * * * - * * MUMPS * - * * * * * - * *************** - * * * - * * * - * * - * - * frmgbl.c + * $Id: frmgbl.c,v 1.16 2025/04/30 17:19:16 snw Exp $ * freem global C variables * * - * Author: Serena Willis + * Author: Serena Willis * Copyright (C) 1998 MUG Deutschland - * Copyright (C) 2020 Coherent Logic Development LLC + * Copyright (C) 2020, 2025 Coherent Logic Development LLC * * * This file is part of FreeM. @@ -35,6 +23,46 @@ * You should have received a copy of the GNU Affero Public License * along with FreeM. If not, see . * + * $Log: frmgbl.c,v $ + * Revision 1.16 2025/04/30 17:19:16 snw + * Improve backtraces in debugger + * + * Revision 1.15 2025/04/30 14:41:03 snw + * Further debugger work + * + * Revision 1.14 2025/04/28 19:38:55 snw + * Add trace mode + * + * Revision 1.13 2025/04/17 14:34:27 snw + * Further logging improvements + * + * Revision 1.12 2025/04/16 17:36:12 snw + * Add FreeBSD shm cleanup script + * + * Revision 1.11 2025/04/13 04:22:43 snw + * Fix snprintf calls + * + * Revision 1.10 2025/04/10 01:24:38 snw + * Remove C++ style comments + * + * Revision 1.9 2025/04/03 01:41:02 snw + * New features frozen; prepare 0.63.0-rc1 + * + * Revision 1.8 2025/04/02 03:02:42 snw + * Stop requiring users to pass -e to fmadm when -u or -g are passed + * + * Revision 1.7 2025/04/01 16:37:12 snw + * Configure DEFAULT environment the same as others, and set permissions/ownership directly in fmadm configure. Add env.conf file as a centralized configuration listing all environments. + * + * Revision 1.6 2025/03/24 04:05:36 snw + * Replace crlf with frm_crlf to avoid symbol conflict with readline on OS/2 + * + * Revision 1.5 2025/03/09 19:14:25 snw + * First phase of REUSE compliance and header reformat + * + * + * SPDX-FileCopyrightText: (C) 2025 Coherent Logic Development LLC + * SPDX-License-Identifier: AGPL-3.0-or-later **/ /* needed if byte data are to be interpreted as unsigned integer */ @@ -48,9 +76,10 @@ #include #include #include +#include #include "transact.h" #include "locktab.h" -#include +#include "log.h" #ifdef LIBFREEM # include "errmsg.h" @@ -121,10 +150,7 @@ #define VIEW 'v' #define WRITE 'w' #define XECUTE 'x' - -#define ZALLOCATE 'A' #define ZBREAK 'B' -#define ZDEALLOCATE 'D' #define ZGO 'G' #define ZHALT 'H' #define ZINSERT 'I' @@ -335,7 +361,7 @@ frm_devstat devstat[MAXDEV + 1]; /* chan short xpos[MAXDEV + 1]; /* $X-vector */ short ypos[MAXDEV + 1]; /* $Y-vector */ -short crlf[MAXDEV + 1]; /* CR/LF flag vector */ +short frm_crlf[MAXDEV + 1]; /* CR/LF flag vector */ short fm_nodelay[MAXDEV + 1]; /* nodelay flag vector */ int ESCflag[MAXDEV + 1] = @@ -415,6 +441,10 @@ int noclear = FALSE; /* nocle int standard = D_FREEM; /* default dialect */ int quiet_mode = FALSE; /* quiet mode */ char config_file[4096]; /* path to configuration file */ +char env_config_file[4096]; /* path to environment config file */ +char env_user[255]; +char env_group[255]; +char env_enabled[10]; char shm_env[255]; /* shared memory environment */ short fp_mode = 0; /* set to 0 for fixed-point math, 1 for IEEE754 floating point */ @@ -519,14 +549,13 @@ char rou0plib[PATHLEN]; /* % char rou1plib[PATHLEN]; /* %routine path (ZL..) */ char oucpath[PATHLEN] = "\201"; /* OPEN/USE/CLOSE path */ char zargdefname[PATHLEN]= "%\201"; /* default varname for Z-commands */ -char jourfile[PATHLEN] = "/usr/tmp/ioprotocol"; /* journal file */ FILE *jouraccess; /* dto. filedes */ char curdir[256] = "."; /* current directory */ char startuprou[PATHLEN] = "\201"; /* start up routine from cmdline*/ char zcommds[256] = -" za zas zb zd zg zh zi zj zl zn zp zq zr zs zt zwr zallocate zbreak zdeallocate \ +" za zas zb zd zg zh zi zj zl zn zp zq zr zs zt zwr zbreak \ zgo zhalt zinsert zjob zload znamespace zprint zquit zremove zsave ztrap zwrite \201"; /* intrinsic z-commands */ char zfunctions[256] = /* intrinsic z-functions */ " zb zc zd ze zh zht zk zl zm zn zo zp zr zs zt zboolean zcall zcr zcrc zdata zdate zedit zhorolog \ @@ -604,7 +633,7 @@ short sigint_in_for = FALSE; short direct_mode = TRUE; /* are we in direct mode? */ short extr_types[NESTLEVLS + 1]; /* return types of extrinsic functions */ -char destructors[MAX_DESTRUCTORS][50]; +char destructors[MAX_DESTRUCTORS][OBJ_DSTRSIZE]; int destructor_ct; char private_keys[MAX_PRIVATE_KEYS][255]; @@ -636,15 +665,18 @@ short ipc_pending = 0; /* 1 if an inco int strict_mode = 0; -short first_process = FALSE; -size_t shm_init_size = 16777216; +int trace_mode = 0; +short debug_mode = FALSE; +int lasterr[NESTLEVLS + 1]; +short first_process = FALSE; +#if defined(__FreeBSD__) + size_t shm_init_size = 4194304; +#else + size_t shm_init_size = 16777216; +#endif short inrpt_after_async = FALSE; -//#ifdef USE_SIGACTION -// struct sigaction act = {0}; /* signals stuff */ -//#endif/*USE_SIGACTION*/ - void unnew (void) { char *xptr; @@ -725,11 +757,12 @@ void m_fatal(char *s) if (tp_level) { - fprintf (stderr, "freem [FATAL]: memory allocation failure in %s; rolling back %d transactions [errno %d %s]\n", s, tp_level, errno_sav, strerror (errno_sav)); + /* TODO: make this FM_LOG_FATAL (logger will need to do a tp_trollback) */ + logprintf (FM_LOG_ERROR, "freem: memory allocation failure in %s; rolling back %d transactions (error code %d [%s])", s, tp_level, errno_sav, strerror (errno_sav)); tp_trollback (tp_level); } else { - fprintf (stderr, "freem [FATAL]: memory allocation failure in %s [errno %d %s]\n", s, errno_sav, strerror (errno_sav)); + logprintf (FM_LOG_FATAL, "freem: memory allocation failure in %s (error code %d [%s])", s, errno_sav, strerror (errno_sav)); } exit (3);