version 1.23, 2025/04/16 05:33:15
|
version 1.28, 2025/05/14 12:22:04
|
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.28 2025/05/14 12:22:04 snw |
|
* Further work on shared memory |
|
* |
|
* Revision 1.27 2025/04/17 00:34:04 snw |
|
* More logging improvements |
|
* |
|
* Revision 1.26 2025/04/16 17:36:12 snw |
|
* Add FreeBSD shm cleanup script |
|
* |
|
* Revision 1.25 2025/04/16 05:57:42 snw |
|
* Remove non-useful procctl calls |
|
* |
|
* Revision 1.24 2025/04/16 05:37:06 snw |
|
* Refine FreeBSD ASLR fix |
|
* |
* Revision 1.23 2025/04/16 05:33:15 snw |
* Revision 1.23 2025/04/16 05:33:15 snw |
* Try to use procctl function to fix ASLR problem on FreeBSD |
* Try to use procctl function to fix ASLR problem on FreeBSD |
* |
* |
Line 119
|
Line 134
|
#include <pwd.h> |
#include <pwd.h> |
#include <grp.h> |
#include <grp.h> |
#include "log.h" |
#include "log.h" |
#if defined(__FreeBSD__) |
|
# include <sys/procctl.h> |
|
#endif |
|
#if defined(HAVE_GETOPT_H) |
#if defined(HAVE_GETOPT_H) |
# include <getopt.h> |
# include <getopt.h> |
#endif |
#endif |
Line 197 int main (int argc, char **argv, char **
|
Line 209 int main (int argc, char **argv, char **
|
char cli_rtn_name[256]; |
char cli_rtn_name[256]; |
|
|
char env_ena[25]; |
char env_ena[25]; |
|
|
#if defined(__FreeBSD__) |
|
int prcdta = PROC_ASLR_FORCE_DISABLE; |
|
if (procctl (P_PID, getpid (), PROC_ASLR_CTL, &prcdta) == -1) { |
|
fprintf (stderr, "freem: could not disable address space layout randomization for pid %ld; program operation may be unreliable [error %s]\n", getpid(), strerror (errno)); |
|
} |
|
#endif |
|
|
|
routine_mode = FALSE; |
routine_mode = FALSE; |
strcpy (m_dialect, "FREEM"); |
strcpy (m_dialect, "FREEM"); |
Line 222 int main (int argc, char **argv, char **
|
Line 227 int main (int argc, char **argv, char **
|
strcpy (stack0, argv[0]); |
strcpy (stack0, argv[0]); |
stcnv_c2m (stack0); |
stcnv_c2m (stack0); |
|
|
|
|
/* strncpy (config_file, SYSCONFDIR"/freem.conf", 100); */ |
/* strncpy (config_file, SYSCONFDIR"/freem.conf", 100); */ |
|
|
|
|
Line 525 int main (int argc, char **argv, char **
|
Line 529 int main (int argc, char **argv, char **
|
} |
} |
#endif |
#endif |
|
|
|
|
if (run_daemon == TRUE) { |
if (run_daemon == TRUE) { |
if (geteuid () != 0 && nofork == FALSE) { |
if (geteuid () != 0 && nofork == FALSE) { |
logprintf (FM_LOG_FATAL, "freem: forking daemon must be run as root"); |
logprintf (FM_LOG_FATAL, "freem: forking daemon must be run as root"); |
} |
} |
} |
} |
|
|
|
|
if ((nofork == TRUE) && (run_daemon == FALSE)) { |
if ((nofork == TRUE) && (run_daemon == FALSE)) { |
freem_usage (); |
freem_usage (); |
exit (1); |
exit (1); |
Line 599 int main (int argc, char **argv, char **
|
Line 605 int main (int argc, char **argv, char **
|
} |
} |
} |
} |
|
|
|
logprintf (FM_LOG_INFO, "environment: privilege shedding complete"); |
|
|
} |
} |
else { |
else { |
logprintf (FM_LOG_INFO, "environment: not running as superuser; not shedding privileges"); |
logprintf (FM_LOG_INFO, "environment: not running as superuser; not shedding privileges"); |
} |
} |
|
|
|
logprintf (FM_LOG_INFO, "environment: reopening stdin, stdout, and stderr"); |
freopen ("/dev/null", "r", stdin); |
freopen ("/dev/null", "r", stdin); |
freopen ("/dev/null", "w+", stdout); |
freopen ("/dev/null", "w+", stdout); |
freopen ("/dev/null", "w+", stderr); |
freopen ("/dev/null", "w+", stderr); |
|
logprintf (FM_LOG_INFO, "environment: stdin, stdout, and stderr reopened"); |
|
|
run_daemon = TRUE; |
run_daemon = TRUE; |
nofork = FALSE; |
nofork = FALSE; |
Line 620 int main (int argc, char **argv, char **
|
Line 630 int main (int argc, char **argv, char **
|
|
|
snprintf (pid_file_path, PATH_MAX - 1, "%s/freem/run/%s.pid", LOCALSTATEDIR, shm_env); |
snprintf (pid_file_path, PATH_MAX - 1, "%s/freem/run/%s.pid", LOCALSTATEDIR, shm_env); |
|
|
|
logprintf (FM_LOG_INFO, "environment: opening pid file %s", pid_file_path); |
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 644 int main (int argc, char **argv, char **
|
} |
} |
|
|
sprintf (pidfile_buf, "%ld\n", (long) getpid ()); |
sprintf (pidfile_buf, "%ld\n", (long) getpid ()); |
|
logprintf (FM_LOG_INFO, "environment: writing pid file"); |
write (pid_fd, pidfile_buf, strlen (pidfile_buf)); |
write (pid_fd, pidfile_buf, strlen (pidfile_buf)); |
|
|
} |
} |
Line 761 int main (int argc, char **argv, char **
|
Line 773 int main (int argc, char **argv, char **
|
else { |
else { |
fm_initialized = TRUE; |
fm_initialized = TRUE; |
} |
} |
} |
} |
|
|
if (first_process == TRUE) { |
if (first_process == TRUE) { |
|
|
Line 789 int main (int argc, char **argv, char **
|
Line 801 int main (int argc, char **argv, char **
|
|
|
logprintf (FM_LOG_WARNING, "environment: entering maintenance mode"); |
logprintf (FM_LOG_WARNING, "environment: entering maintenance mode"); |
|
|
for (slot = shm_config->hdr->jobtab_head; slot != NULL; slot = slot->next) { |
for (slot = SOA(shm_config->hdr->jobtab_head); slot != NULL; slot = SOA(slot->next)) { |
|
|
if ((slot->pid != pid) && ((slot->flags & JFLG_FMADM) != JFLG_FMADM)) { |
if ((slot->pid != pid) && ((slot->flags & JFLG_FMADM) != JFLG_FMADM)) { |
kill (slot->pid, SIGINT); |
kill (slot->pid, SIGINT); |
Line 843 int main (int argc, char **argv, char **
|
Line 855 int main (int argc, char **argv, char **
|
exit (0); |
exit (0); |
|
|
} |
} |
|
|
job_gc_mark (); |
job_gc_mark (); |
job_set_status (pid, JSTAT_IDLE); |
job_set_status (pid, JSTAT_IDLE); |
sleep (1); |
sleep (1); |
|
|
job_set_status (pid, JSTAT_HOUSEKEEPING); |
job_set_status (pid, JSTAT_HOUSEKEEPING); |
job_gc_sweep (); |
job_gc_sweep (); |
|
|
sleep (1); |
sleep (1); |
} |
} |
|
|