PLATFORM_IF_MATCH(linux)
PLATFORM_ELSE
PLATFORM_ENDIF
extern int error_intr;
extern int error_nomem;
diff -ru daemontools-0.76/src/svscan.c daemontools-0.76.new/src/svscan.c
--- daemontools-0.76/src/svscan.c 2001-07-12 12:49:49.000000000 -0400
+++ daemontools-0.76.new/src/svscan.c 2004-02-08 01:50:27.000000000 -0500
@@ -1,6 +1,7 @@
#include
#include
#include
+#include
#include "direntry.h"
#include "strerr.h"
#include "error.h"
@@ -14,6 +15,11 @@
#define SERVICES 1000
+#ifndef SVSCANINFO
+#define SVSCANINFO ".svscan" /* must begin with dot ('.') */
+#endif
+
+#define INFO "svscan: info: "
#define WARNING "svscan: warning: "
#define FATAL "svscan: fatal: "
@@ -38,7 +44,7 @@
int i;
const char *args[3];
- if (fn[0] == '.') return;
+ if (fn[0] == '.' && str_diff(fn,SVSCANINFO)) return;
if (stat(fn,&st) == -1) {
strerr_warn4(WARNING,"unable to stat ",fn,": ",&strerr_sys);
@@ -59,7 +65,8 @@
}
x[i].ino = st.st_ino;
x[i].dev = st.st_dev;
- x[i].pid = 0;
+ /*(fn[0]=='.' here only if SVSCANINFO; if so only supervise log/ subdir)*/
+ x[i].pid = (fn[0] != '.') ? 0 : -1;
x[i].pidlog = 0;
x[i].flaglog = 0;
@@ -190,12 +197,39 @@
}
}
+static void open_svscan_log(void)
+{
+ const int i = numx;
+ struct stat st;
+ static char fn[] = SVSCANINFO; /* avoid compiler warning on const string */
+
+ /* (semi-paranoid; could be moreso) */
+ if (fstat(STDIN_FILENO,&st) != 0 && errno == EBADF)
+ (void) open("/dev/null", O_RDONLY);
+ if (fstat(STDOUT_FILENO,&st) != 0 && errno == EBADF)
+ (void) open("/dev/null", O_WRONLY);
+ if (fstat(STDERR_FILENO,&st) != 0 && errno == EBADF)
+ (void) open("/dev/null", O_WRONLY);
+
+ if (stat(fn,&st) == 0) {
+ start(fn);
+ if (i+1 == numx && x[i].pidlog != 0) {
+ (void) dup2(x[i].pi[1], STDOUT_FILENO);
+ (void) dup2(x[i].pi[1], STDERR_FILENO);
+ strerr_warn1("",0);
+ strerr_warn2(INFO,"*** Starting svscan",0);
+ }
+ }
+}
+
int main(int argc,char **argv)
{
if (argv[0] && argv[1])
if (chdir(argv[1]) == -1)
strerr_die4sys(111,FATAL,"unable to chdir to ",argv[1],": ");
+ open_svscan_log();
+
for (;;) {
doit();
sleep(5);
]]>
:
./package/compile
test -d ${ENCAP_SOURCE} || mkdir ${ENCAP_SOURCE}
test -d ${ENCAP_SOURCE}/${ENCAP_PKGNAME} || mkdir ${ENCAP_SOURCE}/${ENCAP_PKGNAME}
test -d ${ENCAP_SOURCE}/${ENCAP_PKGNAME}/bin || mkdir ${ENCAP_SOURCE}/${ENCAP_PKGNAME}/bin
test -d ${ENCAP_SOURCE}/${ENCAP_PKGNAME}/src || mkdir ${ENCAP_SOURCE}/${ENCAP_PKGNAME}/src
test -d ${ENCAP_SOURCE}/${ENCAP_PKGNAME}/package || mkdir ${ENCAP_SOURCE}/${ENCAP_PKGNAME}/package
cp command/* ${ENCAP_SOURCE}/${ENCAP_PKGNAME}/bin
cp package/run ${ENCAP_SOURCE}/${ENCAP_PKGNAME}/package
cp package/commands ${ENCAP_SOURCE}/${ENCAP_PKGNAME}/package
cp package/boot.inittab ${ENCAP_SOURCE}/${ENCAP_PKGNAME}/package
cp package/boot.rclocal ${ENCAP_SOURCE}/${ENCAP_PKGNAME}/package
cp package/run.inittab ${ENCAP_SOURCE}/${ENCAP_PKGNAME}/package
cp package/run.rclocal ${ENCAP_SOURCE}/${ENCAP_PKGNAME}/package
:
mv package/run package/run.orig
mv package/run.inittab package/run.inittab.orig
mv package/boot.inittab package/boot.inittab.orig
mv package/run.rclocal package/run.rclocal.orig
mv package/boot.rclocal package/boot.rclocal.orig
test -d var || mkdir var
test -d var/svc.d || mkdir var/svc.d
test -d var/svc.d/svscan || mkdir var/svc.d/svscan
test -d var/svc.d/svscan/log || mkdir var/svc.d/svscan/log
# Make "this encap is installed" sentinal file available in /usr/local/var/encap
test -d var/encap || mkdir var/encap
touch var/encap/${ENCAP_PKGNAME}
&1
exec /command/multilog t /usr/local/var/multilog/svscan
]]>
/dev/null 2>&1
for log_dir in "$SERVICES"/*/log "$SERVICES"/.svscan/log; do
if [ -d "$log_dir" ] \
&& svok "$log_dir" \
&& svstat "$log_dir" | grep -q ": up"
then
svc -ox "$log_dir"
fi
done
for service_dir in "$SERVICES"/*; do
if [ -d "$service_dir" ] \
&& svok "$service_dir" \
&& svstat "$service_dir" | grep -q ": up"
then
[ -x "$service_dir"/shutdown ] && "$service_dir"/shutdown
svc -dx "$service_dir"
fi
done
[ "$1" = "start" ] && exec env - PATH=$PATH svscan "$SERVICES"
]]>
/usr/local/var/svc.d/svscan ...'
ln -s /usr/local/var/svc.d/svscan /service/.svscan
if test -r /etc/inittab
then
/command/setlock /etc/inittab package/run.inittab
else
/command/setlock /etc/rc.local package/run.rclocal
fi
]]>
/dev/null
then
echo 'inittab contains an svscan.rc line. I assume that svscan is already running.
'
else
echo 'Adding svscan.rc to inittab...'
rm -f /etc/inittab'{new}'
cat /etc/inittab package/boot.inittab > /etc/inittab'{new}'
mv -f /etc/inittab'{new}' /etc/inittab
kill -HUP 1
echo 'init should start svscan now.'
fi
]]>
/tmp/svscan-start.log 2>&1
SZ:S016:once:/command/svscan.rc stop /tmp/svscan-stop.log 2>&1
]]>
/dev/null
then
echo 'rc.local contains an svscan.rc line. I assume that svscan is already running
.'
else
echo 'Adding svscan.rc to /etc/rc.local...'
rm -f /etc/rc.local'{new}'
cat /etc/rc.local package/boot.rclocal > /etc/rc.local'{new}'
mv -f /etc/rc.local'{new}' /etc/rc.local
echo 'Reboot now to start svscan.'
fi
]]>
$LOG 2>&1
printf "Running daemontools postinstall script...\n"
date
test -d /usr/local/var || mkdir /usr/local/var
test -d /usr/local/var/multilog || mkdir /usr/local/var/multilog
test -d /usr/local/var/multilog/svscan || mkdir /usr/local/var/multilog/svscan
test -h /command || ln -s /usr/local/encap/daemontools-0.76/bin /command
cd /usr/local/encap/daemontools-0.76 && ./package/run
printf "Finished daemontools postinstall script.\n"
]]>
description daemontools - a collection of tools for managing UNIX services
exclude src
exclude package