Annotation of freem/src/log.c, revision 1.9
1.1 snw 1: /*
1.9 ! snw 2: * $Id: log.c,v 1.8 2025/04/04 02:12:25 snw Exp $
1.4 snw 3: * freem error logging
1.1 snw 4: *
5: *
1.3 snw 6: * Author: Serena Willis <snw@coherent-logic.com>
1.1 snw 7: * Copyright (C) 1998 MUG Deutschland
1.4 snw 8: * Copyright (C) 2020, 2025 Coherent Logic Development LLC
1.1 snw 9: *
10: *
11: * This file is part of FreeM.
12: *
13: * FreeM is free software: you can redistribute it and/or modify
14: * it under the terms of the GNU Affero Public License as published by
15: * the Free Software Foundation, either version 3 of the License, or
16: * (at your option) any later version.
17: *
18: * FreeM is distributed in the hope that it will be useful,
19: * but WITHOUT ANY WARRANTY; without even the implied warranty of
20: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21: * GNU Affero Public License for more details.
22: *
23: * You should have received a copy of the GNU Affero Public License
24: * along with FreeM. If not, see <https://www.gnu.org/licenses/>.
25: *
1.5 snw 26: * $Log: log.c,v $
1.9 ! snw 27: * Revision 1.8 2025/04/04 02:12:25 snw
! 28: * Bump to 0.63.0-rc5 and make sure m_log function is never empty
! 29: *
1.8 snw 30: * Revision 1.7 2025/04/04 01:18:21 snw
31: * Remove vestigial logging code and bump to 0.63.0-rc4
32: *
1.7 snw 33: * Revision 1.6 2025/04/01 23:21:45 snw
34: * fmadm commands for stopping, starting, and restarting environments now functional
35: *
1.6 snw 36: * Revision 1.5 2025/04/01 20:11:46 snw
37: * Further work on fmadm
38: *
1.5 snw 39: * Revision 1.4 2025/03/09 19:50:47 snw
40: * Second phase of REUSE compliance and header reformat
41: *
1.4 snw 42: *
43: * SPDX-FileCopyrightText: (C) 2025 Coherent Logic Development LLC
44: * SPDX-License-Identifier: AGPL-3.0-or-later
1.1 snw 45: **/
46:
47: #include <stdio.h>
48: #include <string.h>
1.2 snw 49: #if defined(__linux__) | defined(__FreeBSD__) | defined(__sun__)
1.1 snw 50: # include <syslog.h>
51: #endif
52: #include <stdlib.h>
1.9 ! snw 53: #include <stdarg.h>
! 54:
! 55: #if defined(USE_SYS_TIME_H) && !defined(MSDOS) && !defined(__osf__)
! 56: # include <sys/time.h>
! 57: #else
! 58: # include <time.h>
! 59: #endif
1.1 snw 60:
61: #include "mpsdef.h"
62:
1.9 ! snw 63:
1.1 snw 64: void m_log (int level, const char *msg)
65: {
66:
1.9 ! snw 67: FILE *fp;
! 68: time_t unix_epoch;
! 69: char timeval[255];
! 70: char filename[4096];
! 71: struct tm *logtime;
! 72:
! 73: snprintf (filename, sizeof (filename) - 1, "/var/log/freem/%s.log", shm_env);
! 74:
! 75: if ((fp = fopen (filename, "a+")) != NULL) {
! 76: unix_epoch = time (0L);
! 77: logtime = localtime (&unix_epoch);
! 78: strftime (timeval, sizeof (timeval) - 1, "%F %T", logtime);
! 79: fprintf (fp, "%s [LEVEL %d PID %ld]: %s\n", timeval, level, pid, msg);
! 80: fclose (fp);
! 81: }
1.5 snw 82:
1.2 snw 83: #if defined(__linux__) | defined(__FreeBSD__) | defined(__sun__)
1.5 snw 84: syslog (level, "%s", msg);
1.1 snw 85: #endif
1.9 ! snw 86:
! 87: return;
! 88:
! 89: }
! 90:
1.5 snw 91:
1.9 ! snw 92: void logprintf(int level, char *fmt, ...)
! 93: {
! 94: va_list ptr;
! 95: va_start (ptr, fmt);
! 96:
! 97: char logmsg[BIGSTR];
! 98: char tmps[BIGSTR];
! 99:
! 100: char ch;
! 101: char typ;
! 102: char subtyp;
! 103:
! 104: register int i;
! 105:
! 106: for (i = 0; fmt[i] != '\0'; i++) {
! 107: ch = fmt[i];
! 108:
! 109: switch (ch) {
! 110:
! 111: case '%':
! 112: typ = fmt[++i];
! 113:
! 114: switch (typ) {
! 115:
! 116: case '%': /* literal percent sign */
! 117: strcat (logmsg, "%");
! 118: break;
! 119:
! 120: case 'c': /* char */
! 121: sprintf (tmps, "%c", va_arg (ptr, int));
! 122: strcat (logmsg, tmps);
! 123: break;
! 124:
! 125: case 's': /* C string */
! 126: strcat (logmsg, va_arg (ptr, char *));
! 127: break;
! 128:
! 129: case 'S': /* FreeM string */
! 130: stcpy (tmps, va_arg (ptr, char *));
! 131: stcnv_m2c (tmps);
! 132: strcat (logmsg, tmps);
! 133: break;
! 134:
! 135: case 'd': /* int */
! 136: sprintf (tmps, "%d", va_arg (ptr, int));
! 137: strcat (logmsg, tmps);
! 138: break;
! 139:
! 140: case 'l': /* long... */
! 141: subtyp = fmt[++i];
! 142: switch (subtyp) {
! 143:
! 144: case 'd': /* long int */
! 145: sprintf (tmps, "%ld", va_arg (ptr, long));
! 146: strcat (logmsg, tmps);
! 147: break;
! 148:
! 149: case 'f': /* float */
! 150: sprintf (tmps, "%lf", va_arg (ptr, double));
! 151: strcat (logmsg, tmps);
! 152: break;
! 153:
! 154: }
! 155: break;
! 156: }
! 157:
! 158: case '\\':
! 159: typ = fmt[++i];
! 160: switch (typ) {
! 161: case 'n':
! 162: sprintf (tmps, "\n");
! 163: strcat (logmsg, tmps);
! 164: break;
! 165:
! 166: case 'r':
! 167: sprintf (tmps, "\r");
! 168: strcat (logmsg, tmps);
! 169: break;
! 170:
! 171: case 't':
! 172: sprintf (tmps, "\t");
! 173: strcat (logmsg, tmps);
! 174: break;
! 175:
! 176: case '\\':
! 177: sprintf (tmps, "\\");
! 178: strcat (logmsg, tmps);
! 179: break;
! 180: }
! 181:
! 182: default:
! 183: sprintf (tmps, "%c", ch);
! 184: strcat (logmsg, tmps);
! 185: break;
! 186: }
! 187: }
! 188:
! 189: m_log (level, logmsg);
! 190:
! 191: va_end (ptr);
1.8 snw 192: return;
1.1 snw 193: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>