|
|
| version 1.7, 2025/03/24 16:07:55 | version 1.11, 2025/04/01 23:21:45 |
|---|---|
| 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.11 2025/04/01 23:21:45 snw | |
| * fmadm commands for stopping, starting, and restarting environments now functional | |
| * | |
| * Revision 1.10 2025/04/01 20:11:46 snw | |
| * Further work on fmadm | |
| * | |
| * Revision 1.9 2025/03/31 20:01:13 snw | |
| * Set d_uid in daemon | |
| * | |
| * Revision 1.8 2025/03/24 16:10:48 snw | |
| * Print error message and exit on OS/2 if daemon is run without --nofork | |
| * | |
| * Revision 1.7 2025/03/24 16:07:55 snw | * Revision 1.7 2025/03/24 16:07:55 snw |
| * Force daemon into foreground on OS/2 | * Force daemon into foreground on OS/2 |
| * | * |
| Line 129 int main (int argc, char **argv, char ** | Line 141 int main (int argc, char **argv, char ** |
| {"execute", required_argument, 0, 'x'}, | {"execute", required_argument, 0, 'x'}, |
| {"daemon", no_argument, 0, 'd'}, | {"daemon", no_argument, 0, 'd'}, |
| {"nofork", no_argument, 0, 'k'}, | {"nofork", no_argument, 0, 'k'}, |
| {"pidfile", required_argument, 0, 'p'}, | |
| {"shmsize", required_argument, 0, 'S'}, | {"shmsize", required_argument, 0, 'S'}, |
| {"user", required_argument, 0, 'u'}, | {"user", required_argument, 0, 'u'}, |
| {"group", required_argument, 0, 'g'}, | {"group", required_argument, 0, 'g'}, |
| Line 291 int main (int argc, char **argv, char ** | Line 302 int main (int argc, char **argv, char ** |
| nofork = TRUE; | nofork = TRUE; |
| break; | break; |
| case 'p': /* --pidfile */ | |
| pid_file_path = strdup (optarg); | |
| break; | |
| case 'S': /* --shmsize */ | case 'S': /* --shmsize */ |
| shm_init_size = atol (optarg); | shm_init_size = atol (optarg); |
| break; | break; |
| Line 320 int main (int argc, char **argv, char ** | Line 327 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:dkpS:u:g:")) != -1) { | while ((c = getopt (argc, argv, "hsfiqRr:n:e:vx:dkS:u:g:")) != -1) { |
| if (c == '?') freem_usage (); | if (c == '?') freem_usage (); |
| Line 387 int main (int argc, char **argv, char ** | Line 394 int main (int argc, char **argv, char ** |
| nofork = TRUE; | nofork = TRUE; |
| break; | break; |
| case 'p': /* --pidfile */ | |
| pid_file_path = strdup (optarg); | |
| break; | |
| case 's': /* --standard */ | case 's': /* --standard */ |
| if (strcmp (optarg, "M77") == 0) { | if (strcmp (optarg, "M77") == 0) { |
| Line 450 int main (int argc, char **argv, char ** | Line 453 int main (int argc, char **argv, char ** |
| #if defined(__OS2__) | #if defined(__OS2__) |
| if (run_daemon == TRUE && nofork == FALSE) { | if (run_daemon == TRUE && nofork == FALSE) { |
| printf ("freem: running on OS/2; forcing daemon into foreground\r\n"); | printf ("freem: running on OS/2; daemon must be run with --nofork or -k\r\n"); |
| nofork = TRUE; | exit (1); |
| } | } |
| #endif | #endif |
| Line 480 int main (int argc, char **argv, char ** | Line 483 int main (int argc, char **argv, char ** |
| d_uid = d_user->pw_uid; | d_uid = d_user->pw_uid; |
| } | } |
| else { | |
| d_uid = 0; | |
| } | |
| } | } |
| Line 559 int main (int argc, char **argv, char ** | Line 565 int main (int argc, char **argv, char ** |
| m_log (1, "failure switching UIDs"); | m_log (1, "failure switching UIDs"); |
| exit (1); | exit (1); |
| } | } |
| if (chdir (d_user->pw_dir) == -1) { | |
| fprintf (stderr, "freem: chdir failure\n"); | |
| m_log (1, "failure in chdir"); | |
| exit (1); | |
| } | |
| } | } |
| } | } |
| Line 578 int main (int argc, char **argv, char ** | Line 579 int main (int argc, char **argv, char ** |
| run_daemon = TRUE; | run_daemon = TRUE; |
| nofork = FALSE; | nofork = FALSE; |
| if (pid_file_path == NULL) { | |
| /* no PID file specified. choose one. */ | |
| uid_t pid_uid; | |
| char *home_directory; | |
| pid_file_path = (char *) calloc (PATH_MAX, sizeof (char)); | |
| NULLPTRCHK(pid_file_path,"main"); | |
| home_directory = (char *) calloc (PATH_MAX, sizeof (char)); | |
| NULLPTRCHK(home_directory,"main"); | |
| pid_uid = geteuid (); | |
| if (pid_uid == 0) { | |
| /* we're running as root */ | |
| strcpy (pid_file_path, "/var/run/freem.pid"); | |
| } | |
| else { | |
| /* our user is a normie */ | |
| struct passwd *pw = getpwuid (pid_uid); | |
| if (pw == NULL) { | |
| m_log (1, "main: failure in getpwuid()"); | |
| } | |
| strcpy (home_directory, pw->pw_dir); | |
| snprintf (pid_file_path, PATH_MAX - 1, "%s/.freem.pid", home_directory); | |
| } | |
| free (home_directory); | |
| } | |
| { | { |
| char pidfile_buf[256]; | char pidfile_buf[256]; |
| int errsav; | int errsav; |
| m_log (1, pid_file_path); | pid_file_path = (char *) malloc (PATH_MAX * sizeof (char)); |
| NULLPTRCHK(pid_file_path,"main"); | |
| snprintf (pid_file_path, PATH_MAX - 1, "%s/freem/run/%s.pid", LOCALSTATEDIR, shm_env); | |
| pid_fd = open (pid_file_path, O_RDWR | O_CREAT, 0640); | pid_fd = open (pid_file_path, O_RDWR | O_CREAT, 0640); |
| errsav = errno; | errsav = errno; |
| Line 633 int main (int argc, char **argv, char ** | Line 604 int main (int argc, char **argv, char ** |
| exit (1); | exit (1); |
| } | } |
| sprintf (pidfile_buf, "%d\n", getpid ()); | sprintf (pidfile_buf, "%ld\n", (long) getpid ()); |
| write (pid_fd, pidfile_buf, strlen (pidfile_buf)); | write (pid_fd, pidfile_buf, strlen (pidfile_buf)); |
| } | } |
| Line 779 int main (int argc, char **argv, char ** | Line 750 int main (int argc, char **argv, char ** |
| fprintf (stderr, "Coherent Logic Development FreeM version %s\r\n", verstr); | fprintf (stderr, "Coherent Logic Development FreeM version %s\r\n", verstr); |
| fprintf (stderr, "freem: shared memory for environment %s initialized (%ld bytes of shared memory @ '%p')\r\nfreem: system ready\r\n", shm_env, (long) shm_init_size, shm_config->dta); | fprintf (stderr, "freem: shared memory for environment %s initialized (%ld bytes of shared memory @ '%p')\r\nfreem: system ready\r\n", shm_env, (long) shm_init_size, shm_config->dta); |
| #if defined(__OS2__) | |
| fprintf (stderr, "freem: running on OS/2; daemon was forced into the foreground if not explicitly run with --nofork\r\n"); | |
| #endif | |
| for (;;) { | for (;;) { |
| Line 846 int main (int argc, char **argv, char ** | Line 813 int main (int argc, char **argv, char ** |
| fprintf (stderr, "freem: terminating\r\n"); | fprintf (stderr, "freem: terminating\r\n"); |
| cleanup (); | cleanup (); |
| exit (0); | exit (0); |
| } | } |
| Line 958 void freem_usage(void) | Line 926 void freem_usage(void) |
| fprintf (stdout, "\t-x <MCODE>, --execute=<MCODE>\n\t\texecute M code <MCODE> on startup\n\n"); | fprintf (stdout, "\t-x <MCODE>, --execute=<MCODE>\n\t\texecute M code <MCODE> on startup\n\n"); |
| fprintf (stdout, "\t-d, --daemon\n\t\trun the FreeM daemon (one and only one FreeM daemon must always be running)\n\n"); | fprintf (stdout, "\t-d, --daemon\n\t\trun the FreeM daemon (one and only one FreeM daemon must always be running)\n\n"); |
| fprintf (stdout, "\t-k, --nofork\n\t\trun the FreeM daemon in foreground (requires --daemon)\n\n"); | fprintf (stdout, "\t-k, --nofork\n\t\trun the FreeM daemon in foreground (requires --daemon)\n\n"); |
| fprintf (stdout, "\t-p <PIDFILE>, --pidfile=<PIDFILE>\n\t\tuse <PIDFILE> to record the PID of the FreeM daemon\n\n\n"); | |
| fprintf (stdout, "\t-S <BYTES>, --shmsize=<BYTES>\n\t\tsets the size of the shared memory segment where FreeM stores the job table, lock table, and IPC table.\n"); | fprintf (stdout, "\t-S <BYTES>, --shmsize=<BYTES>\n\t\tsets the size of the shared memory segment where FreeM stores the job table, lock table, and IPC table.\n"); |
| #else | #else |
| fprintf (stdout, "\t-h\n\t\tdisplays this help message\n\n"); | fprintf (stdout, "\t-h\n\t\tdisplays this help message\n\n"); |