|
|
| version 1.1.1.1, 2025/01/19 02:04:04 | version 1.20, 2025/04/01 16:37:12 |
|---|---|
| Line 1 | Line 1 |
| /* | /* |
| * * | * $Id$ |
| * * * | |
| * * * | |
| * *************** | |
| * * * * * | |
| * * MUMPS * | |
| * * * * * | |
| * *************** | |
| * * * | |
| * * * | |
| * * | |
| * | |
| * fmadm.c | |
| * FreeM Administration Tool | * FreeM Administration Tool |
| * | * |
| * | * |
| * Author: Serena Willis <jpw@coherent-logic.com> | * Author: Serena Willis <snw@coherent-logic.com> |
| * Copyright (C) 1998 MUG Deutschland | * Copyright (C) 1998 MUG Deutschland |
| * Copyright (C) 2020, 2023 Coherent Logic Development LLC | * Copyright (C) 2020, 2023, 2025 Coherent Logic Development LLC |
| * | * |
| * | * |
| * This file is part of FreeM. | * This file is part of FreeM. |
| Line 35 | Line 23 |
| * You should have received a copy of the GNU Affero Public License | * You should have received a copy of the GNU Affero Public License |
| * along with FreeM. If not, see <https://www.gnu.org/licenses/>. | * along with FreeM. If not, see <https://www.gnu.org/licenses/>. |
| * | * |
| * $Log$ | |
| * Revision 1.20 2025/04/01 16:37:12 snw | |
| * Configure DEFAULT environment the same as others, and set permissions/ownership directly in fmadm configure. Add env.conf file as a centralized configuration listing all environments. | |
| * | |
| * 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 | |
| * Set file permissions on freemd.exe on OS/2 in fmadm configure | |
| * | |
| * Revision 1.11 2025/03/24 19:25:48 snw | |
| * Make fmadm configure copy freem.exe to freemd.exe for daemon operation on OS/2 systems | |
| * | |
| * Revision 1.10 2025/03/24 19:22:16 snw | |
| * Make fmadm configure copy freem.exe to freemd.exe for daemon operation on OS/2 systems | |
| * | |
| * Revision 1.9 2025/03/24 19:19:42 snw | |
| * Make fmadm configure copy freem.exe to freemd.exe for daemon operation on OS/2 systems | |
| * | |
| * Revision 1.8 2025/03/22 18:43:54 snw | |
| * Make STRLEN 255 chars and add BIGSTR macro for larger buffers | |
| * | |
| * Revision 1.7 2025/03/09 19:14:25 snw | |
| * First phase of REUSE compliance and header reformat | |
| * | |
| * | |
| * SPDX-FileCopyrightText: (C) 2025 Coherent Logic Development LLC | |
| * SPDX-License-Identifier: AGPL-3.0-or-later | |
| **/ | **/ |
| #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 46 | Line 82 |
| #include <stdlib.h> | #include <stdlib.h> |
| #include <unistd.h> | #include <unistd.h> |
| #include <errno.h> | #include <errno.h> |
| #include <ctype.h> | |
| #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 90 extern int read_history (); | Line 131 extern int read_history (); |
| /* namespace configuration */ | /* namespace configuration */ |
| char fma_environment[STRLEN]; | char fma_environment[STRLEN]; |
| char fma_namespace[STRLEN]; | char fma_namespace[STRLEN]; |
| char fma_routine_path[STRLEN]; | char fma_routine_path[PATHLEN]; |
| char fma_global_path[STRLEN]; | char fma_global_path[PATHLEN]; |
| char fma_journal_path[STRLEN]; | char fma_journal_path[PATHLEN]; |
| char fma_pct_global_path[STRLEN]; | char fma_pct_global_path[PATHLEN]; |
| char fma_pct_routine_path[STRLEN]; | char fma_pct_routine_path[PATHLEN]; |
| char fma_journal_cut_threshold[STRLEN]; | char fma_journal_cut_threshold[STRLEN]; |
| char fma_locktab[STRLEN]; | char fma_locktab[PATHLEN]; |
| short fma_base_opt = 1; | short fma_base_opt = 1; |
| short fma_min_args = 2; | short fma_min_args = 2; |
| short fma_explicit_namespace = FALSE; | short fma_explicit_namespace = FALSE; |
| Line 106 short fma_explicit_environment = FALSE; | Line 147 short fma_explicit_environment = FALSE; |
| char obj_str[STRLEN]; | char obj_str[STRLEN]; |
| extern char config_file[4096]; | extern char config_file[4096]; |
| extern char env_config_file[4096]; | |
| extern char env_user[255]; | |
| extern char env_group[255]; | |
| int fm_shell(void); | int fm_shell(void); |
| void fm_checkperms(void); | void fm_checkperms(void); |
| Line 113 void fm_reconfigure(void); | Line 157 void fm_reconfigure(void); |
| void fm_configure(void); | void fm_configure(void); |
| void fm_write (FILE *file, char *buf); | void fm_write (FILE *file, char *buf); |
| int fma_jobs_remove (int optc, char **opts); | int fma_jobs_remove (int optc, char **opts); |
| void set_permissions(char *path, char *user, char *grp, int mode); | |
| int main (int argc, char **argv) | int main (int argc, char **argv) |
| { | { |
| Line 160 int main (int argc, char **argv) | Line 206 int main (int argc, char **argv) |
| if (argv[i][0] == '-') { | if (argv[i][0] == '-') { |
| switch (argv[i][1]) { | switch (argv[i][1]) { |
| case 'u': | |
| 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_user[k++] = argv[i][j]; | |
| } | |
| fma_explicit_environment = TRUE; | |
| base_arg++; | |
| break; | |
| case 'g': | |
| 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_group[k++] = argv[i][j]; | |
| } | |
| fma_explicit_environment = TRUE; | |
| base_arg++; | |
| break; | |
| case 'e': | case 'e': |
| if (argv[i][2] != '=') { | if (argv[i][2] != '=') { |
| Line 200 int main (int argc, char **argv) | Line 283 int main (int argc, char **argv) |
| } | } |
| } | } |
| } | } |
| if (strlen (env_user) == 0) { | |
| fprintf (stderr, "fmadm: assuming user 'freem' for this environment's owner\n"); | |
| snprintf (env_user, 6, "freem"); | |
| } | |
| if (strlen (env_group) == 0) { | |
| fprintf (stderr, "fmadm: assuming group 'freem' for this environment's owner\n"); | |
| snprintf (env_group, 6, "freem"); | |
| } | |
| if (!fma_explicit_environment) snprintf (fma_environment, 4096, "DEFAULT"); | if (!fma_explicit_environment) snprintf (fma_environment, 4096, "DEFAULT"); |
| if (!fma_explicit_namespace) snprintf (fma_namespace, 4096, "SYSTEM"); | if (!fma_explicit_namespace) snprintf (fma_namespace, 4096, "SYSTEM"); |
| snprintf (config_file, 4096, "%s/freem/%s/freem.conf", SYSCONFDIR, fma_environment); | snprintf (config_file, 4096, "%s/freem/%s/freem.conf", SYSCONFDIR, fma_environment); |
| snprintf (env_config_file, 4096, "%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]); |
| exit(1); | exit(1); |
| Line 554 int fm_shell (void) | Line 649 int fm_shell (void) |
| cmdt = strtok (fmarl_buf, " "); | cmdt = strtok (fmarl_buf, " "); |
| if (cmdt == (char *) NULL) continue; | |
| for (i = 0; i < strlen (cmdt); i++) cmdt[i] = cmdt[i] | 0140; | for (i = 0; i < strlen (cmdt); i++) cmdt[i] = cmdt[i] | 0140; |
| if (strcmp (cmdt, "exit") == 0) cmd = FMAC_EXIT; | if (strcmp (cmdt, "exit") == 0) cmd = FMAC_EXIT; |
| Line 757 int fm_shell (void) | Line 854 int fm_shell (void) |
| printf ("Global Path: %s\n", fma_global_path); | printf ("Global Path: %s\n", fma_global_path); |
| printf ("%%-Global Path: %s\n", fma_pct_global_path); | printf ("%%-Global Path: %s\n", fma_pct_global_path); |
| printf ("Journal File: %s\n", fma_journal_path); | printf ("Journal File: %s\n", fma_journal_path); |
| printf ("Journal Cut Threshold: %ld bytes\n", fma_journal_cut_threshold); | printf ("Journal Cut Threshold: %s bytes\n", fma_journal_cut_threshold); |
| break; | break; |
| case FMAC_EXIT: | case FMAC_EXIT: |
| Line 1025 int fm_edit (short object, int optc, cha | Line 1122 int fm_edit (short object, int optc, cha |
| 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 1060 void fm_reconfigure(void) | Line 1157 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 1077 void fm_reconfigure(void) | Line 1174 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 1101 void fm_configure (void) | Line 1198 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]; | |
| char *username = env_user; | |
| char *groupname = env_group; | |
| #if !defined(__OS2__) | |
| 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 (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 1119 void fm_configure (void) | Line 1245 void fm_configure (void) |
| } | } |
| 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; |
| } | } |
| gethostname (hostid, 4095); | gethostname (hostid, 4095); |
| uuid_v4 (buf); | uuid_v4 (buf); |
| snprintf (jnlhostid, 4095, "%s:%s", hostid, buf); | snprintf (jnlhostid, 4095, "%s:%s", hostid, buf); |
| snprintf (confbase, 4095, "%s/freem", SYSCONFDIR); | snprintf (confbase, 4095, "%s/freem", SYSCONFDIR); |
| snprintf (envbase, 4095, "%s/freem/%s", SYSCONFDIR, fma_environment); | snprintf (envbase, 4095, "%s/freem/%s", SYSCONFDIR, fma_environment); |
| snprintf (nsbase, 4095, "%s/freem/%s", LOCALSTATEDIR, fma_environment); | snprintf (nsbase, 4095, "%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); | |
| unlink (dstfile); | |
| fprintf (stderr, "fmadm: running on OS/2; will copy %s to %s\n", srcfile, dstfile); | |
| if (DosCopy (srcfile, dstfile, 1) != 0) { | |
| fprintf (stderr, "fmadm: fatal error copying %s to %s\n", srcfile, dstfile); | |
| exit (1); | |
| } | |
| chmod (dstfile, 0755); | |
| } | |
| #else | |
| fprintf (stderr, "fmadm: not running on OS/2\n"); | |
| #endif | |
| printf ("\nFreeM Initial Configuration\n"); | printf ("\nFreeM Initial Configuration\n"); |
| printf ("---------------------------\n\n"); | printf ("---------------------------\n\n"); |
| 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' (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 (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); |
| set_permissions (SYSCONFDIR, username, groupname, 0775); | |
| } | } |
| 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); |
| set_permissions (confbase, username, groupname, 0775); | |
| } | } |
| 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); |
| set_permissions (envbase, username, groupname, 0775); | |
| } | } |
| if (stat (varbase, &etcstat) == -1) { | |
| fprintf (stderr, "fmadm: creating %s\n", varbase); | |
| mkdir (varbase, 0775); | |
| set_permissions (varbase, username, groupname, 0775); | |
| } | |
| 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); |
| set_permissions (nsbase, username, groupname, 0775); | |
| } | } |
| snprintf (src_dir, 4095, "%s/freem/mlib", DATADIR); | |
| snprintf (dest_dir, 4095, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment); | |
| if (strcmp (fma_environment, "DEFAULT") != 0) { | |
| fprintf (stderr, "fmadm: populating new environment '%s'\n", fma_environment); | |
| DIR *dir; | |
| struct dirent *ent; | snprintf (buf, 4095, "%s/freem/%s/SYSTEM", LOCALSTATEDIR, fma_environment); |
| char src_dir[4096]; | mkdir (buf, 0775); |
| char dest_dir[4096]; | set_permissions (buf, username, groupname, 0775); |
| snprintf (buf, 4095, "%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); | |
| mkdir (buf, 0775); | |
| set_permissions (buf, username, groupname, 0775); | |
| snprintf (buf, 4095, "%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); | |
| mkdir (buf, 0775); | |
| set_permissions (buf, username, groupname, 0775); | |
| snprintf (buf, 4095, "%s/freem/%s/USER/routines", LOCALSTATEDIR, fma_environment); | |
| mkdir (buf, 0775); | |
| set_permissions (buf, username, groupname, 0775); | |
| fprintf (stderr, "fmadm: copying routines from '%s' to '%s'...\n", src_dir, dest_dir); | |
| snprintf (src_dir, 4095, "%s/freem/DEFAULT/SYSTEM/routines", LOCALSTATEDIR); | if ((dir = opendir (src_dir)) == NULL) { |
| snprintf (dest_dir, 4095, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment); | fprintf (stderr, "\nfmadm: could not open source directory %s\n", src_dir); |
| exit (1); | |
| fprintf (stderr, "fmadm: populating new environment '%s'\n", fma_environment); | } |
| while ((ent = readdir (dir)) != NULL) { | |
| char infile[4096]; | |
| char outfile[4096]; | |
| snprintf (buf, 4095, "%s/freem/%s/SYSTEM", LOCALSTATEDIR, fma_environment); | if ((strcmp (ent->d_name, ".") != 0) && (strcmp (ent->d_name, "..") != 0)) { |
| mkdir (buf, 0755); | |
| fprintf (stderr, "\t%s\n", ent->d_name); | |
| snprintf (buf, 4095, "%s/freem/%s/USER", LOCALSTATEDIR, fma_environment); | |
| mkdir (buf, 0755); | snprintf (infile, 4095, "%s/%s", src_dir, ent->d_name); |
| snprintf (outfile, 4095, "%s/%s", dest_dir, ent->d_name); | |
| 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); | |
| } | |
| 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 (cp (outfile, infile) != 0) { | |
| fprintf (stderr, "fmadm: failure copying %s to %s\n", infile, outfile); | |
| } | |
| #if !defined(__OS2__) | |
| if (cp (outfile, infile) != 0) { | |
| fprintf (stderr, "fmadm: failure copying %s to %s\n", infile, outfile); | |
| } | |
| set_permissions (outfile, username, groupname, 0755); | |
| #else | |
| if (DosCopy (infile, outfile, 1) != 0) { | |
| fprintf (stderr, "fmadm: failure copying %s to %s\n", infile, outfile); | |
| } | } |
| #endif | |
| } | } |
| } | } |
| fp = fopen (env_config_file, "a+"); | |
| fprintf (stderr, "Creating %s... ", env_config_file); | |
| snprintf (buf, 4095, "[%s]", fma_environment); | |
| fm_write (fp, buf); | |
| snprintf (buf, 4095, "user=%s", env_user); | |
| fm_write (fp, buf); | |
| snprintf (buf, 4095, "group=%s", env_group); | |
| fm_write (fp, buf); | |
| snprintf (buf, 4095, "env_path=%s/freem/%s", LOCALSTATEDIR, fma_environment); | |
| fm_write (fp, buf); | |
| fclose (fp); | |
| fprintf (stderr, "[OK]\n"); | |
| fp = fopen (config_file, "a+"); | fp = fopen (config_file, "a+"); |
| fprintf (stderr, "Creating %s... ", config_file); | |
| printf ("Creating %s... ", config_file); | |
| snprintf (buf, 4095, "[SYSTEM]"); | snprintf (buf, 4095, "[SYSTEM]"); |
| fm_write (fp, buf); | fm_write (fp, buf); |
| Line 1270 void fm_configure (void) | Line 1444 void fm_configure (void) |
| snprintf (buf, 4095, "globals_path=%s", usrgbl); | snprintf (buf, 4095, "globals_path=%s", usrgbl); |
| fm_write (fp, buf); | fm_write (fp, buf); |
| fclose (fp); | fclose (fp); |
| set_permissions (config_file, username, groupname, 0755); | |
| fprintf (stderr, "[OK]\n"); | |
| printf ("[OK]\n\n"); | |
| /* | |
| printf ("Setting USER namespace permissions... "); | |
| snprintf (buf, 4095, "%s/freem/USER/globals", LOCALSTATEDIR); | |
| chmod (buf, 0777); | |
| snprintf (buf, 4095, "%s/freem/USER/routines", LOCALSTATEDIR); | |
| chmod (buf, 0777); | |
| printf ("[OK]\n"); | |
| printf ("Setting SYSTEM namespace permissions... "); | |
| snprintf (buf, 4095, "%s/freem/SYSTEM/globals", LOCALSTATEDIR); | |
| chmod (buf, 0755); | |
| snprintf (buf, 4095, "%s/freem/SYSTEM/routines", LOCALSTATEDIR); | |
| chmod (buf, 0755); | |
| printf ("[OK]\n\n\n"); | |
| */ | |
| printf ("FreeM initial configuration is complete.\n\n"); | printf ("FreeM initial configuration is complete.\n\n"); |
| printf (" USER globals: %s\n", usrgbl); | printf (" USER globals: %s\n", usrgbl); |
| Line 1309 void fm_configure (void) | Line 1462 void fm_configure (void) |
| } /* fm_configure */ | } /* fm_configure */ |
| void set_permissions(char *path, char *user, char *grp, int mode) | |
| { | |
| #if !defined(__OS2__) | |
| struct group *d_grp; | |
| struct passwd *d_user; | |
| gid_t d_gid; | |
| uid_t d_uid; | |
| #endif | |
| #if !defined(__OS2__) | |
| if ((d_grp = getgrnam (grp)) == NULL) { | |
| fprintf (stderr, "fmadm: '%s' group must exist before configuring\n", grp); | |
| exit (1); | |
| } | |
| d_gid = d_grp->gr_gid; | |
| if ((d_user = getpwnam (user)) == NULL) { | |
| fprintf (stderr, "fmadm: '%s' user must exist before configuring\n", user); | |
| exit (1); | |
| } | |
| d_uid = d_user->pw_uid; | |
| if (chown (path, d_uid, d_gid) != 0) { | |
| fprintf (stderr, "fmadm: error setting ownership on %s\n", path); | |
| exit (1); | |
| } | |
| #endif | |
| if (chmod (path, mode) != 0) { | |
| fprintf (stderr, "fmadm: error setting permissions on %s to %d\n", path, mode); | |
| exit (1); | |
| } | |
| } | |
| void fm_write (FILE *file, char *buf) | void fm_write (FILE *file, char *buf) |
| { | { |
| fprintf (file, "%s\n", buf); | fprintf (file, "%s\n", buf); |