summaryrefslogtreecommitdiff
path: root/astro/setiathome/files/setiathome.bin
blob: 9e4a54c69670a75f0a94d58d8e7032fa8e644918 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#!/bin/sh -T

# $FreeBSD$

# Copyright (c) 2003 Cyrille Lefevre. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in
#    the documentation and/or other materials provided with the
#    distribution.
# 3. The name of the authors and contributors may not be used to
#    endorse or promote products derived from this software without
#    specific prior written permission.
# 
# THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS''
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
# PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS
# OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.

setistart () { # dir
	local dir
	dir=$1

	# goto the startup dir
	cd ${dir} || return

	# don't start a dying client
	[ -f stop_after_send.txt ] && return

	# fire up a setiathome client
	${program_path} ${program_args} > /dev/null &

	# memorize the startup dir
	eval pid_$!=${dir}
	# and the client process ID
	setipids="${setipids} $!"
}

setikill () { # SIGTERM handler
	local pids pid

	# save pids to kill
	pids="${sleeppid} ${setipids}"
	# avoid futher setiathome startup
	unset setipids

	# kill'em all if any
	for pid in ${pids}; do
		ps p ${pid} > /dev/null && kill ${pid}
	done
}

setirestart () { # SIGCHLD handler
	local pids pid dir

	# killing in progress
	[ -n "${setipids}" ] || return
	# restart in process
	[ -n "${sleeppids}" ] && return

	# wait for setiathome servers to come up
	sleep ${seti_sleep_time} &

	# wait even if more than one setiathome client dies
	sleeppid=$!
	while ps p ${sleeppid} > /dev/null; do
		wait ${sleeppid}
	done
	unset sleeppid

	# killing while sleeping
	[ -n "${setipids}" ] || return

	# save pids to restart
	pids=${setipids}
	# reset the process ID list
	unset setipids

	for pid in ${pids}; do
		if ps p ${pid} > /dev/null; then
			# still alive
			setipids="${setipids} ${pid}"
		else
			# backup the startup dir
			eval dir=\${pid_${pid}}
			# clean the old one
			unset pid_${pid}
			# launch the dead client
			eval setistart ${dir}
		fi
	done
}

if [ -z "${program_path}" ]; then
	case $0 in
	/*) rc_dir=${0%/*} ;;
	 *) rc_dir=${PWD:-$(pwd)} ;;
	esac
	rc_file=${0##*/}
	rc_path=${rc_dir}/${rc_file}

	if ! PREFIX=$(expr ${rc_path} : "\(/.*\)/libexec/${rc_file}\$"); then
		echo "${rc_file}: Cannot determine PREFIX." >&2
		echo "Please use the complete pathname." >&2
		exit 64
	fi

	echo "Don't use this script directly, uses the following one instead :" >&2
	echo "        ${PREFIX}/etc/rc.d/${rc_file%.bin}.sh start" >&2
	exit 1
fi

# save this shell process ID
echo $$ > ${seti_wrkdir}/shpid.sah

# setup handlers
trap setikill TERM
trap setirestart CHLD

# startup setiathome client(s)
for dir in ${seti_wrksuff}; do
	setistart ${seti_wrkdir}/${dir}
done

# wait for them until death
while [ -n "${setipids}" ]; do
	wait
done