3 use vars qw( @ISA @EXPORT_OK );
4 use vars qw( $pid_dir $me $pid_file $sigint $sigterm $NOSIG $logfile );
10 use File::Slurp qw(slurp);
13 #this is a simple refactoring of the stuff from freeside-queued, just to
14 #avoid duplicate code. eventually this should use something from CPAN.
18 daemonize1 drop_root daemonize2 myexit logfile sigint sigterm
20 %EXPORT_TAGS = ( 'all' => [ @EXPORT_OK ] );
22 $pid_dir = '/var/run';
31 if ( $PID_NEWSTYLE ) {
32 $pid_file .= '/freeside';
33 mkdir $pid_file unless -d $pid_file;
34 chown $FS::UID::freeside_uid, -1, $pid_file;
37 $pid_file .= '.'.shift if scalar(@_);
40 chdir "/" or die "Can't chdir to /: $!";
41 open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
42 defined(my $pid = fork) or die "Can't fork: $!";
44 print "$me started with pid $pid\n"; #logging to $log_file\n";
45 exit unless $pid_file;
46 my $pidfh = new IO::File ">$pid_file" or exit;
47 chown $FS::UID::freeside_uid, -1, $pid_file;
48 print $pidfh "$pid\n";
52 #sub REAPER { my $pid = wait; $SIG{CHLD} = \&REAPER; $kids--; }
53 #$SIG{CHLD} = \&REAPER;
57 $SIG{INT} = sub { warn "SIGINT received; shutting down\n"; $sigint++; };
58 $SIG{TERM} = sub { warn "SIGTERM received; shutting down\n"; $sigterm++; };
63 my $freeside_gid = scalar(getgrnam('freeside'))
64 or die "can't find freeside group\n";
67 #if freebsd can't setuid(), presumably it can't setgid() either. grr fleabsd
71 $> = $FS::UID::freeside_uid;
72 $< = $FS::UID::freeside_uid;
73 #freebsd is sofa king broken, won't setuid()
75 $> = $FS::UID::freeside_uid;
79 open STDOUT, '>/dev/null' or die "Can't write to /dev/null: $!";
80 setsid or die "Can't start a new session: $!";
81 open STDERR, '>&STDOUT' or die "Can't dup stdout: $!";
83 $SIG{__DIE__} = \&_die;
84 $SIG{__WARN__} = \&_logmsg;
86 warn "$me starting\n";
89 sub sigint { $sigint; }
90 sub sigterm { $sigterm; }
92 sub logfile { $logfile = shift; } #_logmsg('test'); }
95 chomp( my $pid = slurp($pid_file) );
96 unlink $pid_file if -e $pid_file && $$ == $pid;
101 die @_ if $^S; # $^S = 1 during an eval(), don't break exception handling
104 chomp( my $pid = slurp($pid_file) );
105 unlink $pid_file if -e $pid_file && $$ == $pid;
111 chomp( my $msg = shift );
112 my $log = new IO::File ">>$logfile";
113 flock($log, LOCK_EX);
115 print $log "[". time2str("%a %b %e %T %Y",time). "] [$$] $msg\n";
116 flock($log, LOCK_UN);