version 1.15, 2025/04/03 20:48:14
|
version 1.16, 2025/04/04 19:43:18
|
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.16 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.15 2025/04/03 20:48:14 snw |
* Revision 1.15 2025/04/03 20:48:14 snw |
* Improve daemon error diagnostics and bump to 0.63.0-rc3 |
* Improve daemon error diagnostics and bump to 0.63.0-rc3 |
* |
* |
Line 65
|
Line 68
|
* SPDX-License-Identifier: AGPL-3.0-or-later |
* SPDX-License-Identifier: AGPL-3.0-or-later |
**/ |
**/ |
|
|
|
#define _GNU_SOURCE |
#include <stdlib.h> |
#include <stdlib.h> |
#include <stddef.h> |
#include <stddef.h> |
#include "mpsdef.h" |
#include "mpsdef.h" |
Line 176 int main (int argc, char **argv, char **
|
Line 180 int main (int argc, char **argv, char **
|
char *cli_rtn_file; |
char *cli_rtn_file; |
char cli_rtn_name[256]; |
char cli_rtn_name[256]; |
|
|
|
char env_ena[25]; |
|
|
routine_mode = FALSE; |
routine_mode = FALSE; |
strcpy (m_dialect, "FREEM"); |
strcpy (m_dialect, "FREEM"); |
|
|
Line 205 int main (int argc, char **argv, char **
|
Line 211 int main (int argc, char **argv, char **
|
|
|
while (1) { |
while (1) { |
|
|
c = getopt_long (argc, argv, "hsfiqRr:n:e:vx:dkpS:u:g:", long_options, &option_index); |
c = getopt_long (argc, argv, "hsfiqRr:n:e:vx:dkpS", long_options, &option_index); |
|
|
if (c == -1) break; |
if (c == -1) break; |
if (c == '?') freem_usage (); |
if (c == '?') freem_usage (); |
Line 318 int main (int argc, char **argv, char **
|
Line 324 int main (int argc, char **argv, char **
|
|
|
case 'S': /* --shmsize */ |
case 'S': /* --shmsize */ |
shm_init_size = atol (optarg); |
shm_init_size = atol (optarg); |
break; |
break; |
|
|
case 'u': /* --user */ |
|
strncpy (d_username, optarg, 40); |
|
custom_user = TRUE; |
|
break; |
|
|
|
case 'g': /* --group */ |
|
strncpy (d_groupname, optarg, 40); |
|
custom_group = TRUE; |
|
break; |
|
|
|
|
|
} |
} |
|
|
Line 341 int main (int argc, char **argv, char **
|
Line 336 int main (int argc, char **argv, char **
|
extern char *optarg; |
extern char *optarg; |
extern int optind, optopt; |
extern int optind, optopt; |
|
|
while ((c = getopt (argc, argv, "hsfiqRr:n:e:vx:dkS:u:g:")) != -1) { |
while ((c = getopt (argc, argv, "hsfiqRr:n:e:vx:dkS:")) != -1) { |
|
|
if (c == '?') freem_usage (); |
if (c == '?') freem_usage (); |
|
|
Line 449 int main (int argc, char **argv, char **
|
Line 444 int main (int argc, char **argv, char **
|
shm_init_size = atol (optarg); |
shm_init_size = atol (optarg); |
break; |
break; |
|
|
case 'u': /* --user */ |
|
strncpy (d_username, optarg, 40); |
|
custom_user = TRUE; |
|
break; |
|
|
|
case 'g': /* --group */ |
|
strncpy (d_groupname, optarg, 40); |
|
custom_group = TRUE; |
|
break; |
|
|
|
|
|
} |
} |
} |
} |
} |
} |
Line 473 int main (int argc, char **argv, char **
|
Line 457 int main (int argc, char **argv, char **
|
#endif |
#endif |
|
|
snprintf (config_file, 4096, "%s/freem/%s/freem.conf", SYSCONFDIR, shm_env); |
snprintf (config_file, 4096, "%s/freem/%s/freem.conf", SYSCONFDIR, shm_env); |
|
snprintf (env_config_file, 4096, "%s/freem/env.conf", SYSCONFDIR); |
|
|
if (run_daemon == TRUE && geteuid() == 0) { |
if (!file_exists (env_config_file)) { |
|
fprintf (stderr, "freem: environment catalog does not exist; may need to run fmadm configure\n"); |
|
exit (1); |
|
} |
|
|
if (custom_group) { |
if (!file_exists (config_file)) { |
d_grp = getgrnam (d_groupname); |
fprintf (stderr, "freem: configuration file for %s does not exist; may need to run fmadm configure\n", shm_env); |
|
exit (1); |
|
} |
|
|
if (d_grp == NULL) { |
if (read_profile_string (env_config_file, shm_env, "user", d_username) == FALSE) { |
fprintf (stderr, "freem: invalid group '%s'\n", d_groupname); |
fprintf (stderr, "freem: could not determine owning user for environment %s\n", shm_env); |
exit (1); |
exit (1); |
} |
} |
|
|
d_gid = d_grp->gr_gid; |
|
} |
|
|
|
if (custom_user) { |
if (read_profile_string (env_config_file, shm_env, "group", d_groupname) == FALSE) { |
d_user = getpwnam (d_username); |
fprintf (stderr, "freem: could not determine owning group for environment %s\n", shm_env); |
|
exit (1); |
|
} |
|
|
if (d_user == NULL) { |
if (read_profile_string (env_config_file, shm_env, "enabled", env_ena) == FALSE) { |
fprintf (stderr, "freem: invalid user '%s'\n", d_username); |
fprintf (stderr, "freem: could not discover enabled state for environment %s\n", shm_env); |
exit (1); |
exit (1); |
} |
} |
|
|
d_uid = d_user->pw_uid; |
if (strcmp (env_ena, "true") != 0) { |
} |
fprintf (stderr, "freem: environment %s is administratively disabled\n", shm_env); |
else { |
exit (1); |
d_uid = 0; |
} |
} |
|
|
d_grp = getgrnam (d_groupname); |
|
if (d_grp == NULL) { |
|
fprintf (stderr, "freem: invalid group '%s'\n", d_groupname); |
|
exit (1); |
|
} |
|
d_gid = d_grp->gr_gid; |
|
|
|
d_user = getpwnam (d_username); |
|
if (d_user == NULL) { |
|
fprintf (stderr, "freem: invalid user '%s'\n", d_username); |
|
exit (1); |
|
} |
|
d_uid = d_user->pw_uid; |
|
|
|
|
|
#if defined(__linux__) |
|
if (run_daemon == FALSE && group_member (d_gid) == 0) { |
|
fprintf (stderr, "freem: you must be a member of the %s group to use environment %s\n", d_groupname, shm_env); |
|
exit (1); |
|
} |
|
|
|
#endif |
|
|
|
if (run_daemon == TRUE) { |
|
if (geteuid () != 0 && nofork == FALSE) { |
|
fprintf (stderr, "freem: forking daemon must be run as root\n"); |
|
exit (1); |
|
} |
} |
} |
|
|
if ((nofork == TRUE) && (run_daemon == FALSE)) { |
if ((nofork == TRUE) && (run_daemon == FALSE)) { |