--- 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 ();