--- freem/src/fmadm.c 2025/03/24 20:59:58 1.16
+++ freem/src/fmadm.c 2025/04/01 14:32:11 1.19
@@ -1,5 +1,5 @@
/*
- * $Id: fmadm.c,v 1.16 2025/03/24 20:59:58 snw Exp $
+ * $Id: fmadm.c,v 1.19 2025/04/01 14:32:11 snw Exp $
* FreeM Administration Tool
*
*
@@ -24,6 +24,15 @@
* along with FreeM. If not, see .
*
* $Log: fmadm.c,v $
+ * Revision 1.19 2025/04/01 14:32:11 snw
+ * Begin work on environment and namespace reorg
+ *
+ * Revision 1.18 2025/03/31 16:33:56 snw
+ * Work on fmadm edit global
+ *
+ * Revision 1.17 2025/03/30 01:36:58 snw
+ * Make it easier to bring back fma_gedit, fix double-free in global handler, limit $CHAR to 7-bit ASCII
+ *
* Revision 1.16 2025/03/24 20:59:58 snw
* Try using DosCopy API instead of built-in cp function on OS/2
*
@@ -61,6 +70,8 @@
#include
#include
+#include
+#include
#include
#include
#include
@@ -1052,11 +1063,9 @@ int fm_edit (short object, int optc, cha
case OBJ_ROUTINE:
return fma_routines_edit (optc, options);
- /*
case OBJ_GLOBAL:
return fma_globals_edit (optc, options);
- */
-
+
default:
fprintf (stderr, "fmadm: 'edit' is an invalid action for '%s'\n", obj_str);
return 1;
@@ -1091,7 +1100,7 @@ void fm_reconfigure(void)
retval = rename (config_file, config_backup);
if (retval == 0) {
- fprintf (stderr, "[OK]\n\n");
+ fprintf (stderr, "[OK]\n");
fm_configure ();
@@ -1108,7 +1117,7 @@ void fm_reconfigure(void)
void fm_configure (void)
{
-
+ char varbase[4096];
char sysrtn[4096];
char sysgbl[4096];
char usrrtn[4096];
@@ -1132,7 +1141,19 @@ void fm_configure (void)
struct stat etcstat;
int stat_result;
+
+ DIR *dir;
+ struct dirent *ent;
+ char src_dir[4096];
+ char dest_dir[4096];
+
+ struct group *d_grp;
+ struct passwd *d_user;
+ gid_t d_gid;
+ uid_t d_uid;
+
+ snprintf (varbase, 4095, "%s/freem", LOCALSTATEDIR);
snprintf (sysrtn, 4095, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment);
snprintf (sysgbl, 4095, "%s/freem/%s/SYSTEM/globals", LOCALSTATEDIR, fma_environment);
snprintf (usrrtn, 4095, "%s/freem/%s/USER/routines", LOCALSTATEDIR, fma_environment);
@@ -1148,11 +1169,25 @@ 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.\n\n", config_file);
- fprintf (stderr, "'fmadm configure' may only be used on a fresh installation of FreeM.\n");
- exit (1);
+ fprintf (stderr, "fmadm: '%s' already exists; running fmadm reconfigure instead\n", config_file);
+ fm_reconfigure ();
+ return;
}
@@ -1197,89 +1232,160 @@ void fm_configure (void)
/* check for existence of needed directories */
if (stat (SYSCONFDIR, &etcstat) == -1) {
fprintf (stderr, "fmadm: creating %s\n", SYSCONFDIR);
- mkdir (SYSCONFDIR, 0755);
+ 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
}
if (stat (confbase, &etcstat) == -1) {
fprintf (stderr, "fmadm: creating %s\n", confbase);
- mkdir (confbase, 0755);
+ 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
}
if (stat (envbase, &etcstat) == -1) {
fprintf (stderr, "fmadm: creating %s\n", envbase);
- mkdir (envbase, 0755);
+ 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
+
}
+ 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
+
+ }
+
if (stat (nsbase, &etcstat) == -1) {
fprintf (stderr, "fmadm: creating %s\n", nsbase);
- mkdir (nsbase, 0755);
- }
-
-
-
- if (strcmp (fma_environment, "DEFAULT") != 0) {
-
- DIR *dir;
- struct dirent *ent;
- char src_dir[4096];
- char dest_dir[4096];
-
- snprintf (src_dir, 4095, "%s/freem/DEFAULT/SYSTEM/routines", LOCALSTATEDIR);
- snprintf (dest_dir, 4095, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment);
-
- fprintf (stderr, "fmadm: populating new environment '%s'\n", fma_environment);
-
- snprintf (buf, 4095, "%s/freem/%s/SYSTEM", LOCALSTATEDIR, fma_environment);
- mkdir (buf, 0755);
-
- snprintf (buf, 4095, "%s/freem/%s/USER", LOCALSTATEDIR, fma_environment);
- mkdir (buf, 0755);
-
- snprintf (buf, 4095, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment);
- mkdir (buf, 0755);
-
- snprintf (buf, 4095, "%s/freem/%s/USER/globals", LOCALSTATEDIR, fma_environment);
- mkdir (buf, 0755);
-
- snprintf (buf, 4095, "%s/freem/%s/SYSTEM/globals", LOCALSTATEDIR, fma_environment);
- mkdir (buf, 0755);
-
- snprintf (buf, 4095, "%s/freem/%s/USER/routines", LOCALSTATEDIR, fma_environment);
- mkdir (buf, 0755);
-
- fprintf (stderr, "fmadm: copying routines from '%s' to '%s'...\n", src_dir, dest_dir);
-
- if ((dir = opendir (src_dir)) == NULL) {
- fprintf (stderr, "\nfmadm: could not open source directory %s\n", src_dir);
+ 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
+
+ }
- while ((ent = readdir (dir)) != NULL) {
- char infile[4096];
- char outfile[4096];
-
- if ((strcmp (ent->d_name, ".") != 0) && (strcmp (ent->d_name, "..") != 0)) {
-
- fprintf (stderr, "\t%s\n", ent->d_name);
-
- snprintf (infile, 4095, "%s/%s", src_dir, ent->d_name);
- snprintf (outfile, 4095, "%s/%s", dest_dir, ent->d_name);
+ snprintf (src_dir, 4095, "%s/freem/mlib", DATADIR);
+ snprintf (dest_dir, 4095, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment);
+
+ fprintf (stderr, "fmadm: populating new environment '%s'\n", fma_environment);
+
+ 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
+
+
+ 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
+
+ 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
+
+ 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
+
+ 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
+
+ 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
+
+ fprintf (stderr, "fmadm: copying routines from '%s' to '%s'...\n", src_dir, dest_dir);
- if (cp (outfile, infile) != 0) {
- fprintf (stderr, "fmadm: failure copying %s to %s\n", infile, outfile);
- }
+ if ((dir = opendir (src_dir)) == NULL) {
+ fprintf (stderr, "\nfmadm: could not open source directory %s\n", src_dir);
+ exit (1);
+ }
+
+ while ((ent = readdir (dir)) != NULL) {
+ char infile[4096];
+ char outfile[4096];
+
+ if ((strcmp (ent->d_name, ".") != 0) && (strcmp (ent->d_name, "..") != 0)) {
+
+ fprintf (stderr, "\t%s\n", ent->d_name);
+
+ snprintf (infile, 4095, "%s/%s", src_dir, ent->d_name);
+ snprintf (outfile, 4095, "%s/%s", dest_dir, ent->d_name);
+#if !defined(__OS2__)
+ 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);
+ }
+#else
+ if (DosCopy (infile, outfile, 1) != 0) {
+ fprintf (stderr, "fmadm: failure copying %s to %s\n", infile, outfile);
+ }
+#endif
}
-
}
-
fp = fopen (config_file, "a+");
-
printf ("Creating %s... ", config_file);
snprintf (buf, 4095, "[SYSTEM]");
@@ -1327,6 +1433,14 @@ void fm_configure (void)
fclose (fp);
+#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");
/*