--- freem/src/mumps.c 2025/04/13 04:22:43 1.20
+++ freem/src/mumps.c 2025/04/16 05:33:15 1.23
@@ -1,5 +1,5 @@
/*
- * $Id: mumps.c,v 1.20 2025/04/13 04:22:43 snw Exp $
+ * $Id: mumps.c,v 1.23 2025/04/16 05:33:15 snw Exp $
* main module of freem
*
*
@@ -24,6 +24,15 @@
* along with FreeM. If not, see .
*
* $Log: mumps.c,v $
+ * Revision 1.23 2025/04/16 05:33:15 snw
+ * Try to use procctl function to fix ASLR problem on FreeBSD
+ *
+ * Revision 1.22 2025/04/15 16:49:36 snw
+ * Make use of logprintf throughout codebase
+ *
+ * Revision 1.21 2025/04/15 02:24:43 snw
+ * Improve FreeM logging capabilities
+ *
* Revision 1.20 2025/04/13 04:22:43 snw
* Fix snprintf calls
*
@@ -109,8 +118,10 @@
#include
#include
#include
-
-
+#include "log.h"
+#if defined(__FreeBSD__)
+# include
+#endif
#if defined(HAVE_GETOPT_H)
# include
#endif
@@ -124,7 +135,6 @@ extern char *getenv(const char *name);
void freem_usage(void);
void freem_print_version(void);
void init_ztrap(void);
-void m_log (int, const char *);
int main (int argc, char **argv, char **envp)
{
@@ -187,6 +197,13 @@ int main (int argc, char **argv, char **
char cli_rtn_name[256];
char env_ena[25];
+
+#if defined(__FreeBSD__)
+ int prcdta = PROC_ASLR_FORCE_DISABLE;
+ if (procctl (P_PID, getpid (), PROC_ASLR_CTL, &prcdta) == -1) {
+ fprintf (stderr, "freem: could not disable address space layout randomization for pid %ld; program operation may be unreliable [error %s]\n", getpid(), strerror (errno));
+ }
+#endif
routine_mode = FALSE;
strcpy (m_dialect, "FREEM");
@@ -466,61 +483,51 @@ int main (int argc, char **argv, char **
snprintf (env_config_file, sizeof (config_file) - 1, "%s/freem/env.conf", SYSCONFDIR);
if (!file_exists (env_config_file)) {
- fprintf (stderr, "freem: environment catalog does not exist; may need to run fmadm configure\n");
- exit (1);
+ logprintf (FM_LOG_FATAL, "freem: environment catalog does not exist; may need to run fmadm configure");
}
if (!file_exists (config_file)) {
- fprintf (stderr, "freem: configuration file for %s does not exist; may need to run fmadm configure\n", shm_env);
- exit (1);
+ logprintf (FM_LOG_FATAL, "freem: configuration file for %s does not exist; may need to run fmadm configure", shm_env);
}
if (read_profile_string (env_config_file, shm_env, "user", d_username) == FALSE) {
- fprintf (stderr, "freem: could not determine owning user for environment %s\n", shm_env);
- exit (1);
+ logprintf (FM_LOG_FATAL, "freem: could not determine owning user for environment %s", shm_env);
}
if (read_profile_string (env_config_file, shm_env, "group", d_groupname) == FALSE) {
- fprintf (stderr, "freem: could not determine owning group for environment %s\n", shm_env);
- exit (1);
+ logprintf (FM_LOG_FATAL, "freem: could not determine owning group for environment %s", shm_env);
}
if (read_profile_string (env_config_file, shm_env, "enabled", env_ena) == FALSE) {
- fprintf (stderr, "freem: could not discover enabled state for environment %s\n", shm_env);
- exit (1);
+ logprintf (FM_LOG_FATAL, "freem: could not discover enabled state for environment %s", shm_env);
}
if (strcmp (env_ena, "true") != 0) {
- fprintf (stderr, "freem: environment %s is administratively disabled\n", shm_env);
- exit (1);
+ logprintf (FM_LOG_FATAL, "freem: environment %s is administratively disabled", shm_env);
}
d_grp = getgrnam (d_groupname);
if (d_grp == NULL) {
- fprintf (stderr, "freem: invalid group '%s'\n", d_groupname);
- exit (1);
+ logprintf (FM_LOG_FATAL, "freem: invalid group '%s'", d_groupname);
}
d_gid = d_grp->gr_gid;
d_user = getpwnam (d_username);
if (d_user == NULL) {
- fprintf (stderr, "freem: invalid user '%s'\n", d_username);
- exit (1);
+ logprintf (FM_LOG_FATAL, "freem: invalid user '%s'", d_username);
}
d_uid = d_user->pw_uid;
#if defined(__linux__)
if (run_daemon == FALSE && group_member (d_gid) == 0) {
- fprintf (stderr, "freem: you must be a member of the %s group to use environment %s\n", d_groupname, shm_env);
- exit (1);
+ logprintf (FM_LOG_FATAL, "freem: you must be a member of the %s group to use environment %s", d_groupname, shm_env);
}
#endif
if (run_daemon == TRUE) {
if (geteuid () != 0 && nofork == FALSE) {
- fprintf (stderr, "freem: forking daemon must be run as root\n");
- exit (1);
+ logprintf (FM_LOG_FATAL, "freem: forking daemon must be run as root");
}
}
@@ -532,15 +539,15 @@ int main (int argc, char **argv, char **
if ((run_daemon == TRUE) && (nofork == FALSE)) {
int fork_fd;
+
+ init_log ();
/* daemonize */
fork_pid = fork ();
if (fork_pid < 0) {
- fprintf (stderr, "freem: failure in fork()\r\n");
- m_log (1, "failure in initial fork()\r\n");
- exit (1);
+ logprintf (FM_LOG_FATAL, "environment error: failure in initial fork()");
}
if (fork_pid > 0) {
@@ -548,9 +555,7 @@ int main (int argc, char **argv, char **
}
if (setsid () < 0) {
- fprintf (stderr, "freem: failure in setsid()\r\n");
- m_log (1, "failure in setsid()\r\n");
- exit (1);
+ logprintf (FM_LOG_FATAL, "environment error: failure in setsid()");
}
signal (SIGCHLD, SIG_IGN);
@@ -558,14 +563,12 @@ int main (int argc, char **argv, char **
fork_pid = fork ();
if (fork_pid < 0) {
- fprintf (stderr, "freem: failure in fork()\r\n");
- m_log (1, "failure in second fork()\r\n");
- exit (1);
+ logprintf (FM_LOG_FATAL, "environment error: failure in second fork()");
}
if (fork_pid > 0) {
+ logprintf (FM_LOG_DEBUG, "environment: exiting from second fork()");
exit (0);
- m_log (1, "exiting from second fork");
}
umask (0);
@@ -577,34 +580,28 @@ int main (int argc, char **argv, char **
}
if (geteuid () == 0) {
- /* shed privileges */
-
- fprintf (stderr, "freem: switching to group %s\n", d_groupname);
- m_log (1, "switching groups");
+ /* shed privileges */
+ logprintf (FM_LOG_INFO, "environment: switching to group %s", d_groupname);
if (setgid (d_gid) == -1) {
- fprintf (stderr, "freem: failure switching GID\n");
- m_log (1, "failure switching GIDs");
- exit (1);
+ logprintf (FM_LOG_FATAL, "environment error: failure switching GID");
}
if (d_uid != geteuid ()) {
- fprintf (stderr, "freem: switching to username %s\n", d_username);
- m_log (1, "switching users");
+
+ logprintf (FM_LOG_INFO, "environment: switching to username %s", d_username);
if (setuid (d_uid) == -1) {
- fprintf (stderr, "freem: failure switching UID\n");
- m_log (1, "failure switching UIDs");
- exit (1);
+ logprintf (FM_LOG_FATAL, "environment error: failure switching UID");
}
}
}
else {
- fprintf (stderr, "not euid 0");
+ logprintf (FM_LOG_INFO, "environment: not running as superuser; not shedding privileges");
}
freopen ("/dev/null", "r", stdin);
@@ -627,18 +624,12 @@ int main (int argc, char **argv, char **
errsav = errno;
if (pid_fd < 0) {
- fprintf (stderr, "freem: could not open PID file %s [%s]\n", pid_file_path, strerror (errsav));
- m_log (1, "freem: could not open PID file");
- m_log (1, strerror (errsav));
- exit (1);
+ logprintf (FM_LOG_FATAL, "environment error: could not open PID file %s [%s]", pid_file_path, strerror (errsav));
}
if (lockf (pid_fd, F_TLOCK, 0) < 0) {
errsav = errno;
- fprintf (stderr, "freem: could not lock PID file [%s]\n", strerror (errsav));
- m_log (1, "freem: could not lock PID file - perhaps already running?");
- m_log (1, strerror (errsav));
- exit (1);
+ logprintf (FM_LOG_FATAL, "environment error: could not lock PID file [%s]", strerror (errsav));
}
sprintf (pidfile_buf, "%ld\n", (long) getpid ());
@@ -778,16 +769,14 @@ int main (int argc, char **argv, char **
pid_t stop_requester;
if (run_daemon == FALSE) {
- fprintf (stderr, "freem: re-run with --daemon or -d command-line flags\r\n");
- cleanup ();
- exit (1);
+ logprintf (FM_LOG_FATAL, "freem: re-run with --daemon or -d command-line flags");
}
stcpy (verstr, FREEM_VERSION_STR);
stcnv_m2c (verstr);
fprintf (stderr, "Coherent Logic Development FreeM version %s\r\n", verstr);
- fprintf (stderr, "freem: shared memory for environment %s initialized (%ld bytes of shared memory @ '%p')\r\nfreem: system ready\r\n", shm_env, (long) shm_init_size, shm_config->dta);
+ logprintf (FM_LOG_INFO, "freem: shared memory for environment %s initialized (%ld bytes of shared memory @ '%p')", shm_env, (long) shm_init_size, shm_config->dta);
for (;;) {
@@ -798,8 +787,7 @@ int main (int argc, char **argv, char **
job_slot_t *slot;
- fprintf (stderr, "freem: entering maintenance mode\r\n");
- m_log (1, "freem: entering maintenance mode");
+ logprintf (FM_LOG_WARNING, "environment: entering maintenance mode");
for (slot = shm_config->hdr->jobtab_head; slot != NULL; slot = slot->next) {
@@ -818,29 +806,29 @@ int main (int argc, char **argv, char **
connected_jobs = job_count ();
- fprintf (stderr, "freem: STOP requested by pid %d\r\n", stop_requester);
- fprintf (stderr, "freem: there are %d job(s) connected to this environment\r\n", connected_jobs);
+ logprintf (FM_LOG_INFO, "environment: STOP requested by pid %ld", stop_requester);
+ logprintf (FM_LOG_INFO, "environment: there are %d job(s) connected to this environment", connected_jobs);
if (connected_jobs > 1) {
- fprintf (stderr, "freem: asking non-daemon job(s) to disconnect and halt...\r\n");
+ logprintf (FM_LOG_INFO, "environment: asking non-daemon job(s) to disconnect and halt...");
job_request_all_stop ();
- fprintf (stderr, "freem: waiting 5 seconds for job(s) to disconnect...\r\n");
+ logprintf (FM_LOG_INFO, "environment: waiting 5 seconds for job(s) to disconnect...");
sleep (5);
connected_jobs = job_count ();
- if (connected_jobs > 1) {
- fprintf (stderr, "freem: sending SIGTERM to %d job(s)...\r\n", connected_jobs);
+ if (connected_jobs > 1) {
+ logprintf (FM_LOG_INFO, "environment: sending SIGTERM to %d job(s)...", connected_jobs);
job_signal_all (SIGTERM);
- fprintf (stderr, "freem: waiting 5 seconds for job(s) to disconnect...\r\n");
+ logprintf (FM_LOG_INFO, "environment: waiting 5 seconds for job(s) to disconnect...");
sleep (5);
}
connected_jobs = job_count ();
if (connected_jobs > 1) {
- fprintf (stderr, "freem: sending SIGKILL to %d job(s)...\r\n", connected_jobs);
+ logprintf (FM_LOG_INFO, "environment: sending SIGKILL to %d job(s)...", connected_jobs);
job_signal_all (SIGKILL);
}
@@ -849,7 +837,7 @@ int main (int argc, char **argv, char **
}
- fprintf (stderr, "freem: terminating\r\n");
+ logprintf (FM_LOG_INFO, "freem: terminating");
cleanup ();
exit (0);