--- freem/src/fmadm.c	2025/04/01 14:32:11	1.19
+++ freem/src/fmadm.c	2025/04/01 16:37:12	1.20
@@ -1,5 +1,5 @@
 /*
- *   $Id: fmadm.c,v 1.19 2025/04/01 14:32:11 snw Exp $
+ *   $Id: fmadm.c,v 1.20 2025/04/01 16:37:12 snw Exp $
  *    FreeM Administration Tool
  *
  *  
@@ -24,6 +24,9 @@
  *   along with FreeM.  If not, see <https://www.gnu.org/licenses/>.
  *
  *   $Log: fmadm.c,v $
+ *   Revision 1.20  2025/04/01 16:37:12  snw
+ *   Configure DEFAULT environment the same as others, and set permissions/ownership directly in fmadm configure. Add env.conf file as a centralized configuration listing all environments.
+ *
  *   Revision 1.19  2025/04/01 14:32:11  snw
  *   Begin work on environment and namespace reorg
  *
@@ -144,6 +147,9 @@ short fma_explicit_environment = FALSE;
 char obj_str[STRLEN];
 
 extern char config_file[4096];
+extern char env_config_file[4096];
+extern char env_user[255];
+extern char env_group[255];
 
 int fm_shell(void);
 void fm_checkperms(void);
@@ -151,6 +157,8 @@ void fm_reconfigure(void);
 void fm_configure(void);
 void fm_write (FILE *file, char *buf);
 int fma_jobs_remove (int optc, char **opts);
+void set_permissions(char *path, char *user, char *grp, int mode);
+
 
 int main (int argc, char **argv)
 {
@@ -198,6 +206,43 @@ int main (int argc, char **argv)
         if (argv[i][0] == '-') {
                         
             switch (argv[i][1]) {
+
+                case 'u':
+                    if (argv[i][2] != '=') {
+                        fprintf (stderr, "fmadm:  missing equals sign in flag -%c\n", argv[i][1]);
+                        fmadm_usage ();
+                        exit (1);
+                    }
+
+                    k = 0;
+                    
+                    for (j = 3; j < strlen (argv[i]); j++) {
+                        env_user[k++] = argv[i][j];
+                    }
+                    
+                    fma_explicit_environment = TRUE;
+                    base_arg++;
+                    
+                    break;
+
+                case 'g':
+                    if (argv[i][2] != '=') {
+                        fprintf (stderr, "fmadm:  missing equals sign in flag -%c\n", argv[i][1]);
+                        fmadm_usage ();
+                        exit (1);
+                    }
+
+                    k = 0;
+                    
+                    for (j = 3; j < strlen (argv[i]); j++) {
+                        env_group[k++] = argv[i][j];
+                    }
+                    
+                    fma_explicit_environment = TRUE;
+                    base_arg++;
+                    
+                    break;
+                    
                 
                 case 'e':
                     if (argv[i][2] != '=') {
@@ -238,12 +283,24 @@ int main (int argc, char **argv)
             }
         }
     }
+    
+    if (strlen (env_user) == 0) {
+        fprintf (stderr, "fmadm:  assuming user 'freem' for this environment's owner\n");
+        snprintf (env_user, 6, "freem");
+    }
+
+    if (strlen (env_group) == 0) {
+        fprintf (stderr, "fmadm:  assuming group 'freem' for this environment's owner\n");
+        snprintf (env_group, 6, "freem");
+    }
+
 
     if (!fma_explicit_environment) snprintf (fma_environment, 4096, "DEFAULT");
     if (!fma_explicit_namespace) snprintf (fma_namespace, 4096, "SYSTEM");
     
     snprintf (config_file, 4096, "%s/freem/%s/freem.conf", SYSCONFDIR, fma_environment);
-
+    snprintf (env_config_file, 4096, "%s/freem/env.conf", SYSCONFDIR);
+    
     /*
     printf ("action = '%s' object = '%s' environment = '%s' namespace = '%s' config_file = '%s' base_arg = '%d' next argument = '%s'\n", action, obj_str, fma_environment, fma_namespace, config_file, base_arg, argv[base_arg]);
     exit(1);
@@ -1147,11 +1204,28 @@ void fm_configure (void)
     char src_dir[4096];
     char dest_dir[4096];
 
+    char *username = env_user;
+    char *groupname = env_group;
+   
+#if !defined(__OS2__)
     struct group *d_grp;
     struct passwd *d_user;
     gid_t d_gid;
-    uid_t d_uid;   
+    uid_t d_uid;
+
+    if ((d_grp = getgrnam (groupname)) == NULL) {
+        fprintf (stderr, "fmadm:  '%s' group must exist before configuring\n", groupname);
+        exit (1);
+    }
+    d_gid = d_grp->gr_gid;
 
+    if ((d_user = getpwnam (username)) == NULL) {
+        fprintf (stderr, "fmadm:  '%s' user must exist before configuring\n", username);
+        exit (1);
+    }
+    d_uid = d_user->pw_uid;
+#endif    
+    
     
     snprintf (varbase, 4095, "%s/freem", LOCALSTATEDIR);
     snprintf (sysrtn, 4095, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment);
@@ -1169,20 +1243,6 @@ void fm_configure (void)
         fprintf (stderr, "fmadm:  not superuser\n");
         exit (1);
     }
-
-#if !defined(__OS2__)
-    if ((d_grp = getgrnam ("freem")) == NULL) {
-        fprintf (stderr, "fmadm:  'freem' group must exist before configuring\n");
-        exit (1);
-    }
-    d_gid = d_grp->gr_gid;
-
-    if ((d_user = getpwnam ("freem")) == NULL) {
-        fprintf (stderr, "fmadm:  'freem' user must exist before configuring\n");
-        exit (1);
-    }
-    d_uid = d_user->pw_uid;
-#endif
     
     if (file_exists (config_file)) {
         fprintf (stderr, "fmadm:  '%s' already exists; running fmadm reconfigure instead\n", config_file);
@@ -1190,12 +1250,10 @@ void fm_configure (void)
         return;
     }
 
-
     gethostname (hostid, 4095);
     uuid_v4 (buf);
 
     snprintf (jnlhostid, 4095, "%s:%s", hostid, buf);
-
     snprintf (confbase, 4095, "%s/freem", SYSCONFDIR);
     snprintf (envbase, 4095, "%s/freem/%s", SYSCONFDIR, fma_environment); 
     snprintf (nsbase, 4095, "%s/freem/%s", LOCALSTATEDIR, fma_environment);
@@ -1227,65 +1285,37 @@ void fm_configure (void)
     printf ("---------------------------\n\n");
 
     printf ("This utility will create the initial configuration file for ");
-    printf ("FreeM environment '%s' in %s.\n\n", fma_environment, config_file);    
+    printf ("FreeM environment '%s' (owned by %s:%s) in '%s'.\n\n", fma_environment, username, groupname, config_file);    
     
     /* check for existence of needed directories */
     if (stat (SYSCONFDIR, &etcstat) == -1) {
 	fprintf (stderr, "fmadm:  creating %s\n", SYSCONFDIR);
 	mkdir (SYSCONFDIR, 0775);
-#if !defined(__OS2__)
-        if (chown (SYSCONFDIR, d_uid, d_gid) != 0) {
-            fprintf (stderr, "fmadm:  error setting ownership on %s\n", SYSCONFDIR);
-            exit (1);
-        }
-#endif        
+        set_permissions (SYSCONFDIR, username, groupname, 0775);
     }
 
     if (stat (confbase, &etcstat) == -1) {
         fprintf (stderr, "fmadm:  creating %s\n", confbase);
         mkdir (confbase, 0775);
-#if !defined(__OS2__)
-        if (chown (confbase, d_uid, d_gid) != 0) {
-            fprintf (stderr, "fmadm:  error setting ownership on %s\n", confbase);
-            exit (1);
-        }
-#endif        
+        set_permissions (confbase, username, groupname, 0775);
     }
 
     if (stat (envbase, &etcstat) == -1) {
         fprintf (stderr, "fmadm:  creating %s\n", envbase);
         mkdir (envbase, 0775);
-#if !defined(__OS2__)
-        if (chown (envbase, d_uid, d_gid) != 0) {
-            fprintf (stderr, "fmadm:  error setting ownership on %s\n", envbase);
-            exit (1);
-        }
-#endif        
-        
+        set_permissions (envbase, username, groupname, 0775);
     }
 
     if (stat (varbase, &etcstat) == -1) {
         fprintf (stderr, "fmadm:  creating %s\n", varbase);
         mkdir (varbase, 0775);
-#if !defined(__OS2__)
-        if (chown (varbase, d_uid, d_gid) != 0) {
-            fprintf (stderr, "fmadm:  error setting ownership on %s\n", varbase);
-            exit (1);
-        }
-#endif        
-        
+        set_permissions (varbase, username, groupname, 0775);
     }
     
     if (stat (nsbase, &etcstat) == -1) {
         fprintf (stderr, "fmadm:  creating %s\n", nsbase);
         mkdir (nsbase, 0775);
-#if !defined(__OS2__)
-        if (chown (nsbase, d_uid, d_gid) != 0) {
-            fprintf (stderr, "fmadm:  error setting ownership on %s\n", nsbase);
-            exit (1);
-        }
-#endif        
-        
+        set_permissions (nsbase, username, groupname, 0775);
     }
 
     snprintf (src_dir, 4095, "%s/freem/mlib", DATADIR);
@@ -1295,58 +1325,27 @@ void fm_configure (void)
     
     snprintf (buf, 4095, "%s/freem/%s/SYSTEM", LOCALSTATEDIR, fma_environment);
     mkdir (buf, 0775);
-#if !defined(__OS2__)
-    if (chown (buf, d_uid, d_gid) != 0) {
-        fprintf (stderr, "fmadm:  error setting ownership on %s\n", buf);
-        exit (1);
-    }
-#endif        
-    
+    set_permissions (buf, username, groupname, 0775);
     
     snprintf (buf, 4095, "%s/freem/%s/USER", LOCALSTATEDIR, fma_environment);
     mkdir (buf, 0775);
-#if !defined(__OS2__)
-    if (chown (buf, d_uid, d_gid) != 0) {
-        fprintf (stderr, "fmadm:  error setting ownership on %s\n", buf);
-        exit (1);
-    }
-#endif        
+    set_permissions (buf, username, groupname, 0775);
     
     snprintf (buf, 4095, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment);
     mkdir (buf, 0775);
-#if !defined(__OS2__)
-    if (chown (buf, d_uid, d_gid) != 0) {
-        fprintf (stderr, "fmadm:  error setting ownership on %s\n", buf);
-        exit (1);
-    }
-#endif        
+    set_permissions (buf, username, groupname, 0775);
     
     snprintf (buf, 4095, "%s/freem/%s/USER/globals", LOCALSTATEDIR, fma_environment);
     mkdir (buf, 0775);
-#if !defined(__OS2__)
-    if (chown (buf, d_uid, d_gid) != 0) {
-        fprintf (stderr, "fmadm:  error setting ownership on %s\n", buf);
-        exit (1);
-    }
-#endif        
+    set_permissions (buf, username, groupname, 0775);
     
     snprintf (buf, 4095, "%s/freem/%s/SYSTEM/globals", LOCALSTATEDIR, fma_environment);
     mkdir (buf, 0775);
-#if !defined(__OS2__)
-    if (chown (buf, d_uid, d_gid) != 0) {
-        fprintf (stderr, "fmadm:  error setting ownership on %s\n", buf);
-        exit (1);
-    }
-#endif        
+    set_permissions (buf, username, groupname, 0775);
     
     snprintf (buf, 4095, "%s/freem/%s/USER/routines", LOCALSTATEDIR, fma_environment);
     mkdir (buf, 0775);
-#if !defined(__OS2__)
-    if (chown (buf, d_uid, d_gid) != 0) {
-        fprintf (stderr, "fmadm:  error setting ownership on %s\n", buf);
-        exit (1);
-    }
-#endif        
+    set_permissions (buf, username, groupname, 0775);
     
     fprintf (stderr, "fmadm:  copying routines from '%s' to '%s'...\n", src_dir, dest_dir);
 
@@ -1370,10 +1369,7 @@ void fm_configure (void)
             if (cp (outfile, infile) != 0) {
                 fprintf (stderr, "fmadm:  failure copying %s to %s\n", infile, outfile);
             }
-            if (chown (outfile, d_uid, d_gid) != 0) {
-                fprintf (stderr, "fmadm:  error setting ownership on %s\n", outfile);
-                exit (1);
-            }
+            set_permissions (outfile, username, groupname, 0755);
 #else
             if (DosCopy (infile, outfile, 1) != 0) {
                 fprintf (stderr, "fmadm:  failure copying %s to %s\n", infile, outfile);
@@ -1383,10 +1379,29 @@ void fm_configure (void)
         }
         
     }
+
+    fp = fopen (env_config_file, "a+");
+
+    fprintf (stderr, "Creating %s... ", env_config_file);
+
+    snprintf (buf, 4095, "[%s]", fma_environment);
+    fm_write (fp, buf);
+
+    snprintf (buf, 4095, "user=%s", env_user);
+    fm_write (fp, buf);
+    
+    snprintf (buf, 4095, "group=%s", env_group);
+    fm_write (fp, buf);
+    
+    snprintf (buf, 4095, "env_path=%s/freem/%s", LOCALSTATEDIR, fma_environment);
+    fm_write (fp, buf);
+    
+    fclose (fp);
+    fprintf (stderr, "[OK]\n");
    
     fp = fopen (config_file, "a+");
     
-    printf ("Creating %s... ", config_file); 
+    fprintf (stderr, "Creating %s... ", config_file); 
     
     snprintf (buf, 4095, "[SYSTEM]");
     fm_write (fp, buf);
@@ -1429,40 +1444,11 @@ void fm_configure (void)
 
     snprintf (buf, 4095, "globals_path=%s", usrgbl);
     fm_write (fp, buf);
-    
-    
+        
     fclose (fp);
+    set_permissions (config_file, username, groupname, 0755);
+    fprintf (stderr, "[OK]\n");
 
-#if !defined(__OS2__)
-    if (chown (config_file, d_uid, d_gid) != 0) {
-        printf ("[FAIL]\n\n");
-        fprintf (stderr, "fmadm:  error setting ownership on %s\n", config_file);
-        exit (1);
-    }
-#endif    
-    
-    printf ("[OK]\n\n");
-
-/*
-    printf ("Setting USER namespace permissions... ");
-
-    snprintf (buf, 4095, "%s/freem/USER/globals", LOCALSTATEDIR);
-    chmod (buf, 0777);
-
-    snprintf (buf, 4095, "%s/freem/USER/routines", LOCALSTATEDIR);
-    chmod (buf, 0777);
-
-    printf ("[OK]\n");
-    printf ("Setting SYSTEM namespace permissions... ");
-    
-    snprintf (buf, 4095, "%s/freem/SYSTEM/globals", LOCALSTATEDIR);
-    chmod (buf, 0755);
-
-    snprintf (buf, 4095, "%s/freem/SYSTEM/routines", LOCALSTATEDIR);
-    chmod (buf, 0755);
-
-    printf ("[OK]\n\n\n");
-*/
     printf ("FreeM initial configuration is complete.\n\n");
 
     printf (" USER globals:                   %s\n", usrgbl);
@@ -1476,6 +1462,43 @@ void fm_configure (void)
     
 } /* fm_configure */
 
+void set_permissions(char *path, char *user, char *grp, int mode)
+{
+    
+#if !defined(__OS2__)
+    struct group *d_grp;
+    struct passwd *d_user;
+    gid_t d_gid;
+    uid_t d_uid;
+#endif    
+
+
+#if !defined(__OS2__)    
+    if ((d_grp = getgrnam (grp)) == NULL) {
+        fprintf (stderr, "fmadm:  '%s' group must exist before configuring\n", grp);
+        exit (1);
+    }
+    d_gid = d_grp->gr_gid;
+
+    if ((d_user = getpwnam (user)) == NULL) {
+        fprintf (stderr, "fmadm:  '%s' user must exist before configuring\n", user);
+        exit (1);
+    }
+    d_uid = d_user->pw_uid;
+
+    if (chown (path, d_uid, d_gid) != 0) {
+        fprintf (stderr, "fmadm:  error setting ownership on %s\n", path);
+        exit (1);
+    }
+#endif    
+
+    if (chmod (path, mode) != 0) {
+        fprintf (stderr, "fmadm:  error setting permissions on %s to %d\n", path, mode);
+        exit (1);
+    }
+    
+}
+
 void fm_write (FILE *file, char *buf)
 {
     fprintf (file, "%s\n", buf);