--- freem/src/fmadm.c 2025/03/24 20:58:05 1.15 +++ freem/src/fmadm.c 2025/04/01 14:32:11 1.19 @@ -1,5 +1,5 @@ /* - * $Id: fmadm.c,v 1.15 2025/03/24 20:58:05 snw Exp $ + * $Id: fmadm.c,v 1.19 2025/04/01 14:32:11 snw Exp $ * FreeM Administration Tool * * @@ -24,6 +24,18 @@ * 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 + * * Revision 1.15 2025/03/24 20:58:05 snw * Try using DosCopy API instead of built-in cp function on OS/2 * @@ -58,6 +70,8 @@ #include #include +#include +#include #include #include #include @@ -1049,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; @@ -1088,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 (); @@ -1105,7 +1117,7 @@ void fm_reconfigure(void) void fm_configure (void) { - + char varbase[4096]; char sysrtn[4096]; char sysgbl[4096]; char usrrtn[4096]; @@ -1129,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); @@ -1145,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; } @@ -1174,7 +1212,7 @@ void fm_configure (void) fprintf (stderr, "fmadm: running on OS/2; will copy %s to %s\n", srcfile, dstfile); - if (DosCopy (srcfile, dstfile, 1, 0L) != 0) { + if (DosCopy (srcfile, dstfile, 1) != 0) { fprintf (stderr, "fmadm: fatal error copying %s to %s\n", srcfile, dstfile); exit (1); } @@ -1194,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]"); @@ -1324,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"); /*