Diff for /freem/src/fmadm.c between versions 1.27 and 1.38

version 1.27, 2025/04/02 15:36:25 version 1.38, 2025/04/15 02:24:43
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.38  2025/04/15 02:24:43  snw
    *   Improve FreeM logging capabilities
    *
    *   Revision 1.37  2025/04/14 19:20:20  snw
    *   Create LOCALSTATEDIR during fmadm configure if needed
    *
    *   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
    *
    *   Revision 1.28  2025/04/02 19:59:38  snw
    *   Automatically modify env.conf from fmadm reconfigure
    *
  *   Revision 1.27  2025/04/02 15:36:25  snw   *   Revision 1.27  2025/04/02 15:36:25  snw
  *   Do extensive result checking for environment stop/start/restart in fmadm   *   Do extensive result checking for environment stop/start/restart in fmadm
  *   *
Line 104 Line 137
 #include <unistd.h>  #include <unistd.h>
 #include <errno.h>  #include <errno.h>
 #include <ctype.h>  #include <ctype.h>
   #if defined(__OS2__)
   # include <os2.h>
   #endif
 #include "config.h"  #include "config.h"
 #include "transact.h"  #include "transact.h"
 #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 171  extern char config_file[4096]; Line 203  extern char config_file[4096];
 extern char env_config_file[4096];  extern char env_config_file[4096];
 extern char env_user[255];  extern char env_user[255];
 extern char env_group[255];  extern char env_group[255];
   extern char env_enabled[10];
   
 int fm_shell(void);  int fm_shell(void);
 void fm_checkperms(void);  void fm_checkperms(void);
Line 201  int main (int argc, char **argv) Line 234  int main (int argc, char **argv)
     short got_action = FALSE;      short got_action = FALSE;
     short got_object = FALSE;      short got_object = FALSE;
   
       strcpy (env_enabled, "true");
   
     /* snprintf (config_file, 4096, "%s/freem.conf", SYSCONFDIR); */      /* snprintf (config_file, 4096, "%s/freem.conf", SYSCONFDIR); */
   
Line 287  int main (int argc, char **argv) Line 321  int main (int argc, char **argv)
                     base_arg++;                      base_arg++;
                                           
                     break;                      break;
   
                   case 'E':
                       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_enabled[k++] = argv[i][j];
                       }
                       env_enabled[k] = '\0';
   
                       if ((strcmp (env_enabled, "true") != 0) && (strcmp (env_enabled, "false") != 0)) {
                           fprintf (stderr, "fmadm:  -E (environment enabled) option must be either 'true' or 'false'\n");
                           fmadm_usage ();
                           exit (1);
                       }
                       
                       base_arg++;
                       
                       break;
                       
                                           
                 case 'n':                  case 'n':
                     if (argv[i][2] != '=') {                      if (argv[i][2] != '=') {
Line 312  int main (int argc, char **argv) Line 371  int main (int argc, char **argv)
           
     if (obj != OBJ_DAEMON) {      if (obj != OBJ_DAEMON) {
         if (strlen (env_user) == 0) {          if (strlen (env_user) == 0) {
             snprintf (env_user, 6, "freem");              snprintf (env_user, sizeof (env_user) - 1, "freem");
         }          }
                   
         if (strlen (env_group) == 0) {          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_environment) snprintf (fma_environment, sizeof (fma_environment) - 1, "DEFAULT");
         if (!fma_explicit_namespace) snprintf (fma_namespace, 4096, "SYSTEM");          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]);      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]);
Line 564  int fm_shell (void) Line 623  int fm_shell (void)
     char *cmdt = (char *) malloc (65535 * sizeof (char));      char *cmdt = (char *) malloc (65535 * sizeof (char));
     char *result = (char *) malloc (65535 * sizeof (char));      char *result = (char *) malloc (65535 * sizeof (char));
   
     /*      obj = 0;
     strcpy (fma_namespace, "SYSTEM");  
     set_namespace (fma_namespace, FALSE);  
     */  
           
     snprintf (fma_prompt, STRLEN - 1, "fmadm [%s]> ", fma_namespace);      snprintf (fma_prompt, STRLEN - 1, "fmadm [%s]> ", fma_namespace);
           
Line 672  int fm_shell (void) Line 728  int fm_shell (void)
   
         i = 0;          i = 0;
         while ((result = strtok (NULL, " ")) != NULL) {          while ((result = strtok (NULL, " ")) != NULL) {
             //    printf ("%d = %s\n", i, result);  
             strcpy (args[i++], result);              strcpy (args[i++], result);
         }          }
   
Line 882  void fmadm_exit (int retval) Line 937  void fmadm_exit (int retval)
 int fmadm_usage (void)  int fmadm_usage (void)
 {  {
   
     fprintf (stdout, "\nusage:  fmadm <action> <object> [-e=<environment] [-n=<namespace>] [OPTIONS]\n");      fprintf (stdout, "\nusage:  fmadm <action> <object> [-e=<environment] [-n=<namespace>] [-u=<user>] [-g=<group>] [-E=true|false] [OPTIONS]\n");
     fprintf (stdout, "        fmadm configure\n");      fprintf (stdout, "        fmadm configure\n");
     fprintf (stdout, "        fmadm reconfigure\n");      fprintf (stdout, "        fmadm reconfigure\n");
     /* fprintf (stdout, "        fmadm checkperms\n\n"); */  
           
     fprintf (stdout, "        <action> can be one of:\n");      fprintf (stdout, "        <action> can be one of:\n");
     fprintf (stdout, "            list, examine, verify, compact, repair, create, remove,\n");      fprintf (stdout, "            list, examine, verify, compact, repair, create, remove,\n");
     fprintf (stdout, "            import, export, backup, restore, migrate, edit, start,\n");      fprintf (stdout, "            import, export, backup, restore, migrate, edit, start,\n");
     fprintf (stdout, "            stop, restart\n\n");      fprintf (stdout, "            stop, restart, status\n\n");
   
     fprintf (stdout, "        <object> can be one of:\n");      fprintf (stdout, "        <object> can be one of:\n");
     fprintf (stdout, "            lock, journal, namespace, global, routine, job,\n");      fprintf (stdout, "            lock, journal, namespace, global, routine, job,\n");
Line 1133  long fm_get_pid (char *env) Line 1187  long fm_get_pid (char *env)
 {  {
     char pid_file[4096];      char pid_file[4096];
     char tmp_pid[255];      char tmp_pid[255];
     long res;  
       
     FILE *fp;      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 ((fp = fopen (pid_file, "r")) != NULL) {
         if (fgets (tmp_pid, 255, fp)) {          if (fgets (tmp_pid, 255, fp)) {
Line 1160  int fm_validate_environment (char *env) Line 1212  int fm_validate_environment (char *env)
     char line[255];      char line[255];
     char chkline[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) {      if ((fp = fopen (env_config_file, "r")) == NULL) {
         fprintf (stderr, "fmadm:  could not open %s [%s]\n", env_config_file, strerror (errno));          fprintf (stderr, "fmadm:  could not open %s [%s]\n", env_config_file, strerror (errno));
Line 1178  int fm_validate_environment (char *env) Line 1230  int fm_validate_environment (char *env)
     return FALSE;      return FALSE;
 }  }
   
 int fm_start_environment (char *env, char *e_user, char *e_grp)  int fm_start_environment (char *env)
 {  {
     char basecmd[255];      char basecmd[255];
     char cmd[4096];          char cmd[4096];    
Line 1188  int fm_start_environment (char *env, cha Line 1240  int fm_start_environment (char *env, cha
     }      }
           
 #if !defined(__OS2__)  #if !defined(__OS2__)
     snprintf (basecmd, 254, "%s/bin/freem", PREFIX);      snprintf (basecmd, sizeof (basecmd) - 1, "%s/bin/freem", PREFIX);
 #else  #else
     snprintf (basecmd, 254, "%s/bin/freemd.exe", PREFIX);      snprintf (basecmd, sizeof (basecmd) - 1, "%s/bin/freemd.exe", PREFIX);
 #endif  #endif
   
 #if !defined(__OS2__)                      #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  #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  #endif
   
     system (cmd);      system (cmd);
Line 1273  int fm_daemonctl (short action, short ob Line 1325  int fm_daemonctl (short action, short ob
     char *savptr;      char *savptr;
     int result;      int result;
     long epid;      long epid;
       int retval;
         
       retval = 0;
           
     switch (action) {      switch (action) {
         case ACT_START:          case ACT_START:
Line 1308  int fm_daemonctl (short action, short ob Line 1362  int fm_daemonctl (short action, short ob
             if (line[0] == '[') {              if (line[0] == '[') {
                 strncpy (env, &(line[1]), 255);                  strncpy (env, &(line[1]), 255);
                 env[strlen (env) - 2] = '\0';                  env[strlen (env) - 2] = '\0';
                 snprintf (tmps, 255, "%s,", env);                  snprintf (tmps, sizeof (tmps) - 1, "%s,", env);
                 strncat (envlist, tmps, BIGSTR - 1);                  strncat (envlist, tmps, BIGSTR - 1);
             }              }
         }          }
Line 1352  int fm_daemonctl (short action, short ob Line 1406  int fm_daemonctl (short action, short ob
             switch (action) {              switch (action) {
                                   
                 case ACT_START:                  case ACT_START:
                     result = fm_start_environment (cur_env, e_user, e_grp);                      result = fm_start_environment (cur_env);
                     if (result == TRUE) {                      if (result == TRUE) {
                         fprintf (stderr, "[OK]\n");                          fprintf (stderr, "[OK]\n");
                     }                      }
Line 1368  int fm_daemonctl (short action, short ob Line 1422  int fm_daemonctl (short action, short ob
                     }                      }
                     else {                      else {
                         fprintf (stderr, "[FAIL]\n");                          fprintf (stderr, "[FAIL]\n");
                           retval++;
                     }                                          }                    
                     break;                      break;
   
                 case ACT_RESTART:                  case ACT_RESTART:
                     if (fm_stop_environment (cur_env) == TRUE) {                      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) {                          if (result == TRUE) {
                             fprintf (stderr, "[OK]\n");                              fprintf (stderr, "[OK]\n");
                         }                          }
                         else {                          else {
                             fprintf (stderr, "[FAIL]\n");                              fprintf (stderr, "[FAIL]\n");
                               retval++;
                         }                                                  }                        
                     }                      }
                     else {                      else {
                         fprintf (stderr, "[FAIL]\n");                          fprintf (stderr, "[FAIL]\n");
                           retval++;
                     }                                             }                       
   
                     break;                      break;
Line 1390  int fm_daemonctl (short action, short ob Line 1447  int fm_daemonctl (short action, short ob
                 case ACT_STATUS:                  case ACT_STATUS:
                     epid = fm_get_pid (cur_env);                      epid = fm_get_pid (cur_env);
                     if (epid > -1) {                      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 {                      else {
                         fprintf (stderr, " - %s environment daemon does not appear to be running\n", cur_env);                          fprintf (stderr, " - %s environment daemon does not appear to be running\n", cur_env);
Line 1403  int fm_daemonctl (short action, short ob Line 1460  int fm_daemonctl (short action, short ob
     } while ((cur_env = strtok_r (NULL, ",", &savptr)) != NULL);      } while ((cur_env = strtok_r (NULL, ",", &savptr)) != NULL);
   
     free (envlist);      free (envlist);
     exit (0);      exit (retval);
           
 } /* fm_daemonctl() */  } /* fm_daemonctl() */
   
Line 1416  void fm_checkperms(void) Line 1473  void fm_checkperms(void)
 void fm_reconfigure(void)  void fm_reconfigure(void)
 {  {
     char config_backup[4096];      char config_backup[4096];
     char vers[4096];  
           
     int retval;         int retval;   
           
Line 1425  void fm_reconfigure(void) Line 1481  void fm_reconfigure(void)
         exit (1);          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:  reconfiguring FreeM with system defaults for %s...\n", FREEM_VERSION_CSTR);
     fprintf (stderr, "fmadm:  backing up %s to %s...\t", config_file, config_backup);          fprintf (stderr, "fmadm:  backing up %s to %s...\t", config_file, config_backup);    
   
     retval = rename (config_file, config_backup);  #if !defined(__OS2__)    
       retval = cp (config_backup, config_file);
   #else
       retval = DosCopy (config_file, config_backup, 1);
   #endif    
   
     if (retval == 0) {      if (retval == 0) {
         fprintf (stderr, "[OK]\n");          fprintf (stderr, "[OK]\n");
Line 1447  void fm_reconfigure(void) Line 1507  void fm_reconfigure(void)
           
 } /* fm_reconfigure() */  } /* fm_reconfigure() */
   
   void update_conf (char *file, char *section, char *key, char *new_value)
   {
       char old_value[255];
       char tbuf[255];
   
       snprintf (tbuf, sizeof (tbuf) - 1, "%s.%s", section, key);
           
       read_profile_string (file, section, key, old_value);
       if (strcmp (old_value, new_value) != 0) {
           modify_profile_string (file, section, key, new_value);
           fprintf (stderr, "\t%-40s%-20s -> %s\n", tbuf, old_value, new_value);
       }
       else {
           fprintf (stderr, "\t%-40s%-20s\n", tbuf, "no change");
       }
   }
   
 void fm_configure (void)  void fm_configure (void)
 {  {
     char rundir[4096];      char rundir[4096];
     char varbase[4096];      char varbase[4096];
       char vardir[4096];
     char sysrtn[4096];      char sysrtn[4096];
     char sysgbl[4096];      char sysgbl[4096];
     char usrrtn[4096];      char usrrtn[4096];
Line 1463  void fm_configure (void) Line 1540  void fm_configure (void)
     char jnlhostid[4096];          char jnlhostid[4096];    
     char jnlcut[4096];      char jnlcut[4096];
     char hostid[4096];      char hostid[4096];
       char logdir[4096];
       
     char confbase[4096];      char confbase[4096];
     char envbase[4096];      char envbase[4096];
   
Line 1472  void fm_configure (void) Line 1550  void fm_configure (void)
     char buf[4096];      char buf[4096];
     FILE *fp;      FILE *fp;
   
       int reconfigure = FALSE;
       
     struct stat etcstat;      struct stat etcstat;
     int stat_result;  
   
     DIR *dir;      DIR *dir;
     struct dirent *ent;      struct dirent *ent;
Line 1482  void fm_configure (void) Line 1561  void fm_configure (void)
   
     char *username = env_user;      char *username = env_user;
     char *groupname = env_group;      char *groupname = env_group;
          
 #if !defined(__OS2__)  #if !defined(__OS2__)
       struct group *d_grp;
       struct passwd *d_user;
   
     if (geteuid () != 0) {      if (geteuid () != 0) {
         fprintf (stderr, "fmadm:  not superuser\n");          fprintf (stderr, "fmadm:  not superuser\n");
         exit (1);          exit (1);
     }      }
   
     struct group *d_grp;  
     struct passwd *d_user;  
     gid_t d_gid;  
     uid_t d_uid;  
   
     if ((d_grp = getgrnam (groupname)) == NULL) {      if ((d_grp = getgrnam (groupname)) == NULL) {
         fprintf (stderr, "fmadm:  '%s' group must exist before configuring\n", groupname);          fprintf (stderr, "fmadm:  '%s' group must exist before configuring\n", groupname);
         exit (1);          exit (1);
     }      }
     d_gid = d_grp->gr_gid;  
   
     if ((d_user = getpwnam (username)) == NULL) {      if ((d_user = getpwnam (username)) == NULL) {
         fprintf (stderr, "fmadm:  '%s' user must exist before configuring\n", username);          fprintf (stderr, "fmadm:  '%s' user must exist before configuring\n", username);
         exit (1);          exit (1);
     }      }
     d_uid = d_user->pw_uid;  
 #endif      #endif    
           
     snprintf (varbase, 4095, "%s/freem", LOCALSTATEDIR);      snprintf (logdir, sizeof (logdir) - 1, "/var/log/freem");
     snprintf (rundir, 4095, "%s/freem/run", LOCALSTATEDIR);      snprintf (vardir, sizeof (vardir) - 1, "%s", LOCALSTATEDIR);
     snprintf (sysrtn, 4095, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment);      snprintf (varbase, sizeof (varbase) - 1, "%s/freem", LOCALSTATEDIR);
     snprintf (sysgbl, 4095, "%s/freem/%s/SYSTEM/globals", LOCALSTATEDIR, fma_environment);      snprintf (rundir, sizeof (rundir) - 1, "%s/freem/run", LOCALSTATEDIR);
     snprintf (usrrtn, 4095, "%s/freem/%s/USER/routines", LOCALSTATEDIR, fma_environment);      snprintf (sysrtn, sizeof (sysrtn) - 1, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment);
     snprintf (usrgbl, 4095, "%s/freem/%s/USER/globals", LOCALSTATEDIR, fma_environment);      snprintf (sysgbl, sizeof (sysgbl) - 1, "%s/freem/%s/SYSTEM/globals", LOCALSTATEDIR, fma_environment);
     snprintf (jnldir, 4095, "%s/freem/%s/journals", LOCALSTATEDIR, fma_environment);      snprintf (usrrtn, sizeof (usrrtn) - 1, "%s/freem/%s/USER/routines", LOCALSTATEDIR, fma_environment);
     snprintf (jnlfile, 4095, "%s/freem_journal_%s.dat", jnldir, fma_environment);      snprintf (usrgbl, sizeof (usrgbl) - 1, "%s/freem/%s/USER/globals", LOCALSTATEDIR, fma_environment);
     snprintf (jnlmode, 3, "on");      snprintf (jnldir, sizeof (jnldir) - 1, "%s/freem/%s/journals", LOCALSTATEDIR, fma_environment);
     snprintf (jnlhostid, 4095, "DEFAULT");      snprintf (jnlfile, sizeof (jnlfile) - 1, "%s/freem_journal_%s.dat", jnldir, fma_environment);
     snprintf (jnlcut, 4095, "4294967000");      snprintf (jnlmode, sizeof (jnlmode) - 1, "on");
       snprintf (jnlhostid, sizeof (jnlhostid) - 1, "DEFAULT");
       snprintf (jnlcut, sizeof (jnlcut) - 1, "4294967000");
           
     if (geteuid () != 0) {      if (geteuid () != 0) {
         fprintf (stderr, "fmadm:  not superuser\n");          fprintf (stderr, "fmadm:  not superuser\n");
Line 1525  void fm_configure (void) Line 1601  void fm_configure (void)
     }      }
           
     if (file_exists (config_file)) {      if (file_exists (config_file)) {
         fprintf (stderr, "fmadm:  '%s' already exists; running fmadm reconfigure instead\n", config_file);          reconfigure = TRUE;
         fm_reconfigure ();  
         return;  
     }      }
       
     gethostname (hostid, 4095);      gethostname (hostid, 4095);
     uuid_v4 (buf);      uuid_v4 (buf);
   
     snprintf (jnlhostid, 4095, "%s:%s", hostid, buf);      snprintf (jnlhostid, sizeof (jnlhostid) - 1, "%s:%s", hostid, buf);
     snprintf (confbase, 4095, "%s/freem", SYSCONFDIR);      snprintf (confbase, sizeof (confbase) - 1, "%s/freem", SYSCONFDIR);
     snprintf (envbase, 4095, "%s/freem/%s", SYSCONFDIR, fma_environment);       snprintf (envbase, sizeof (envbase) - 1, "%s/freem/%s", SYSCONFDIR, fma_environment); 
     snprintf (nsbase, 4095, "%s/freem/%s", LOCALSTATEDIR, fma_environment);      snprintf (nsbase, sizeof (nsbase) - 1, "%s/freem/%s", LOCALSTATEDIR, fma_environment);
   
 #if defined(__OS2__)  #if defined(__OS2__)
     {      {
         char srcfile[PATHLEN];          char srcfile[PATHLEN];
         char dstfile[PATHLEN];                  char dstfile[PATHLEN];        
                   
         snprintf (srcfile, PATHLEN, "%s/bin/freem.exe", PREFIX);          snprintf (srcfile, PATHLEN - 1, "%s/bin/freem.exe", PREFIX);
         snprintf (dstfile, PATHLEN, "%s/bin/freemd.exe", PREFIX);          snprintf (dstfile, PATHLEN - 1, "%s/bin/freemd.exe", PREFIX);
   
         unlink (dstfile);          unlink (dstfile);
                   
Line 1557  void fm_configure (void) Line 1631  void fm_configure (void)
   
         chmod (dstfile, 0755);          chmod (dstfile, 0755);
     }      }
 #else  
     fprintf (stderr, "fmadm:  not running on OS/2\n");  
 #endif  #endif
       
     printf ("\nFreeM Initial Configuration\n");  
     printf ("---------------------------\n\n");  
   
     printf ("This utility will create the initial configuration file for ");      if (reconfigure == FALSE) {
     printf ("FreeM environment '%s' (owned by %s:%s) in '%s'.\n\n", fma_environment, username, groupname, config_file);              printf ("\nFreeM Initial Environment Configuration\n");
           printf ("---------------------------------------\n\n");
   
           printf ("This utility will create the initial configuration files for ");
           printf ("FreeM environment '%s' (owned by %s:%s) in '%s'.\n\n", fma_environment, username, groupname, config_file);    
       }
       else {
           printf ("\nFreeM Environment Upgrade/Reconfiguration\n");
           printf ("-----------------------------------------\n\n");
   
           printf ("This utility will update the configuration files for ");
           printf ("FreeM environment '%s' (owned by %s:%s) in '%s'.\n\n", fma_environment, username, groupname, config_file);
       }
           
     /* check for existence of needed directories */      /* check for existence of needed directories */
       if (stat (logdir, &etcstat) == -1) {
           fprintf (stderr, "fmadm:  creating %s [logdir]\n", logdir);
           mkdir (logdir, 0775);
           set_permissions (logdir, username, groupname, 0775);
       }
   
     if (stat (SYSCONFDIR, &etcstat) == -1) {      if (stat (SYSCONFDIR, &etcstat) == -1) {
         fprintf (stderr, "fmadm:  creating %s [SYSCONFDIR]\n", SYSCONFDIR);          fprintf (stderr, "fmadm:  creating %s [SYSCONFDIR]\n", SYSCONFDIR);
         mkdir (SYSCONFDIR, 0775);          mkdir (SYSCONFDIR, 0775);
Line 1580  void fm_configure (void) Line 1667  void fm_configure (void)
         set_permissions (confbase, username, groupname, 0775);          set_permissions (confbase, username, groupname, 0775);
     }      }
   
       if (stat (vardir, &etcstat) == -1) {
           fprintf (stderr, "fmadm:  creating %s [vardir]\n", vardir);
           mkdir (vardir, 0775);
           set_permissions (vardir, username, groupname, 0775);
       }    
       
     if (stat (varbase, &etcstat) == -1) {      if (stat (varbase, &etcstat) == -1) {
         fprintf (stderr, "fmadm:  creating %s [varbase]\n", varbase);          fprintf (stderr, "fmadm:  creating %s [varbase]\n", varbase);
         mkdir (varbase, 0775);          mkdir (varbase, 0775);
Line 1611  void fm_configure (void) Line 1704  void fm_configure (void)
     }      }
   
           
     snprintf (src_dir, 4095, "%s/freem/mlib", DATADIR);      snprintf (src_dir, sizeof (src_dir) - 1, "%s/freem/mlib", DATADIR);
     snprintf (dest_dir, 4095, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment);      snprintf (dest_dir, sizeof (dest_dir) - 1, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment);
       
     fprintf (stderr, "fmadm:  populating new environment '%s'\n", fma_environment);      if (reconfigure == FALSE) {
           fprintf (stderr, "fmadm:  populating new environment '%s'\n", fma_environment);
       }
       else {
           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);      mkdir (buf, 0775);
     set_permissions (buf, username, groupname, 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);      mkdir (buf, 0775);
     set_permissions (buf, username, groupname, 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);      mkdir (buf, 0775);
     set_permissions (buf, username, groupname, 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);      mkdir (buf, 0775);
     set_permissions (buf, username, groupname, 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);      mkdir (buf, 0775);
     set_permissions (buf, username, groupname, 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);      mkdir (buf, 0775);
     set_permissions (buf, username, groupname, 0775);      set_permissions (buf, username, groupname, 0775);
           
Line 1653  void fm_configure (void) Line 1751  void fm_configure (void)
                   
         if ((strcmp (ent->d_name, ".") != 0) && (strcmp (ent->d_name, "..") != 0)) {                     if ((strcmp (ent->d_name, ".") != 0) && (strcmp (ent->d_name, "..") != 0)) {           
                           
             snprintf (infile, 4095, "%s/%s", src_dir, ent->d_name);              snprintf (infile, sizeof (infile) - 1, "%s/%s", src_dir, ent->d_name);
             snprintf (outfile, 4095, "%s/%s", dest_dir, ent->d_name);              snprintf (outfile, sizeof (outfile) - 1, "%s/%s", dest_dir, ent->d_name);
   
             if (stat (outfile, &etcstat) == 0) {              if (stat (outfile, &etcstat) == 0) {
                 unlink (outfile);                  unlink (outfile);
Line 1679  void fm_configure (void) Line 1777  void fm_configure (void)
                   
     }      }
   
     fp = fopen (env_config_file, "a+");      if (fm_validate_environment (fma_environment) == FALSE) {
           fp = fopen (env_config_file, "a+");
     fprintf (stderr, "Creating %s... ", env_config_file);          
           fprintf (stderr, "Creating %s... ", env_config_file);
     snprintf (buf, 4095, "[%s]", fma_environment);          
     fm_write (fp, buf);          snprintf (buf, sizeof (buf) - 1, "[%s]", fma_environment);
           fm_write (fp, buf);
           
           snprintf (buf, sizeof (buf) - 1, "user=%s", env_user);
           fm_write (fp, buf);
           
           snprintf (buf, sizeof (buf) - 1, "group=%s", env_group);
           fm_write (fp, buf);
           
           snprintf (buf, sizeof (buf) - 1, "enabled=%s", env_enabled);
           fm_write (fp, buf);
           
           snprintf (buf, sizeof (buf) - 1, "env_path=%s/freem/%s", LOCALSTATEDIR, fma_environment);
           fm_write (fp, buf);
           
           fclose (fp);
           fprintf (stderr, "[OK]\n");
       }
       else {
           fprintf (stderr, "\nUpdating %s: \n", env_config_file);
   
     snprintf (buf, 4095, "user=%s", env_user);          update_conf (env_config_file, fma_environment, "user", env_user);
     fm_write (fp, buf);          update_conf (env_config_file, fma_environment, "group", env_group);
               update_conf (env_config_file, fma_environment, "enabled", env_enabled);
     snprintf (buf, 4095, "group=%s", env_group);      }
     fm_write (fp, buf);  
   
     snprintf (buf, 4095, "enabled=true");      if (reconfigure == FALSE) {
     fm_write (fp, buf);          fp = fopen (config_file, "a+");
               
     snprintf (buf, 4095, "env_path=%s/freem/%s", LOCALSTATEDIR, fma_environment);          fprintf (stderr, "Creating %s... ", config_file); 
     fm_write (fp, buf);          
               snprintf (buf, sizeof (buf) - 1, "[SYSTEM]");
     fclose (fp);          fm_write (fp, buf);
     fprintf (stderr, "[OK]\n");          
              snprintf (buf, sizeof (buf) - 1, "root=%s/freem/%s/SYSTEM", LOCALSTATEDIR, fma_environment);
     fp = fopen (config_file, "a+");          fm_write (fp, buf);
               
     fprintf (stderr, "Creating %s... ", config_file);           snprintf (buf, sizeof (buf) - 1, "routines_path=%s", sysrtn);
           fm_write (fp, buf);
           
           snprintf (buf, sizeof (buf) - 1, "globals_path=%s", sysgbl);
           fm_write (fp, buf);
           
           snprintf (buf, sizeof (buf) - 1, "journal_file=%s", jnlfile);
           fm_write (fp, buf);
           
           snprintf (buf, sizeof (buf) - 1, "journal_mode=%s", jnlmode);
           fm_write (fp, buf);
           
           snprintf (buf, sizeof (buf) - 1, "journal_host_id=%s", jnlhostid);
           fm_write (fp, buf);
           
           snprintf (buf, sizeof (buf) - 1, "journal_cut_threshold=%s", jnlcut);
           fm_write (fp, buf);
           
           snprintf (buf, sizeof (buf) - 1, "zdate_format=%%x");
           fm_write (fp, buf);
           
           snprintf (buf, sizeof (buf) - 1, "ztime_format=%%X");
           fm_write (fp, buf);
           
           snprintf (buf, sizeof (buf) - 1, "\n[USER]");
           fm_write (fp, buf);
           
           snprintf (buf, sizeof (buf) - 1, "root=%s/freem/%s/USER", LOCALSTATEDIR, fma_environment);
           fm_write (fp, buf);
           
           snprintf (buf, sizeof (buf) - 1, "routines_path=%s", usrrtn);
           fm_write (fp, buf);
           
           snprintf (buf, sizeof (buf) - 1, "globals_path=%s", usrgbl);
           fm_write (fp, buf);
           
           fclose (fp);
           set_permissions (config_file, username, groupname, 0755);
           fprintf (stderr, "[OK]\n");
           
     snprintf (buf, 4095, "[SYSTEM]");          printf ("FreeM initial configuration is complete.\n\n");
     fm_write (fp, buf);      }
       else {
     snprintf (buf, 4095, "root=%s/freem/%s/SYSTEM", LOCALSTATEDIR, fma_environment);          char tmpsd[255];
     fm_write (fp, buf);          read_profile_string (config_file, "SYSTEM", "journal_host_id", tmpsd);
           
     snprintf (buf, 4095, "routines_path=%s", sysrtn);          /* existing configuration */
     fm_write (fp, buf);          fprintf (stderr, "\nUpdating environment configuration for %s:\n", fma_environment);
   
     snprintf (buf, 4095, "globals_path=%s", sysgbl);  
     fm_write (fp, buf);  
   
     snprintf (buf, 4095, "journal_file=%s", jnlfile);  
     fm_write (fp, buf);  
   
     snprintf (buf, 4095, "journal_mode=%s", jnlmode);  
     fm_write (fp, buf);  
   
     snprintf (buf, 4095, "journal_host_id=%s", jnlhostid);          snprintf (buf, sizeof (buf) - 1, "%s/freem/%s/SYSTEM", LOCALSTATEDIR, fma_environment);
     fm_write (fp, buf);          update_conf (config_file, "SYSTEM", "root", buf);
           update_conf (config_file, "SYSTEM", "routines_path", sysrtn);       
           update_conf (config_file, "SYSTEM", "globals_path", sysgbl);
           update_conf (config_file, "SYSTEM", "journal_file", jnlfile);        
           update_conf (config_file, "SYSTEM", "journal_mode", jnlmode);
           update_conf (config_file, "SYSTEM", "journal_host_id", tmpsd);
           update_conf (config_file, "SYSTEM", "journal_cut_threshold", jnlcut);
   
     snprintf (buf, 4095, "journal_cut_threshold=%s", jnlcut);          snprintf (buf, sizeof (buf) - 1, "%%x");
     fm_write (fp, buf);          update_conf (config_file, "SYSTEM", "zdate_format", buf);
           
           snprintf (buf, sizeof (buf) - 1, "%%X");
           update_conf (config_file, "SYSTEM", "ztime_format", buf);
   
     snprintf (buf, 4095, "zdate_format=%%x");          /* USER */        
     fm_write (fp, buf);          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);
   
     snprintf (buf, 4095, "ztime_format=%%X");      }
     fm_write (fp, buf);  
           
     snprintf (buf, 4095, "\n[USER]");  
     fm_write (fp, buf);  
   
     snprintf (buf, 4095, "root=%s/freem/%s/USER", LOCALSTATEDIR, fma_environment);  
     fm_write (fp, buf);  
   
     snprintf (buf, 4095, "routines_path=%s", usrrtn);  
     fm_write (fp, buf);  
   
     snprintf (buf, 4095, "globals_path=%s", usrgbl);  
     fm_write (fp, buf);  
                   
     fclose (fp);      printf ("\n\nUSER globals:                   %s\n", usrgbl);
     set_permissions (config_file, username, groupname, 0755);      printf ("USER routines:                  %s\n", usrrtn);
     fprintf (stderr, "[OK]\n");      printf ("SYSTEM globals:                 %s\n", sysgbl);
       printf ("SYSTEM routines:                %s\n", sysrtn);
     printf ("FreeM initial configuration is complete.\n\n");      printf ("After-image journal:            %s [%s]\n", jnlfile, jnlmode);
       printf ("Journal cut threshold:          %s bytes\n", jnlcut);
     printf (" USER globals:                   %s\n", usrgbl);      printf ("Distributed journaling host ID: %s\n", jnlhostid);
     printf (" USER routines:                  %s\n", usrrtn);  
     printf (" SYSTEM globals:                 %s\n", sysgbl);  
     printf (" SYSTEM routines:                %s\n", sysrtn);  
     printf (" After-image journal:            %s [%s]\n", jnlfile, jnlmode);  
     printf (" Journal cut threshold:          %s bytes\n", jnlcut);  
     printf (" Distributed journaling host ID: %s\n", jnlhostid);  
   
       if (reconfigure == TRUE) {
           fprintf (stderr, "\nIf you previously defined environments other than '%s', you should run\n'fmadm reconfigure -e=<environment-name>' on each of them to ensure they have\nthe latest vendor routines and correct, updated settings.\n\n", fma_environment);
       }
           
 } /* fm_configure */  } /* fm_configure */
   

Removed from v.1.27  
changed lines
  Added in v.1.38


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>