--- freem/src/mumps.c	2025/01/19 02:04:04	1.1
+++ freem/src/mumps.c	2025/04/02 02:16:27	1.12
@@ -1,23 +1,11 @@
 /*
- *                            *
- *                           * *
- *                          *   *
- *                     ***************
- *                      * *       * *
- *                       *  MUMPS  *
- *                      * *       * *
- *                     ***************
- *                          *   *
- *                           * *
- *                            *
- *
- *   mumps.c
+ *   $Id: mumps.c,v 1.12 2025/04/02 02:16:27 snw Exp $
  *    main module of freem
  *
  *  
- *   Author: Serena Willis <jpw@coherent-logic.com>
+ *   Author: Serena Willis <snw@coherent-logic.com>
  *    Copyright (C) 1998 MUG Deutschland
- *    Copyright (C) 2020 Coherent Logic Development LLC
+ *    Copyright (C) 2020, 2025 Coherent Logic Development LLC
  *
  *
  *   This file is part of FreeM.
@@ -35,6 +23,37 @@
  *   You should have received a copy of the GNU Affero Public License
  *   along with FreeM.  If not, see <https://www.gnu.org/licenses/>.
  *
+ *   $Log: mumps.c,v $
+ *   Revision 1.12  2025/04/02 02:16:27  snw
+ *   Add fmadm status environment command and move journals to a better location
+ *
+ *   Revision 1.11  2025/04/01 23:21:45  snw
+ *   fmadm commands for stopping, starting, and restarting environments now functional
+ *
+ *   Revision 1.10  2025/04/01 20:11:46  snw
+ *   Further work on fmadm
+ *
+ *   Revision 1.9  2025/03/31 20:01:13  snw
+ *   Set d_uid in daemon
+ *
+ *   Revision 1.8  2025/03/24 16:10:48  snw
+ *   Print error message and exit on OS/2 if daemon is run without --nofork
+ *
+ *   Revision 1.7  2025/03/24 16:07:55  snw
+ *   Force daemon into foreground on OS/2
+ *
+ *   Revision 1.6  2025/03/24 16:04:49  snw
+ *   Force daemon into foreground on OS/2
+ *
+ *   Revision 1.5  2025/03/22 21:44:32  snw
+ *   Make the startup messages fewer and add environment name to direct-mode prompt
+ *
+ *   Revision 1.4  2025/03/09 19:50:47  snw
+ *   Second phase of REUSE compliance and header reformat
+ *
+ *
+ * SPDX-FileCopyrightText:  (C) 2025 Coherent Logic Development LLC
+ * SPDX-License-Identifier: AGPL-3.0-or-later
  **/
 
 #include <stdlib.h>
@@ -125,7 +144,6 @@ int main (int argc, char **argv, char **
 	{"execute", required_argument, 0, 'x'},
         {"daemon", no_argument, 0, 'd'},
         {"nofork", no_argument, 0, 'k'},
-        {"pidfile", required_argument, 0, 'p'},
         {"shmsize", required_argument, 0, 'S'},
         {"user", required_argument, 0, 'u'},
         {"group", required_argument, 0, 'g'},
@@ -287,10 +305,6 @@ int main (int argc, char **argv, char **
 		nofork = TRUE;
                 break;
 
-            case 'p': /* --pidfile */
-                pid_file_path = strdup (optarg);
-                break;
-
             case 'S': /* --shmsize */
                 shm_init_size = atol (optarg);
                 break;
@@ -316,7 +330,7 @@ int main (int argc, char **argv, char **
         extern char *optarg;
         extern int optind, optopt;
 
-        while ((c = getopt (argc, argv, "hsfiqRr:n:e:vx:dkpS:u:g:")) != -1) {
+        while ((c = getopt (argc, argv, "hsfiqRr:n:e:vx:dkS:u:g:")) != -1) {
 
 	    if (c == '?') freem_usage ();
 	    
@@ -383,10 +397,6 @@ int main (int argc, char **argv, char **
                     nofork = TRUE;
                     break;
 
-                case 'p': /* --pidfile */
-                    pid_file_path = strdup (optarg);
-                    break;
-
                 case 's': /* --standard */
                     
                     if (strcmp (optarg, "M77") == 0) {
@@ -443,6 +453,14 @@ int main (int argc, char **argv, char **
         }
     }
 #endif
+
+#if defined(__OS2__)
+    if (run_daemon == TRUE && nofork == FALSE) {
+        printf ("freem:  running on OS/2; daemon must be run with --nofork or -k\r\n");
+        exit (1);
+    }
+#endif
+    
     snprintf (config_file, 4096, "%s/freem/%s/freem.conf", SYSCONFDIR, shm_env);
     
     if (run_daemon == TRUE && geteuid() == 0) {
@@ -468,6 +486,9 @@ int main (int argc, char **argv, char **
             
             d_uid = d_user->pw_uid;
         }
+        else {
+            d_uid = 0;
+        }
         
     }
     
@@ -547,11 +568,6 @@ int main (int argc, char **argv, char **
                     m_log (1, "failure switching UIDs");
                     exit (1);
                 }
-                if (chdir (d_user->pw_dir) == -1) {
-                    fprintf (stderr, "freem:  chdir failure\n");
-                    m_log (1, "failure in chdir");
-                    exit (1);
-                }            
             }
 
         }
@@ -566,44 +582,14 @@ int main (int argc, char **argv, char **
         run_daemon = TRUE;
         nofork = FALSE;        
         
-        if (pid_file_path == NULL) {
-            /* no PID file specified. choose one. */
-            uid_t pid_uid;
-            char *home_directory;
-           
-            pid_file_path = (char *) calloc (PATH_MAX, sizeof (char));
-            NULLPTRCHK(pid_file_path,"main");
-
-            home_directory = (char *) calloc (PATH_MAX, sizeof (char));
-            NULLPTRCHK(home_directory,"main");
-            
-            pid_uid = geteuid ();
-
-            if (pid_uid == 0) {
-                /* we're running as root */
-                strcpy (pid_file_path, "/var/run/freem.pid");
-            }
-            else {
-                /* our user is a normie */
-                struct passwd *pw = getpwuid (pid_uid);
-
-                if (pw == NULL) {
-                    m_log (1, "main:  failure in getpwuid()");
-                }
-                
-                strcpy (home_directory, pw->pw_dir);               
-                snprintf (pid_file_path, PATH_MAX - 1, "%s/.freem.pid", home_directory);                
-            }
-
-            free (home_directory);
-            
-        }
-
         {
             char pidfile_buf[256];
             int errsav;
 
-            m_log (1, pid_file_path);
+            pid_file_path = (char *) malloc (PATH_MAX * sizeof (char));
+            NULLPTRCHK(pid_file_path,"main");
+            
+            snprintf (pid_file_path, PATH_MAX - 1, "%s/freem/run/%s.pid", LOCALSTATEDIR, shm_env);
 
             pid_fd = open (pid_file_path, O_RDWR | O_CREAT, 0640);
             errsav = errno;
@@ -621,9 +607,9 @@ int main (int argc, char **argv, char **
                 exit (1);
             }
 
-            sprintf (pidfile_buf, "%d\n", getpid ());
+            sprintf (pidfile_buf, "%ld\n", (long) getpid ());
             write (pid_fd, pidfile_buf, strlen (pidfile_buf));
-         
+
         }
        
         
@@ -766,7 +752,7 @@ int main (int argc, char **argv, char **
         stcnv_m2c (verstr);
         
         fprintf (stderr, "Coherent Logic Development FreeM version %s\r\n", verstr);
-        fprintf (stderr, "freem:  shared memory for environment %s initialized (%d bytes of shared memory @ '%p')\r\nfreem:  system ready\r\n", shm_env, shm_init_size, shm_config->dta);
+        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);
         
         for (;;) {
 
@@ -830,6 +816,7 @@ int main (int argc, char **argv, char **
 
                 fprintf (stderr, "freem:  terminating\r\n");
                 cleanup ();
+                
                 exit (0);
                 
             }
@@ -886,13 +873,14 @@ int main (int argc, char **argv, char **
         snprintf (version, 255, "\r\nCoherent Logic Development FreeM version %s [DIALECT: %s%s]\r\n\201", verstr, m_dialect, (restricted_mode == TRUE ? "/RESTRICTED" : ""));
 	write_m (version);
 
-	snprintf (version, 255, "Copyright (C) 2014, 2020, 2021, 2023 Coherent Logic Development LLC\r\n\r\n\201");
+	snprintf (version, 255, "Copyright (C) 2014, 2020, 2021, 2023, 2025 Coherent Logic Development LLC\r\n\r\n\201");
 	write_m (version);
 
+        /*
         printf ("Environment:       \t%s\r\n", shm_env);
         printf ("Environment Daemon:\tPID %d\r\n", shm_config->hdr->first_process);
         printf ("Interpreter Process:\tPID %d\r\n", pid);
-        
+        */
 
     }
     else {
@@ -941,7 +929,6 @@ void freem_usage(void)
     fprintf (stdout, "\t-x <MCODE>, --execute=<MCODE>\n\t\texecute M code <MCODE> on startup\n\n");
     fprintf (stdout, "\t-d, --daemon\n\t\trun the FreeM daemon (one and only one FreeM daemon must always be running)\n\n");
     fprintf (stdout, "\t-k, --nofork\n\t\trun the FreeM daemon in foreground (requires --daemon)\n\n");
-    fprintf (stdout, "\t-p <PIDFILE>, --pidfile=<PIDFILE>\n\t\tuse <PIDFILE> to record the PID of the FreeM daemon\n\n\n");
     fprintf (stdout, "\t-S <BYTES>, --shmsize=<BYTES>\n\t\tsets the size of the shared memory segment where FreeM stores the job table, lock table, and IPC table.\n");
 #else
     fprintf (stdout, "\t-h\n\t\tdisplays this help message\n\n");
@@ -956,7 +943,6 @@ void freem_usage(void)
     fprintf (stdout, "\t-x <MCODE>\n\t\texecute M code <MCODE> on startup\n\n");
     fprintf (stdout, "\t-d\n\t\trun the FreeM daemon (one and only one FreeM daemon must always be running)\n\n");
     fprintf (stdout, "\t-k\n\t\trun the FreeM daemon in foreground (requires --daemon)\n\n");
-    fprintf (stdout, "\t-p <PIDFILE>\n\t\tuse <PIDFILE> to record the PID of the FreeM daemon\n\n\n");
     fprintf (stdout, "\t-S <BYTES>\n\t\tsets the size of the shared memory segment where FreeM stores the job table, lock table, and IPC table.\n");
 #endif    
     fprintf (stdout, "\t\t  - Each concurrent job takes %d bytes (1 page) of shared memory\n", PG_SIZE);