--- freem/src/fmadm.c 2025/04/03 01:41:02 1.29 +++ freem/src/fmadm.c 2025/04/13 15:12:21 1.36 @@ -1,5 +1,5 @@ /* - * $Id: fmadm.c,v 1.29 2025/04/03 01:41:02 snw Exp $ + * $Id: fmadm.c,v 1.36 2025/04/13 15:12:21 snw Exp $ * FreeM Administration Tool * * @@ -24,6 +24,27 @@ * along with FreeM. If not, see . * * $Log: fmadm.c,v $ + * Revision 1.36 2025/04/13 15:12:21 snw + * Fix transaction checkpoints on OS/2 [CLOSES #34] + * + * Revision 1.35 2025/04/13 04:22:43 snw + * Fix snprintf calls + * + * Revision 1.34 2025/04/10 15:31:25 snw + * Attempt to fix DosCopy calls for OS/2 + * + * Revision 1.33 2025/04/10 01:24:38 snw + * Remove C++ style comments + * + * Revision 1.32 2025/04/09 19:52:02 snw + * Eliminate as many warnings as possible while building with -Wall + * + * Revision 1.31 2025/04/04 19:43:18 snw + * Switch to using environment catalog to determine user and group for environment, and remove -u and -g flags from freem + * + * Revision 1.30 2025/04/03 20:48:14 snw + * Improve daemon error diagnostics and bump to 0.63.0-rc3 + * * Revision 1.29 2025/04/03 01:41:02 snw * New features frozen; prepare 0.63.0-rc1 * @@ -110,15 +131,14 @@ #include #include #include +#if defined(__OS2__) +# include +#endif #include "config.h" #include "transact.h" #include "namespace.h" #include "fs.h" -#if defined(__OS2__) -# include -#endif - #ifdef HAVE_LIBREADLINE # if defined(HAVE_READLINE_READLINE_H) # include @@ -345,21 +365,21 @@ int main (int argc, char **argv) if (obj != OBJ_DAEMON) { if (strlen (env_user) == 0) { - snprintf (env_user, 6, "freem"); + snprintf (env_user, sizeof (env_user) - 1, "freem"); } if (strlen (env_group) == 0) { - snprintf (env_group, 6, "freem"); + snprintf (env_group, sizeof (env_group) - 1, "freem"); } - if (!fma_explicit_environment) snprintf (fma_environment, 4096, "DEFAULT"); - if (!fma_explicit_namespace) snprintf (fma_namespace, 4096, "SYSTEM"); + if (!fma_explicit_environment) snprintf (fma_environment, sizeof (fma_environment) - 1, "DEFAULT"); + if (!fma_explicit_namespace) snprintf (fma_namespace, sizeof (fma_namespace) - 1, "SYSTEM"); - snprintf (config_file, 4096, "%s/freem/%s/freem.conf", SYSCONFDIR, fma_environment); + snprintf (config_file, sizeof (config_file) - 1, "%s/freem/%s/freem.conf", SYSCONFDIR, fma_environment); } - snprintf (env_config_file, 4096, "%s/freem/env.conf", SYSCONFDIR); + snprintf (env_config_file, sizeof (env_config_file) - 1, "%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]); @@ -597,10 +617,7 @@ int fm_shell (void) char *cmdt = (char *) malloc (65535 * sizeof (char)); char *result = (char *) malloc (65535 * sizeof (char)); - /* - strcpy (fma_namespace, "SYSTEM"); - set_namespace (fma_namespace, FALSE); - */ + obj = 0; snprintf (fma_prompt, STRLEN - 1, "fmadm [%s]> ", fma_namespace); @@ -705,7 +722,6 @@ int fm_shell (void) i = 0; while ((result = strtok (NULL, " ")) != NULL) { - // printf ("%d = %s\n", i, result); strcpy (args[i++], result); } @@ -1165,11 +1181,9 @@ long fm_get_pid (char *env) { char pid_file[4096]; char tmp_pid[255]; - long res; - FILE *fp; - snprintf (pid_file, 4095, "%s/freem/run/%s.pid", LOCALSTATEDIR, env); + snprintf (pid_file, sizeof (pid_file) - 1, "%s/freem/run/%s.pid", LOCALSTATEDIR, env); if ((fp = fopen (pid_file, "r")) != NULL) { if (fgets (tmp_pid, 255, fp)) { @@ -1192,7 +1206,7 @@ int fm_validate_environment (char *env) char line[255]; char chkline[255]; - snprintf (chkline, 254, "[%s]\n", env); + snprintf (chkline, sizeof (chkline) - 1, "[%s]\n", env); if ((fp = fopen (env_config_file, "r")) == NULL) { fprintf (stderr, "fmadm: could not open %s [%s]\n", env_config_file, strerror (errno)); @@ -1210,7 +1224,7 @@ int fm_validate_environment (char *env) return FALSE; } -int fm_start_environment (char *env, char *e_user, char *e_grp) +int fm_start_environment (char *env) { char basecmd[255]; char cmd[4096]; @@ -1220,15 +1234,15 @@ int fm_start_environment (char *env, cha } #if !defined(__OS2__) - snprintf (basecmd, 254, "%s/bin/freem", PREFIX); + snprintf (basecmd, sizeof (basecmd) - 1, "%s/bin/freem", PREFIX); #else - snprintf (basecmd, 254, "%s/bin/freemd.exe", PREFIX); + snprintf (basecmd, sizeof (basecmd) - 1, "%s/bin/freemd.exe", PREFIX); #endif #if !defined(__OS2__) - snprintf (cmd, 4095, "%s -d -e %s -u %s -g %s", basecmd, env, e_user, e_grp); + snprintf (cmd, sizeof (basecmd) - 1, "%s -d -e %s", basecmd, env); #else - sprintf (cmd, 4095, "%s -d -k -e %s -u %s -g %s", basecmd, env, e_user, e_grp); + sprintf (cmd, 4095, "%s -d -k -e %s", basecmd, env); #endif system (cmd); @@ -1305,7 +1319,9 @@ int fm_daemonctl (short action, short ob char *savptr; int result; long epid; + int retval; + retval = 0; switch (action) { case ACT_START: @@ -1340,7 +1356,7 @@ int fm_daemonctl (short action, short ob if (line[0] == '[') { strncpy (env, &(line[1]), 255); env[strlen (env) - 2] = '\0'; - snprintf (tmps, 255, "%s,", env); + snprintf (tmps, sizeof (tmps) - 1, "%s,", env); strncat (envlist, tmps, BIGSTR - 1); } } @@ -1384,7 +1400,7 @@ int fm_daemonctl (short action, short ob switch (action) { case ACT_START: - result = fm_start_environment (cur_env, e_user, e_grp); + result = fm_start_environment (cur_env); if (result == TRUE) { fprintf (stderr, "[OK]\n"); } @@ -1400,21 +1416,24 @@ int fm_daemonctl (short action, short ob } else { fprintf (stderr, "[FAIL]\n"); + retval++; } break; case ACT_RESTART: if (fm_stop_environment (cur_env) == TRUE) { - result = fm_start_environment (cur_env, e_user, e_grp); + result = fm_start_environment (cur_env); if (result == TRUE) { fprintf (stderr, "[OK]\n"); } else { fprintf (stderr, "[FAIL]\n"); + retval++; } } else { fprintf (stderr, "[FAIL]\n"); + retval++; } break; @@ -1422,7 +1441,7 @@ int fm_daemonctl (short action, short ob case ACT_STATUS: epid = fm_get_pid (cur_env); if (epid > -1) { - fprintf (stderr, " - %s environment daemon running as pid %d\n", cur_env, epid); + fprintf (stderr, " - %s environment daemon running as pid %ld\n", cur_env, epid); } else { fprintf (stderr, " - %s environment daemon does not appear to be running\n", cur_env); @@ -1435,7 +1454,7 @@ int fm_daemonctl (short action, short ob } while ((cur_env = strtok_r (NULL, ",", &savptr)) != NULL); free (envlist); - exit (0); + exit (retval); } /* fm_daemonctl() */ @@ -1448,7 +1467,6 @@ void fm_checkperms(void) void fm_reconfigure(void) { char config_backup[4096]; - char vers[4096]; int retval; @@ -1457,7 +1475,7 @@ void fm_reconfigure(void) exit (1); } - snprintf (config_backup, 4095, "%s.orig", config_file); + snprintf (config_backup, sizeof (config_backup) - 1, "%s.orig", config_file); fprintf (stderr, "fmadm: reconfiguring FreeM with system defaults for %s...\n", FREEM_VERSION_CSTR); fprintf (stderr, "fmadm: backing up %s to %s...\t", config_file, config_backup); @@ -1465,7 +1483,7 @@ void fm_reconfigure(void) #if !defined(__OS2__) retval = cp (config_backup, config_file); #else - retval = DosCopy (config_file, config_backup); + retval = DosCopy (config_file, config_backup, 1); #endif if (retval == 0) { @@ -1488,7 +1506,7 @@ void update_conf (char *file, char *sect char old_value[255]; char tbuf[255]; - snprintf (tbuf, 254, "%s.%s", section, key); + snprintf (tbuf, sizeof (tbuf) - 1, "%s.%s", section, key); read_profile_string (file, section, key, old_value); if (strcmp (old_value, new_value) != 0) { @@ -1527,7 +1545,6 @@ void fm_configure (void) int reconfigure = FALSE; struct stat etcstat; - int stat_result; DIR *dir; struct dirent *ent; @@ -1538,40 +1555,35 @@ void fm_configure (void) char *groupname = env_group; #if !defined(__OS2__) + struct group *d_grp; + struct passwd *d_user; + if (geteuid () != 0) { fprintf (stderr, "fmadm: not superuser\n"); exit (1); } - struct group *d_grp; - struct passwd *d_user; - gid_t d_gid; - 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 (rundir, 4095, "%s/freem/run", 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); - snprintf (usrgbl, 4095, "%s/freem/%s/USER/globals", LOCALSTATEDIR, fma_environment); - snprintf (jnldir, 4095, "%s/freem/%s/journals", LOCALSTATEDIR, fma_environment); - snprintf (jnlfile, 4095, "%s/freem_journal_%s.dat", jnldir, fma_environment); - snprintf (jnlmode, 3, "on"); - snprintf (jnlhostid, 4095, "DEFAULT"); - snprintf (jnlcut, 4095, "4294967000"); + snprintf (varbase, sizeof (varbase) - 1, "%s/freem", LOCALSTATEDIR); + snprintf (rundir, sizeof (rundir) - 1, "%s/freem/run", LOCALSTATEDIR); + snprintf (sysrtn, sizeof (sysrtn) - 1, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment); + snprintf (sysgbl, sizeof (sysgbl) - 1, "%s/freem/%s/SYSTEM/globals", LOCALSTATEDIR, fma_environment); + snprintf (usrrtn, sizeof (usrrtn) - 1, "%s/freem/%s/USER/routines", LOCALSTATEDIR, fma_environment); + snprintf (usrgbl, sizeof (usrgbl) - 1, "%s/freem/%s/USER/globals", LOCALSTATEDIR, fma_environment); + snprintf (jnldir, sizeof (jnldir) - 1, "%s/freem/%s/journals", LOCALSTATEDIR, fma_environment); + snprintf (jnlfile, sizeof (jnlfile) - 1, "%s/freem_journal_%s.dat", jnldir, fma_environment); + snprintf (jnlmode, sizeof (jnlmode) - 1, "on"); + snprintf (jnlhostid, sizeof (jnlhostid) - 1, "DEFAULT"); + snprintf (jnlcut, sizeof (jnlcut) - 1, "4294967000"); if (geteuid () != 0) { fprintf (stderr, "fmadm: not superuser\n"); @@ -1585,18 +1597,18 @@ void fm_configure (void) 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); + snprintf (jnlhostid, sizeof (jnlhostid) - 1, "%s:%s", hostid, buf); + snprintf (confbase, sizeof (confbase) - 1, "%s/freem", SYSCONFDIR); + snprintf (envbase, sizeof (envbase) - 1, "%s/freem/%s", SYSCONFDIR, fma_environment); + snprintf (nsbase, sizeof (nsbase) - 1, "%s/freem/%s", LOCALSTATEDIR, fma_environment); #if defined(__OS2__) { char srcfile[PATHLEN]; char dstfile[PATHLEN]; - snprintf (srcfile, PATHLEN, "%s/bin/freem.exe", PREFIX); - snprintf (dstfile, PATHLEN, "%s/bin/freemd.exe", PREFIX); + snprintf (srcfile, PATHLEN - 1, "%s/bin/freem.exe", PREFIX); + snprintf (dstfile, PATHLEN - 1, "%s/bin/freemd.exe", PREFIX); unlink (dstfile); @@ -1670,8 +1682,8 @@ void fm_configure (void) } - snprintf (src_dir, 4095, "%s/freem/mlib", DATADIR); - snprintf (dest_dir, 4095, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment); + snprintf (src_dir, sizeof (src_dir) - 1, "%s/freem/mlib", DATADIR); + snprintf (dest_dir, sizeof (dest_dir) - 1, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment); if (reconfigure == FALSE) { fprintf (stderr, "fmadm: populating new environment '%s'\n", fma_environment); @@ -1680,27 +1692,27 @@ void fm_configure (void) fprintf (stderr, "fmadm: upgrading environment '%s'\n", fma_environment); } - snprintf (buf, 4095, "%s/freem/%s/SYSTEM", LOCALSTATEDIR, fma_environment); + snprintf (buf, sizeof (buf) - 1, "%s/freem/%s/SYSTEM", LOCALSTATEDIR, fma_environment); mkdir (buf, 0775); set_permissions (buf, username, groupname, 0775); - snprintf (buf, 4095, "%s/freem/%s/USER", LOCALSTATEDIR, fma_environment); + snprintf (buf, sizeof (buf) - 1, "%s/freem/%s/USER", LOCALSTATEDIR, fma_environment); mkdir (buf, 0775); set_permissions (buf, username, groupname, 0775); - snprintf (buf, 4095, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment); + snprintf (buf, sizeof (buf) - 1, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment); mkdir (buf, 0775); set_permissions (buf, username, groupname, 0775); - snprintf (buf, 4095, "%s/freem/%s/USER/globals", LOCALSTATEDIR, fma_environment); + snprintf (buf, sizeof (buf) - 1, "%s/freem/%s/USER/globals", LOCALSTATEDIR, fma_environment); mkdir (buf, 0775); set_permissions (buf, username, groupname, 0775); - snprintf (buf, 4095, "%s/freem/%s/SYSTEM/globals", LOCALSTATEDIR, fma_environment); + snprintf (buf, sizeof (buf) - 1, "%s/freem/%s/SYSTEM/globals", LOCALSTATEDIR, fma_environment); mkdir (buf, 0775); set_permissions (buf, username, groupname, 0775); - snprintf (buf, 4095, "%s/freem/%s/USER/routines", LOCALSTATEDIR, fma_environment); + snprintf (buf, sizeof (buf) - 1, "%s/freem/%s/USER/routines", LOCALSTATEDIR, fma_environment); mkdir (buf, 0775); set_permissions (buf, username, groupname, 0775); @@ -1717,8 +1729,8 @@ void fm_configure (void) if ((strcmp (ent->d_name, ".") != 0) && (strcmp (ent->d_name, "..") != 0)) { - snprintf (infile, 4095, "%s/%s", src_dir, ent->d_name); - snprintf (outfile, 4095, "%s/%s", dest_dir, ent->d_name); + snprintf (infile, sizeof (infile) - 1, "%s/%s", src_dir, ent->d_name); + snprintf (outfile, sizeof (outfile) - 1, "%s/%s", dest_dir, ent->d_name); if (stat (outfile, &etcstat) == 0) { unlink (outfile); @@ -1748,27 +1760,25 @@ void fm_configure (void) fprintf (stderr, "Creating %s... ", env_config_file); - snprintf (buf, 4095, "[%s]", fma_environment); + snprintf (buf, sizeof (buf) - 1, "[%s]", fma_environment); fm_write (fp, buf); - snprintf (buf, 4095, "user=%s", env_user); + snprintf (buf, sizeof (buf) - 1, "user=%s", env_user); fm_write (fp, buf); - snprintf (buf, 4095, "group=%s", env_group); + snprintf (buf, sizeof (buf) - 1, "group=%s", env_group); fm_write (fp, buf); - snprintf (buf, 4095, "enabled=%s", env_enabled); + snprintf (buf, sizeof (buf) - 1, "enabled=%s", env_enabled); fm_write (fp, buf); - snprintf (buf, 4095, "env_path=%s/freem/%s", LOCALSTATEDIR, fma_environment); + snprintf (buf, sizeof (buf) - 1, "env_path=%s/freem/%s", LOCALSTATEDIR, fma_environment); fm_write (fp, buf); fclose (fp); fprintf (stderr, "[OK]\n"); } else { - char modtmp[255]; - fprintf (stderr, "\nUpdating %s: \n", env_config_file); update_conf (env_config_file, fma_environment, "user", env_user); @@ -1781,46 +1791,46 @@ void fm_configure (void) fprintf (stderr, "Creating %s... ", config_file); - snprintf (buf, 4095, "[SYSTEM]"); + snprintf (buf, sizeof (buf) - 1, "[SYSTEM]"); fm_write (fp, buf); - snprintf (buf, 4095, "root=%s/freem/%s/SYSTEM", LOCALSTATEDIR, fma_environment); + snprintf (buf, sizeof (buf) - 1, "root=%s/freem/%s/SYSTEM", LOCALSTATEDIR, fma_environment); fm_write (fp, buf); - snprintf (buf, 4095, "routines_path=%s", sysrtn); + snprintf (buf, sizeof (buf) - 1, "routines_path=%s", sysrtn); fm_write (fp, buf); - snprintf (buf, 4095, "globals_path=%s", sysgbl); + snprintf (buf, sizeof (buf) - 1, "globals_path=%s", sysgbl); fm_write (fp, buf); - snprintf (buf, 4095, "journal_file=%s", jnlfile); + snprintf (buf, sizeof (buf) - 1, "journal_file=%s", jnlfile); fm_write (fp, buf); - snprintf (buf, 4095, "journal_mode=%s", jnlmode); + snprintf (buf, sizeof (buf) - 1, "journal_mode=%s", jnlmode); fm_write (fp, buf); - snprintf (buf, 4095, "journal_host_id=%s", jnlhostid); + snprintf (buf, sizeof (buf) - 1, "journal_host_id=%s", jnlhostid); fm_write (fp, buf); - snprintf (buf, 4095, "journal_cut_threshold=%s", jnlcut); + snprintf (buf, sizeof (buf) - 1, "journal_cut_threshold=%s", jnlcut); fm_write (fp, buf); - snprintf (buf, 4095, "zdate_format=%%x"); + snprintf (buf, sizeof (buf) - 1, "zdate_format=%%x"); fm_write (fp, buf); - snprintf (buf, 4095, "ztime_format=%%X"); + snprintf (buf, sizeof (buf) - 1, "ztime_format=%%X"); fm_write (fp, buf); - snprintf (buf, 4095, "\n[USER]"); + snprintf (buf, sizeof (buf) - 1, "\n[USER]"); fm_write (fp, buf); - snprintf (buf, 4095, "root=%s/freem/%s/USER", LOCALSTATEDIR, fma_environment); + snprintf (buf, sizeof (buf) - 1, "root=%s/freem/%s/USER", LOCALSTATEDIR, fma_environment); fm_write (fp, buf); - snprintf (buf, 4095, "routines_path=%s", usrrtn); + snprintf (buf, sizeof (buf) - 1, "routines_path=%s", usrrtn); fm_write (fp, buf); - snprintf (buf, 4095, "globals_path=%s", usrgbl); + snprintf (buf, sizeof (buf) - 1, "globals_path=%s", usrgbl); fm_write (fp, buf); fclose (fp); @@ -1836,7 +1846,7 @@ void fm_configure (void) /* existing configuration */ fprintf (stderr, "\nUpdating environment configuration for %s:\n", fma_environment); - snprintf (buf, 4095, "%s/freem/%s/SYSTEM", LOCALSTATEDIR, fma_environment); + snprintf (buf, sizeof (buf) - 1, "%s/freem/%s/SYSTEM", LOCALSTATEDIR, fma_environment); update_conf (config_file, "SYSTEM", "root", buf); update_conf (config_file, "SYSTEM", "routines_path", sysrtn); update_conf (config_file, "SYSTEM", "globals_path", sysgbl); @@ -1845,14 +1855,14 @@ void fm_configure (void) update_conf (config_file, "SYSTEM", "journal_host_id", tmpsd); update_conf (config_file, "SYSTEM", "journal_cut_threshold", jnlcut); - snprintf (buf, 4095, "%%x"); + snprintf (buf, sizeof (buf) - 1, "%%x"); update_conf (config_file, "SYSTEM", "zdate_format", buf); - snprintf (buf, 4095, "%%X"); + snprintf (buf, sizeof (buf) - 1, "%%X"); update_conf (config_file, "SYSTEM", "ztime_format", buf); /* USER */ - snprintf (buf, 4095, "%s/freem/%s/USER", LOCALSTATEDIR, fma_environment); + snprintf (buf, sizeof (buf) - 1, "%s/freem/%s/USER", LOCALSTATEDIR, fma_environment); update_conf (config_file, "USER", "root", buf); update_conf (config_file, "USER", "routines_path", usrrtn); update_conf (config_file, "USER", "globals_path", usrgbl);