--- freem/src/init.c 2025/04/10 01:24:38 1.10
+++ freem/src/init.c 2025/05/16 04:02:14 1.15
@@ -1,5 +1,5 @@
/*
- * $Id: init.c,v 1.10 2025/04/10 01:24:38 snw Exp $
+ * $Id: init.c,v 1.15 2025/05/16 04:02:14 snw Exp $
* FreeM initialization
*
*
@@ -24,6 +24,21 @@
* along with FreeM. If not, see .
*
* $Log: init.c,v $
+ * Revision 1.15 2025/05/16 04:02:14 snw
+ * Make FreeM build on macOS on Apple Silicon
+ *
+ * Revision 1.14 2025/04/20 03:13:17 snw
+ * Updates to init_execution_context
+ *
+ * Revision 1.13 2025/04/17 14:34:27 snw
+ * Further logging improvements
+ *
+ * Revision 1.12 2025/04/15 14:39:06 snw
+ * Further improvements to logging
+ *
+ * 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
*
@@ -73,6 +88,12 @@
# include
#endif
+#if defined(__APPLE__)
+# define termio termios
+# define TCGETA TIOCGETA
+# define TCSETA TIOCSETA
+#endif
+
#include "config.h"
#if defined(HAVE_MWAPI_MOTIF)
@@ -89,6 +110,7 @@
#include "jobtab.h"
#include "datatypes.h"
#include "objects.h"
+#include "log.h"
#ifdef HAVE_LIBREADLINE
# if defined(HAVE_READLINE_READLINE_H)
@@ -162,7 +184,9 @@ void init_mwapi(void);
short init (char *namespace_name)
{
short retval;
+ int log_level;
+ init_log ();
init_process ();
init_devtable ();
init_signals ();
@@ -186,15 +210,11 @@ short init (char *namespace_name)
if (retval == SHMS_GET_ERR) {
if (errno != 13) {
- fprintf (stderr, "init: error initializing shared memory [errno %d]\r\n", errno);
+ logprintf (FM_LOG_FATAL, "init: error initializing shared memory (error code %d [%s])", errno, strerror (errno));
}
else {
- fprintf (stderr, "init: error attaching to environment -- does your user belong to the group that owns environment '%s'?\r\n", shm_env);
+ logprintf (FM_LOG_FATAL, "init: error attaching to environment -- does your user belong to the group that owns environment '%s'?", shm_env);
}
- if (run_daemon == FALSE) {
- set_io (UNIX);
- }
- exit (1);
}
symtab_init ();
@@ -203,28 +223,35 @@ short init (char *namespace_name)
set_namespace (namespace_name, FALSE);
if (first_process) {
- fprintf (stderr, "init: we are the first process in the environment (pid %d)\r\n", pid);
+ log_level = FM_LOG_INFO;
+ }
+ else {
+ log_level = FM_LOG_DEBUG;
+ }
+
+ if (first_process) {
+ logprintf (log_level, "init: we are the first process in the environment (pid %d)", pid);
}
- if (first_process) fprintf (stderr, "init: initializing job table\r\n");
+ logprintf (log_level, "init: initializing job table");
jobtab_init ();
- if (first_process) fprintf (stderr, "init: adding job to job table\r\n");
+ logprintf (log_level, "init: adding job to job table");
job_init (FALSE);
- if (first_process) fprintf (stderr, "init: initializing structured system variables\r\n");
+ logprintf (log_level, "init: initializing structured system variables");
init_ssvn ();
- if (first_process) fprintf (stderr, "init: initializing terminal\r\n");
+ logprintf (log_level, "init: initializing terminal");
init_terminal ();
- if (first_process) fprintf (stderr, "init: initializing asynchronous events\r\n");
+ logprintf (log_level, "init: initializing asynchronous events");
evt_init ();
- if (first_process) fprintf (stderr, "init: initializing debugger\r\n");
+ logprintf (log_level, "init: initializing debugger");
dbg_init ();
- if (first_process) fprintf (stderr, "init: initializing error stack\r\n");
+ logprintf (log_level, "init: initializing error stack");
init_estack();
etrap[0] = EOL;
@@ -244,7 +271,7 @@ void init_process (void)
{
pid = getpid (); /* get $J = process ID */
umask (0); /* protection bits mask to full rights */
- snprintf (fp_conversion, 9, "%%.%df\201", DBL_DIG);
+ snprintf (fp_conversion, sizeof (fp_conversion) - 1, "%%.%df\201", DBL_DIG);
if (fp_mode) {
zprecise = DBL_DIG;
@@ -383,8 +410,7 @@ void init_timezone (void)
long clock;
-#ifdef __CYGWIN__
-
+#if defined(__CYGWIN__)
tzset (); /* may be required in order */
/* to guarantee _timezone set */
#else
@@ -453,7 +479,7 @@ void init_readline (void)
pw_buf = (char *) calloc (strlen(pw->pw_dir) + 1, sizeof(char));
strcpy (pw_buf, pw->pw_dir);
- snprintf (history_file, 256, "%s/.freem_history", pw_buf);
+ snprintf (history_file, sizeof (history_file) - 1, "%s/.freem_history", pw_buf);
free (pw_buf);
@@ -472,9 +498,10 @@ void init_execution_context (void)
codptr = code;
code[0] = EOL; /* init code_pointer */
- partition = calloc ((unsigned) (PSIZE + 2), 1);
- if (partition == NULL) exit (2); /* could not allocate stuff... */
+ if ((partition = calloc ((unsigned) (PSIZE + 2), 1)) == NULL) {
+ logprintf (FM_LOG_FATAL, "init_execution_context: could not allocate symbol table (error code %d [%s])", errno, strerror (errno));
+ }
for (i = 0; i < MAXNO_OF_RBUF; i++) {
rbuf_flags[i].standard = standard;
@@ -488,39 +515,44 @@ void init_execution_context (void)
s = &partition[PSIZE] - 256; /* pointer to symlen_offset */
argptr = partition; /* pointer to beg of tmp-storage */
- svntable = calloc ((unsigned) (UDFSVSIZ + 1), 1);
- if (svntable == NULL) exit (2); /* could not allocate stuff... */
-
+ if ((svntable = calloc ((unsigned) (UDFSVSIZ + 1), 1)) == NULL) {
+ logprintf (FM_LOG_FATAL, "init_execution_context: could not allocate user-defined ISV table (error code %d [%s])", errno, strerror (errno));
+ }
svnlen = UDFSVSIZ; /* begin of udf_svn_table */
- buff = calloc ((unsigned) NO_OF_RBUF * (unsigned) PSIZE0, 1); /* routine buffer pool */
- if (buff == NULL) exit (2); /* could not allocate stuff... */
+ if ((buff = calloc ((unsigned) NO_OF_RBUF * (unsigned) PSIZE0, 1)) == NULL) {
+ logprintf (FM_LOG_FATAL, "init_execution_context: could not allocate routine buffers (error code %d [%s])", errno, strerror (errno));
+ }
- newstack = calloc ((unsigned) NSIZE, 1);
- if (newstack == NULL) exit (2); /* could not allocate stuff... */
+ if ((newstack = calloc ((unsigned) NSIZE, 1)) == NULL) {
+ logprintf (FM_LOG_FATAL, "init_execution_context: could not allocate NEW stack (error code %d [%s])", errno, strerror (errno));
+ }
- #ifdef DEBUG_NEWPTR
- printf("Allocating newptr stack...\r\n");
- #endif
+ logprintf (FM_LOG_DEBUG, "allocating newptr stack...");
newptr = newstack;
newlimit = newstack + NSIZE - 1024;
- namstck = calloc ((unsigned) NESTLEVLS * 13, 1);
- if (namstck == NULL) exit (2); /* could not allocate stuff... */
-
+ if ((namstck = calloc ((unsigned) NESTLEVLS * 13, 1)) == NULL) {
+ logprintf (FM_LOG_FATAL, "init_execution_context: could not allocate newptr stack (error code %d [%s])", errno, strerror (errno));
+ }
+
*namstck = EOL;
*(namstck + 1) = EOL;
namptr = namstck; /* routine name stack pointer */
- framstck = calloc ((unsigned) NESTLEVLS * 256, 1);
- if (framstck == NULL) exit (2); /* could not allocate stuff... */
+
+ if ((framstck = calloc ((unsigned) NESTLEVLS * 256, 1)) == NULL) {
+ logprintf (FM_LOG_FATAL, "init_execution_context: could not allocate DO frame stack stack (error code %d [%s])", errno, strerror (errno));
+ }
*framstck = EOL;
*(framstck + 1) = EOL;
dofrmptr = framstck; /* DO_frame stack pointer */
- cmdstack = calloc ((unsigned) NESTLEVLS * 256, 1);
- if (cmdstack == NULL) exit (2); /* could not allocate stuff... */
+
+ if ((cmdstack = calloc ((unsigned) NESTLEVLS * 256, 1)) == NULL) {
+ logprintf (FM_LOG_FATAL, "init_execution_context: could not allocate command stack (error code %d [%s])", errno, strerror (errno));
+ }
cmdptr = cmdstack; /* command stack */
@@ -661,7 +693,7 @@ void cleanup (void)
int ch;
/* remove this job's entry from ^$JOB SSVN */
- snprintf (k_buf, 255, "^$JOB\202%d\201", pid);
+ snprintf (k_buf, sizeof (k_buf) - 1, "^$JOB\202%d\201", pid);
symtab_shm (kill_sym, k_buf, " \201");
reset_terminal ();