--- freem/src/log.c 2025/04/15 14:39:06 1.10 +++ freem/src/log.c 2025/04/16 17:36:12 1.13 @@ -1,5 +1,5 @@ /* - * $Id: log.c,v 1.10 2025/04/15 14:39:06 snw Exp $ + * $Id: log.c,v 1.13 2025/04/16 17:36:12 snw Exp $ * freem error logging * * @@ -24,6 +24,15 @@ * along with FreeM. If not, see . * * $Log: log.c,v $ + * Revision 1.13 2025/04/16 17:36:12 snw + * Add FreeBSD shm cleanup script + * + * Revision 1.12 2025/04/15 16:49:36 snw + * Make use of logprintf throughout codebase + * + * Revision 1.11 2025/04/15 14:56:20 snw + * Fix broken build due to missing declarations + * * Revision 1.10 2025/04/15 14:39:06 snw * Further improvements to logging * @@ -57,6 +66,7 @@ #endif #include #include +#include #if defined(USE_SYS_TIME_H) && !defined(MSDOS) && !defined(__osf__) # include @@ -65,6 +75,9 @@ #endif #include "mpsdef.h" +#include "log.h" /* for logging constants */ +#include "init.h" /* for cleanup() */ +#include "iniconf.h" /* for read_profile_string() */ short log_threshold_file; short log_threshold_syslog; @@ -73,32 +86,169 @@ short log_threshold_stderr; void init_log(void) { - log_threshold_file = LOG_INFO; - log_threshold_syslog = LOG_INFO; - log_threshold_stderr = LOG_WARNING; + char buf[4096]; + char *env_value; + + if (read_profile_string (env_config_file, shm_env, "log_threshold_file", buf) == TRUE) { + if (strcmp (buf, "debug") == 0) { + log_threshold_file = FM_LOG_DEBUG; + } + else if (strcmp (buf, "info") == 0) { + log_threshold_file = FM_LOG_INFO; + } + else if (strcmp (buf, "warning") == 0) { + log_threshold_file = FM_LOG_WARNING; + } + else if (strcmp (buf, "error") == 0) { + log_threshold_file = FM_LOG_ERROR; + } + else if (strcmp (buf, "fatal") == 0) { + log_threshold_file = FM_LOG_FATAL; + } + else { + log_threshold_file = FM_LOG_INFO; + } + } + else { + log_threshold_file = FM_LOG_INFO; + } + + if (read_profile_string (env_config_file, shm_env, "log_threshold_syslog", buf) == TRUE) { + if (strcmp (buf, "debug") == 0) { + log_threshold_syslog = FM_LOG_DEBUG; + } + else if (strcmp (buf, "info") == 0) { + log_threshold_syslog = FM_LOG_INFO; + } + else if (strcmp (buf, "warning") == 0) { + log_threshold_syslog = FM_LOG_WARNING; + } + else if (strcmp (buf, "error") == 0) { + log_threshold_syslog = FM_LOG_ERROR; + } + else if (strcmp (buf, "fatal") == 0) { + log_threshold_syslog = FM_LOG_FATAL; + } + else { + log_threshold_syslog = FM_LOG_INFO; + } + } + else { + log_threshold_syslog = FM_LOG_INFO; + } + + if (read_profile_string (env_config_file, shm_env, "log_threshold_stderr", buf) == TRUE) { + if (strcmp (buf, "debug") == 0) { + log_threshold_stderr = FM_LOG_DEBUG; + } + else if (strcmp (buf, "info") == 0) { + log_threshold_stderr = FM_LOG_INFO; + } + else if (strcmp (buf, "warning") == 0) { + log_threshold_stderr = FM_LOG_WARNING; + } + else if (strcmp (buf, "error") == 0) { + log_threshold_stderr = FM_LOG_ERROR; + } + else if (strcmp (buf, "fatal") == 0) { + log_threshold_stderr = FM_LOG_FATAL; + } + else { + log_threshold_stderr = FM_LOG_INFO; + } + } + else { + log_threshold_stderr = FM_LOG_WARNING; + } + + if ((env_value = getenv ("FREEM_LOG_THRESHOLD_FILE")) != NULL) { + if (strcmp (env_value, "debug") == 0) { + log_threshold_file = FM_LOG_DEBUG; + } + else if (strcmp (env_value, "info") == 0) { + log_threshold_file = FM_LOG_INFO; + } + else if (strcmp (env_value, "warning") == 0) { + log_threshold_file = FM_LOG_WARNING; + } + else if (strcmp (env_value, "error") == 0) { + log_threshold_file = FM_LOG_ERROR; + } + else if (strcmp (env_value, "fatal") == 0) { + log_threshold_file = FM_LOG_FATAL; + } + else { + log_threshold_file = FM_LOG_INFO; + } + } + + if ((env_value = getenv ("FREEM_LOG_THRESHOLD_SYSLOG")) != NULL) { + if (strcmp (env_value, "debug") == 0) { + log_threshold_syslog = FM_LOG_DEBUG; + } + else if (strcmp (env_value, "info") == 0) { + log_threshold_syslog = FM_LOG_INFO; + } + else if (strcmp (env_value, "warning") == 0) { + log_threshold_syslog = FM_LOG_WARNING; + } + else if (strcmp (env_value, "error") == 0) { + log_threshold_syslog = FM_LOG_ERROR; + } + else if (strcmp (env_value, "fatal") == 0) { + log_threshold_syslog = FM_LOG_FATAL; + } + else { + log_threshold_syslog = FM_LOG_INFO; + } + } + + if ((env_value = getenv ("FREEM_LOG_THRESHOLD_STDERR")) != NULL) { + if (strcmp (env_value, "debug") == 0) { + log_threshold_stderr = FM_LOG_DEBUG; + } + else if (strcmp (env_value, "info") == 0) { + log_threshold_stderr = FM_LOG_INFO; + } + else if (strcmp (env_value, "warning") == 0) { + log_threshold_stderr = FM_LOG_WARNING; + } + else if (strcmp (env_value, "error") == 0) { + log_threshold_stderr = FM_LOG_ERROR; + } + else if (strcmp (env_value, "fatal") == 0) { + log_threshold_stderr = FM_LOG_FATAL; + } + else { + log_threshold_stderr = FM_LOG_INFO; + } + } + + + } void log_level_to_text(int level, char *buf) { switch (level) { - case LOG_DEBUG: + case FM_LOG_DEBUG: sprintf (buf, "DEBUG"); break; - case LOG_INFO: + case FM_LOG_INFO: sprintf (buf, "INFO"); break; - case LOG_WARNING: + case FM_LOG_WARNING: sprintf (buf, "WARNING"); break; - case LOG_ERROR: + case FM_LOG_ERROR: sprintf (buf, "ERROR"); break; - case LOG_FATAL: + case FM_LOG_FATAL: sprintf (buf, "FATAL"); break; @@ -128,9 +278,9 @@ void m_log(int level, const char *msg) unix_epoch = time (0L); logtime = localtime (&unix_epoch); strftime (timeval, sizeof (timeval) - 1, "%F %T", logtime); - fprintf (fp, "%s [LEVEL %s PID %ld]: %s\n", timeval, lvl, pid, msg); + fprintf (fp, "%s [LEVEL %s PID %ld]: %s\n", timeval, lvl, getpid (), msg); fclose (fp); - } + } } #if defined(__linux__) | defined(__FreeBSD__) | defined(__sun__) @@ -139,11 +289,11 @@ void m_log(int level, const char *msg) } #endif - if (level >= log_threshold_stderr) fprintf (stderr, "%s\r\n", msg); + if (level >= log_threshold_stderr) fprintf (stderr, "%s [%s]\r\n", msg, lvl); - if (level >= LOG_FATAL) { + if (level >= FM_LOG_FATAL) { cleanup (); - exit (LOG_FATAL); + exit (FM_LOG_FATAL); } return; @@ -163,9 +313,13 @@ void logprintf(int level, char *fmt, ... register int i; + logmsg[0] = '\0'; + for (i = 0; fmt[i] != '\0'; i++) { ch = fmt[i]; + tmps[0] = '\0'; + switch (ch) { case '%': @@ -175,28 +329,33 @@ void logprintf(int level, char *fmt, ... case '%': /* literal percent sign */ strcat (logmsg, "%"); - break; + continue; case 'c': /* char */ sprintf (tmps, "%c", va_arg (ptr, int)); strcat (logmsg, tmps); - break; + continue; case 's': /* C string */ strcat (logmsg, va_arg (ptr, char *)); - break; + continue; case 'S': /* FreeM string */ stcpy (tmps, va_arg (ptr, char *)); stcnv_m2c (tmps); strcat (logmsg, tmps); - break; + continue; case 'd': /* int */ sprintf (tmps, "%d", va_arg (ptr, int)); strcat (logmsg, tmps); - break; + continue; + case 'p': /* pointer */ + sprintf (tmps, "%p", va_arg (ptr, void *)); + strcat (logmsg, tmps); + continue; + case 'l': /* long... */ subtyp = fmt[++i]; switch (subtyp) { @@ -204,15 +363,15 @@ void logprintf(int level, char *fmt, ... case 'd': /* long int */ sprintf (tmps, "%ld", va_arg (ptr, long)); strcat (logmsg, tmps); - break; + continue; case 'f': /* float */ sprintf (tmps, "%lf", va_arg (ptr, double)); strcat (logmsg, tmps); - break; + continue; } - break; + continue; } case '\\': @@ -221,22 +380,22 @@ void logprintf(int level, char *fmt, ... case 'n': sprintf (tmps, "\n"); strcat (logmsg, tmps); - break; + continue; case 'r': sprintf (tmps, "\r"); strcat (logmsg, tmps); - break; + continue; case 't': sprintf (tmps, "\t"); strcat (logmsg, tmps); - break; + continue; case '\\': sprintf (tmps, "\\"); strcat (logmsg, tmps); - break; + continue; } default: