Diff for /freem/src/fmadm.c between versions 1.17 and 1.19

version 1.17, 2025/03/30 01:36:58 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   *   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   *   Make it easier to bring back fma_gedit, fix double-free in global handler, limit $CHAR to 7-bit ASCII
  *   *
Line 64 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 1055  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 1093  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 1110  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 1134  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 1150  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 1199  void fm_configure (void) Line 1232  void fm_configure (void)
     /* 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 1329  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");
   
 /*  /*

Removed from v.1.17  
changed lines
  Added in v.1.19


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