|
|
| version 1.12, 2025/03/24 20:13:34 | version 1.19, 2025/04/01 14:32:11 |
|---|---|
| Line 24 | Line 24 |
| * along with FreeM. If not, see <https://www.gnu.org/licenses/>. | * along with FreeM. If not, see <https://www.gnu.org/licenses/>. |
| * | * |
| * $Log$ | * $Log$ |
| * 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 | |
| * | |
| * Revision 1.14 2025/03/24 20:57:06 snw | |
| * Try using DosCopy API instead of built-in cp function on OS/2 | |
| * | |
| * Revision 1.13 2025/03/24 20:15:09 snw | |
| * Set file permissions on freemd.exe on OS/2 in fmadm configure | |
| * | |
| * Revision 1.12 2025/03/24 20:13:34 snw | * Revision 1.12 2025/03/24 20:13:34 snw |
| * Set file permissions on freemd.exe on OS/2 in fmadm configure | * Set file permissions on freemd.exe on OS/2 in fmadm configure |
| * | * |
| Line 49 | Line 70 |
| #include <sys/types.h> | #include <sys/types.h> |
| #include <sys/stat.h> | #include <sys/stat.h> |
| #include <pwd.h> | |
| #include <grp.h> | |
| #include <stddef.h> | #include <stddef.h> |
| #include <stdio.h> | #include <stdio.h> |
| #include <string.h> | #include <string.h> |
| Line 62 | Line 85 |
| #include "namespace.h" | #include "namespace.h" |
| #include "fs.h" | #include "fs.h" |
| #if defined(__OS2__) | |
| # include <os2.h> | |
| #endif | |
| #ifdef HAVE_LIBREADLINE | #ifdef HAVE_LIBREADLINE |
| # if defined(HAVE_READLINE_READLINE_H) | # if defined(HAVE_READLINE_READLINE_H) |
| # include <readline/readline.h> | # include <readline/readline.h> |
| Line 1036 int fm_edit (short object, int optc, cha | Line 1063 int fm_edit (short object, int optc, cha |
| case OBJ_ROUTINE: | case OBJ_ROUTINE: |
| return fma_routines_edit (optc, options); | return fma_routines_edit (optc, options); |
| /* | |
| case OBJ_GLOBAL: | case OBJ_GLOBAL: |
| return fma_globals_edit (optc, options); | return fma_globals_edit (optc, options); |
| */ | |
| default: | default: |
| fprintf (stderr, "fmadm: 'edit' is an invalid action for '%s'\n", obj_str); | fprintf (stderr, "fmadm: 'edit' is an invalid action for '%s'\n", obj_str); |
| return 1; | return 1; |
| Line 1075 void fm_reconfigure(void) | Line 1100 void fm_reconfigure(void) |
| retval = rename (config_file, config_backup); | retval = rename (config_file, config_backup); |
| if (retval == 0) { | if (retval == 0) { |
| fprintf (stderr, "[OK]\n\n"); | fprintf (stderr, "[OK]\n"); |
| fm_configure (); | fm_configure (); |
| Line 1092 void fm_reconfigure(void) | Line 1117 void fm_reconfigure(void) |
| void fm_configure (void) | void fm_configure (void) |
| { | { |
| char varbase[4096]; | |
| char sysrtn[4096]; | char sysrtn[4096]; |
| char sysgbl[4096]; | char sysgbl[4096]; |
| char usrrtn[4096]; | char usrrtn[4096]; |
| Line 1116 void fm_configure (void) | Line 1141 void fm_configure (void) |
| struct stat etcstat; | struct stat etcstat; |
| int stat_result; | 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 (sysrtn, 4095, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment); |
| snprintf (sysgbl, 4095, "%s/freem/%s/SYSTEM/globals", 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); | snprintf (usrrtn, 4095, "%s/freem/%s/USER/routines", LOCALSTATEDIR, fma_environment); |
| Line 1132 void fm_configure (void) | Line 1169 void fm_configure (void) |
| fprintf (stderr, "fmadm: not superuser\n"); | fprintf (stderr, "fmadm: not superuser\n"); |
| exit (1); | 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)) { | if (file_exists (config_file)) { |
| fprintf (stderr, "fmadm: '%s' already exists.\n\n", config_file); | fprintf (stderr, "fmadm: '%s' already exists; running fmadm reconfigure instead\n", config_file); |
| fprintf (stderr, "'fmadm configure' may only be used on a fresh installation of FreeM.\n"); | fm_reconfigure (); |
| exit (1); | return; |
| } | } |
| Line 1160 void fm_configure (void) | Line 1211 void fm_configure (void) |
| unlink (dstfile); | unlink (dstfile); |
| fprintf (stderr, "fmadm: running on OS/2; will copy %s to %s\n", srcfile, dstfile); | fprintf (stderr, "fmadm: running on OS/2; will copy %s to %s\n", srcfile, dstfile); |
| chmod (dstfile, 0755); | |
| if (cp (dstfile, srcfile) != 0) { | if (DosCopy (srcfile, dstfile, 1) != 0) { |
| fprintf (stderr, "fmadm: fatal error copying %s to %s\n", srcfile, dstfile); | fprintf (stderr, "fmadm: fatal error copying %s to %s\n", srcfile, dstfile); |
| exit (1); | exit (1); |
| } | } |
| chmod (dstfile, 0755); | |
| } | } |
| #else | #else |
| fprintf (stderr, "fmadm: not running on OS/2\n"); | fprintf (stderr, "fmadm: not running on OS/2\n"); |
| Line 1177 void fm_configure (void) | Line 1229 void fm_configure (void) |
| printf ("This utility will create the initial configuration file for "); | 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' in %s.\n\n", fma_environment, config_file); |
| /* check for existence of needed directories */ | /* check for existence of needed directories */ |
| if (stat (SYSCONFDIR, &etcstat) == -1) { | if (stat (SYSCONFDIR, &etcstat) == -1) { |
| fprintf (stderr, "fmadm: creating %s\n", SYSCONFDIR); | 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) { | if (stat (confbase, &etcstat) == -1) { |
| fprintf (stderr, "fmadm: creating %s\n", confbase); | 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) { | if (stat (envbase, &etcstat) == -1) { |
| fprintf (stderr, "fmadm: creating %s\n", envbase); | 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) { | if (stat (nsbase, &etcstat) == -1) { |
| fprintf (stderr, "fmadm: creating %s\n", nsbase); | fprintf (stderr, "fmadm: creating %s\n", nsbase); |
| mkdir (nsbase, 0755); | mkdir (nsbase, 0775); |
| } | #if !defined(__OS2__) |
| if (chown (nsbase, d_uid, d_gid) != 0) { | |
| fprintf (stderr, "fmadm: error setting ownership on %s\n", nsbase); | |
| 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); | |
| exit (1); | exit (1); |
| } | } |
| #endif | |
| } | |
| while ((ent = readdir (dir)) != NULL) { | snprintf (src_dir, 4095, "%s/freem/mlib", DATADIR); |
| char infile[4096]; | snprintf (dest_dir, 4095, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment); |
| char outfile[4096]; | |
| fprintf (stderr, "fmadm: populating new environment '%s'\n", fma_environment); | |
| if ((strcmp (ent->d_name, ".") != 0) && (strcmp (ent->d_name, "..") != 0)) { | |
| snprintf (buf, 4095, "%s/freem/%s/SYSTEM", LOCALSTATEDIR, fma_environment); | |
| fprintf (stderr, "\t%s\n", ent->d_name); | mkdir (buf, 0775); |
| #if !defined(__OS2__) | |
| snprintf (infile, 4095, "%s/%s", src_dir, ent->d_name); | if (chown (buf, d_uid, d_gid) != 0) { |
| snprintf (outfile, 4095, "%s/%s", dest_dir, ent->d_name); | 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) { | if ((dir = opendir (src_dir)) == NULL) { |
| fprintf (stderr, "fmadm: failure copying %s to %s\n", infile, outfile); | 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+"); | fp = fopen (config_file, "a+"); |
| printf ("Creating %s... ", config_file); | printf ("Creating %s... ", config_file); |
| snprintf (buf, 4095, "[SYSTEM]"); | snprintf (buf, 4095, "[SYSTEM]"); |
| Line 1313 void fm_configure (void) | Line 1433 void fm_configure (void) |
| fclose (fp); | 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"); | printf ("[OK]\n\n"); |
| /* | /* |