]>
Commit | Line | Data |
---|---|---|
356d834b | 1 | #!/bin/sh - keep it for file(1) to get bourne shell script result |
7742e157 AF |
2 | # functions This file contains functions to be used by most or all |
3 | # shell scripts in the /etc/init.d directory. | |
4 | # | |
ec8b15cb | 5 | # $Id$ |
7742e157 AF |
6 | # |
7 | # Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org> | |
8a835e11 | 8 | # Hacked by: Greg Galloway and Marc Ewing |
ffe19b59 | 9 | # Modified for PLD Linux by: |
ec8b15cb | 10 | # Marek Obuchowicz <elephant@pld-linux.org> |
fdc764ae ER |
11 | # Arkadiusz Miśkiewicz <misiek@pld-linux.org> |
12 | # Michał Kochanowicz <mkochano@pld-linux.org> | |
13 | # Łukasz Pawelczyk <havner@pld-linux.org> | |
7742e157 AF |
14 | |
15 | # First set up a default search path. | |
f2dd2d31 | 16 | export PATH="/sbin:/usr/sbin:/bin:/usr/bin" |
7742e157 | 17 | |
d7e5835b | 18 | # Set defaults |
66f7cfac ER |
19 | if [ -z "$COLUMNS" -o -z "$LINES" ]; then |
20 | _setterm() { | |
21 | set -- $(stty size 2>/dev/null) | |
22 | LINES=${LINES:-$1} | |
23 | COLUMNS=${COLUMNS:-$2} | |
24 | } | |
25 | _setterm | |
26 | unset _setterm | |
27 | fi | |
28 | [ -z "$COLUMNS" ] && COLUMNS=80 | |
29 | export LINES COLUMNS | |
30 | INIT_COL=$((COLUMNS - 13)) | |
9e9fac7d | 31 | |
503bfc80 AM |
32 | # Set colors |
33 | RED=1 | |
34 | GREEN=2 | |
35 | YELLOW=3 | |
36 | BLUE=4 | |
37 | MAGENTA=5 | |
38 | CYAN=6 | |
39 | WHITE=7 | |
94b691da | 40 | NORMAL=15 |
503bfc80 AM |
41 | # Bold definition (second parameter to termput setaf) |
42 | BOLD=1 | |
43 | NOBOLD=0 | |
44 | # Default colors | |
45 | CBRACKETS="$CYAN" # brackets [ ] color | |
46 | CDONE="$GREEN" # DONE and WORK color | |
47 | CBUSY="$MAGENTA" # BUSY color | |
48 | CFAIL="$RED" # FAIL and DIED color | |
49 | CPOWEREDBY="$CYAN" # "Powered by" color | |
50 | CPLD="$GREEN" # "PLD Linux Distribution" color | |
51 | CI="$RED" # Capital I color (press I to enter interactive startup) | |
52 | CRESMAN="$GREEN" # "Resource Manager" color | |
bca43764 | 53 | CHARS="" # Characters displayed on the beginning of show line |
503bfc80 AM |
54 | CCHARS="$NORMAL" # Color of these characters (look at /etc/sysconfig/init-colors.gentoo example) |
55 | ||
d7e5835b | 56 | # Source configuration if available - may override default values |
503bfc80 | 57 | [ -r /etc/sysconfig/init-colors ] && . /etc/sysconfig/init-colors |
de1fc6ce | 58 | [ -r /etc/sysconfig/system ] && . /etc/sysconfig/system |
7f229d88 | 59 | [ -r /etc/sysconfig/bootsplash ] && . /etc/sysconfig/bootsplash |
7e04fe0e | 60 | |
9e22837c | 61 | if [ -z "$VSERVER" -o "$VSERVER" = "detect" ]; then |
ce397bd8 JR |
62 | { |
63 | while read _f _ctx; do | |
64 | [ "$_f" = "VxID:" -o "$_f" = "s_context:" ] && break | |
65 | done </proc/self/status | |
66 | } 2>/dev/null | |
9e22837c JR |
67 | if [ -z "$_ctx" -o "$_ctx" = "0" ]; then |
68 | VSERVER=no | |
69 | else | |
70 | VSERVER=yes | |
71 | fi | |
55a4bc1b | 72 | unset _f _ctx |
9e22837c JR |
73 | fi |
74 | ||
4132441e ER |
75 | # we need to know in functions if we were called from a terminal |
76 | if [ -z "$ISATTY" ]; then | |
77 | [ -t ] && ISATTY=yes || ISATTY=no | |
9cdf2de7 | 78 | export ISATTY |
4132441e ER |
79 | fi |
80 | ||
18bd13ac | 81 | is_yes() { |
13a745bb | 82 | # Test syntax |
ac1f65e1 | 83 | if [ $# = 0 ]; then |
13a745bb AM |
84 | msg_usage " is_yes {value}" |
85 | return 2 | |
86 | fi | |
87 | ||
88 | # Check value | |
89 | case "$1" in | |
739070c4 | 90 | yes|Yes|YES|true|True|TRUE|on|On|ON|Y|y|1) |
13a745bb AM |
91 | # true returns zero |
92 | return 0 | |
93 | ;; | |
739070c4 | 94 | *) |
13a745bb AM |
95 | # false returns one |
96 | return 1 | |
97 | ;; | |
98 | esac | |
99 | } | |
100 | ||
18bd13ac | 101 | is_no() { |
13a745bb | 102 | # Test syntax |
ac1f65e1 | 103 | if [ $# = 0 ]; then |
13a745bb AM |
104 | msg_usage " is_no {value}" |
105 | return 2 | |
106 | fi | |
107 | ||
108 | case "$1" in | |
739070c4 | 109 | no|No|NO|false|False|FALSE|off|Off|OFF|N|n|0) |
13a745bb AM |
110 | # true returns zero |
111 | return 0 | |
112 | ;; | |
739070c4 | 113 | *) |
13a745bb AM |
114 | # false returns one |
115 | return 1 | |
116 | ;; | |
117 | esac | |
118 | } | |
119 | ||
45e0ac73 ER |
120 | # checks if file is empty |
121 | # empty lines and lines beginning with hash are ignored | |
122 | is_empty_file() { | |
123 | [ -s "$1" ] || return 0 | |
a51d5138 | 124 | grep -vqE "^(#|[[:blank:]]*$)" "$1" && return 1 || return 0 |
45e0ac73 ER |
125 | } |
126 | ||
1626fc86 ER |
127 | # returns OK if $1 contains $2 |
128 | strstr() { | |
4ec13019 ER |
129 | local a=$2 |
130 | [ "${1#*$a*}" = "$1" ] && return 1 | |
1626fc86 ER |
131 | return 0 |
132 | } | |
133 | ||
bc94aa53 | 134 | if is_yes "$FASTRC" || is_yes "$IN_SHUTDOWN"; then |
d84e0c78 JR |
135 | RC_LOGGING=no |
136 | fi | |
137 | ||
bc94aa53 | 138 | if is_no "$RC_LOGGING"; then |
18bd13ac | 139 | initlog() { |
6d0838f4 | 140 | RESULT=0 |
bb49a1c7 | 141 | while [ "$1" != "${1##-}" ]; do |
0a35929a | 142 | case $1 in |
739070c4 | 143 | -c) |
5e6dfc29 JR |
144 | shift |
145 | $1 | |
146 | RESULT=$? | |
147 | break | |
148 | ;; | |
739070c4 | 149 | *) |
5e6dfc29 JR |
150 | shift |
151 | ;; | |
0a35929a AM |
152 | esac |
153 | done | |
6d0838f4 | 154 | return $RESULT |
0a35929a AM |
155 | } |
156 | fi | |
157 | ||
18bd13ac | 158 | kernelver() { |
944d6d80 | 159 | local _x _y _z v old_IFS ver |
55a4bc1b JR |
160 | { |
161 | read _x _y v _z | |
162 | old_IFS=$IFS | |
163 | IFS='.' | |
164 | set -- $v | |
165 | IFS=$old_IFS | |
28d62f54 ER |
166 | |
167 | # strip _* or -* from versions like: "2.6.25_vanilla-1", "2.6.25-1" | |
89ec4154 | 168 | ver=${3%%[-_]*} |
28d62f54 ER |
169 | |
170 | while [ ${#ver} -lt 3 ]; do ver="0$ver"; done | |
55a4bc1b | 171 | ver="$2$ver" |
28d62f54 | 172 | while [ ${#ver} -lt 6 ]; do ver="0$ver"; done |
55a4bc1b | 173 | ver="$1$ver" |
28d62f54 | 174 | while [ ${#ver} -lt 9 ]; do ver="0$ver"; done |
55a4bc1b | 175 | echo $ver |
28d62f54 | 176 | } < /proc/version |
6f2d09b1 AM |
177 | } |
178 | ||
18bd13ac | 179 | kernelverser() { |
944d6d80 | 180 | local _x _y _z v old_IFS ver |
55a4bc1b JR |
181 | { |
182 | read _x _y v _z | |
183 | old_IFS=$IFS | |
184 | IFS='.' | |
185 | set -- $v | |
186 | IFS=$old_IFS | |
187 | ver=$2 | |
ac1f65e1 | 188 | while [ ${#ver} -lt 3 ]; do ver="0$ver"; done |
55a4bc1b | 189 | ver="$1$ver" |
ac1f65e1 | 190 | while [ ${#ver} -lt 6 ]; do ver="0$ver"; done |
55a4bc1b JR |
191 | echo $ver |
192 | } </proc/version | |
6f2d09b1 AM |
193 | } |
194 | ||
18bd13ac | 195 | kernelvermser() { |
944d6d80 | 196 | local _x _y _z v old_IFS ver |
55a4bc1b JR |
197 | { |
198 | read _x _y v _z | |
199 | old_IFS=$IFS | |
200 | IFS='.' | |
201 | set -- $v | |
202 | IFS=$old_IFS | |
203 | ver="$1$ver" | |
ac1f65e1 | 204 | while [ ${#ver} -lt 3 ]; do ver="0$ver"; done |
55a4bc1b JR |
205 | echo $ver |
206 | } </proc/version | |
6f2d09b1 AM |
207 | } |
208 | ||
cee18a41 | 209 | # Colors workaround |
18bd13ac | 210 | termput() { |
4132441e | 211 | is_yes "$ISATTY" || return |
e3aafb2f | 212 | |
294b03eb | 213 | if is_yes "$FASTRC" || is_no "$TPUT"; then |
972964bb | 214 | case "$1" in |
739070c4 | 215 | hpa) |
8a835e11 | 216 | echo -ne "\033[$(($2+1))G" |
972964bb | 217 | ;; |
739070c4 | 218 | cuu*) |
8a835e11 | 219 | echo -ne "\033[${2}A" |
972964bb | 220 | ;; |
739070c4 | 221 | el) |
8a835e11 | 222 | echo -ne "\033[0K" |
972964bb | 223 | ;; |
739070c4 | 224 | setaf) |
944d6d80 | 225 | local ISBOLD |
503bfc80 AM |
226 | if [ -n "$3" ]; then |
227 | ISBOLD="$3" | |
228 | else | |
229 | ISBOLD="$NOBOLD"; | |
230 | fi | |
231 | is_yes "$COLOR_INIT" && echo -ne "\033[${ISBOLD};3${2}m" | |
8a835e11 | 232 | ;; |
739070c4 | 233 | op) |
503bfc80 | 234 | termput setaf $NORMAL |
dcb00bd9 | 235 | ;; |
8a835e11 | 236 | esac |
c6c1bd0c | 237 | else |
8a835e11 | 238 | case "$1" in |
739070c4 | 239 | hpa | cuu* | el) |
8a835e11 | 240 | tput "$@" |
945790a2 | 241 | ;; |
739070c4 | 242 | setaf) |
ac1f65e1 | 243 | if [ "$3" = "1" ]; then tput bold; else tput sgr0; fi |
503bfc80 | 244 | is_yes "$COLOR_INIT" && tput setaf "$2" |
945790a2 | 245 | ;; |
739070c4 | 246 | op) |
503bfc80 | 247 | termput setaf $NORMAL |
945790a2 | 248 | ;; |
8a835e11 | 249 | esac |
c6c1bd0c AF |
250 | fi |
251 | } | |
cee18a41 | 252 | |
0c4f3cf5 ER |
253 | if [ ! -x /bin/printf ]; then |
254 | # printf equivalent | |
255 | # FIXME: buggy when single or double quotes in message! | |
18bd13ac | 256 | printf() { |
944d6d80 | 257 | local text m |
0c4f3cf5 ER |
258 | text="$1" |
259 | shift | |
260 | if [ $# -gt 0 ]; then | |
261 | m="$1" | |
262 | shift | |
263 | while [ $# -gt 0 ]; do | |
264 | m="$m\",\"$1" | |
265 | shift | |
266 | done | |
267 | fi | |
268 | awk "BEGIN {printf \"$text\", \"$m\"; }" | |
269 | } | |
270 | fi | |
8a835e11 | 271 | |
38198f50 | 272 | # National language support function |
18bd13ac | 273 | nls() { |
944d6d80 | 274 | local msg_echo nls_domain text message |
d553f606 | 275 | msg_echo='\n' |
50ed8c3f | 276 | nls_domain="$NLS_DOMAIN" |
e2c2c3a6 | 277 | while [ "$1" != "${1##-}" ]; do |
d553f606 | 278 | case "$1" in |
739070c4 | 279 | --nls-domain) |
8a835e11 | 280 | shift |
50ed8c3f | 281 | nls_domain="$1" |
8a835e11 | 282 | shift |
283 | ;; | |
739070c4 | 284 | -n) |
8a835e11 | 285 | msg_echo='' |
286 | shift | |
287 | ;; | |
d553f606 JR |
288 | esac |
289 | done | |
290 | message="$1" | |
291 | shift | |
50ed8c3f | 292 | |
d553f606 JR |
293 | # empty message, so we return --misiek |
294 | if [ -z "$message" ]; then | |
d553f606 JR |
295 | echo -en "$msg_echo" |
296 | return | |
38198f50 | 297 | fi |
8a835e11 | 298 | |
e2c2c3a6 ER |
299 | if is_yes "$GETTEXT"; then |
300 | message=$(TEXTDOMAINDIR="/etc/sysconfig/locale" gettext -e --domain="${nls_domain:-rc-scripts}" "$message") | |
972964bb | 301 | fi |
8a835e11 | 302 | |
e2c2c3a6 | 303 | printf "$message" "$@" |
d553f606 | 304 | echo -en "$msg_echo" |
38198f50 AM |
305 | } |
306 | ||
18bd13ac | 307 | rc_splash() { |
944d6d80 | 308 | local action="$1" |
862c980c | 309 | |
9e22837c | 310 | if ! is_no "$BOOT_SPLASH" && ! is_yes "$VSERVER"; then |
fae22957 AM |
311 | [ -x /bin/splash ] && /bin/splash "$action" |
312 | fi | |
b6509675 AM |
313 | |
314 | : $((progress++)) | |
fae22957 AM |
315 | } |
316 | ||
18bd13ac | 317 | msg_network_down() { |
228edf1d | 318 | nls "ERROR: Networking is down. %s can't be run." "$1" >&2 |
a916d1c6 | 319 | } |
320 | ||
18bd13ac | 321 | msg_starting() { |
a916d1c6 | 322 | show "Starting %s service" "$1" |
323 | } | |
324 | ||
18bd13ac | 325 | msg_already_running() { |
599d198a | 326 | nls "%s service is already running." "$1" |
a916d1c6 | 327 | } |
328 | ||
18bd13ac | 329 | msg_stopping() { |
a916d1c6 | 330 | show "Stopping %s service" "$1" |
331 | } | |
332 | ||
18bd13ac | 333 | msg_not_running() { |
599d198a | 334 | nls "%s service is not running." "$1" |
a916d1c6 | 335 | } |
336 | ||
18bd13ac | 337 | msg_reloading() { |
a916d1c6 | 338 | show "Reloading %s service" "$1" |
339 | } | |
340 | ||
18bd13ac | 341 | msg_usage() { |
599d198a | 342 | nls "Usage: %s" "$*" |
a916d1c6 | 343 | } |
344 | ||
ffe19b59 | 345 | # Some functions to handle PLD Linux-style messages |
18bd13ac | 346 | show() { |
944d6d80 | 347 | local text len |
0a35929a | 348 | |
ce410bbc JR |
349 | if is_no "$FASTRC" && is_yes "$GETTEXT"; then |
350 | text=$(nls -n "$@") | |
351 | else | |
352 | text=$(printf "$@") | |
353 | fi | |
354 | len=${#text} | |
355 | while [ $((len++)) -lt $INIT_COL ]; do | |
356 | text="$text." | |
357 | done | |
358 | if [ -n "$CHARS" ]; then | |
359 | termput setaf $CCHARS | |
360 | echo -n "$CHARS" | |
361 | termput op | |
362 | fi | |
363 | echo -n "$text" | |
7742e157 AF |
364 | } |
365 | ||
18bd13ac | 366 | deltext() { |
a292b175 ER |
367 | termput hpa $INIT_COL |
368 | } | |
369 | ||
b9cad282 | 370 | # Displays message in square brackests ("[ DONE ]"). Takes two arguments. |
371 | # First is the text to display, second is color number to use (argument to | |
372 | # tput setaf). If second argument is not given, default (2, green) will be | |
373 | # used). | |
18bd13ac | 374 | progress() { |
944d6d80 ER |
375 | local COLOR |
376 | if [ -n "$2" ]; then | |
377 | COLOR="$2" | |
378 | else | |
379 | COLOR="$CDONE" | |
380 | fi | |
cd8dfdf0 | 381 | deltext |
503bfc80 | 382 | echo -n "$(termput setaf $CBRACKETS)[$(termput setaf $COLOR) $(nls --nls-domain rc-scripts "$1") $(termput setaf $CBRACKETS)]$(termput op)" |
b9cad282 | 383 | } |
384 | ||
18bd13ac | 385 | busy() { |
a292b175 | 386 | echo -n "$_busy" |
7742e157 AF |
387 | } |
388 | ||
18bd13ac | 389 | ok() { |
a292b175 | 390 | echo "$_ok" |
7742e157 AF |
391 | } |
392 | ||
18bd13ac | 393 | started() { |
a292b175 | 394 | echo "$_started" |
7e04fe0e | 395 | } |
396 | ||
18bd13ac | 397 | fail() { |
a292b175 | 398 | echo "$_fail" |
d553f606 | 399 | return 1 |
7742e157 AF |
400 | } |
401 | ||
18bd13ac | 402 | died() { |
a292b175 | 403 | echo "$_died" |
d553f606 | 404 | return 1 |
6cac3cb2 | 405 | } |
406 | ||
bbb612de | 407 | # Check if $pid (could be plural) are running |
18bd13ac | 408 | checkpid() { |
8a835e11 | 409 | while [ "$1" ]; do |
410 | [ -d "/proc/$1" ] && return 0 | |
411 | shift | |
412 | done | |
413 | return 1 | |
bbb612de AM |
414 | } |
415 | ||
290eb891 AM |
416 | # - outside chroot get only those processes, which are outside chroot. |
417 | # - inside chroot get only those processes, which are inside chroot. | |
418 | # - don't filter out pids which do not have corresponding running processes (process died etc) | |
1e5e8177 | 419 | # (note: some processes like named are chrooted but run outside chroot) |
c3403882 | 420 | # - do nothing inside vserver |
18bd13ac | 421 | filter_chroot() { |
c3403882 JR |
422 | if is_yes "$VSERVER"; then |
423 | echo $@ | |
424 | return | |
425 | fi | |
ac1f65e1 | 426 | if [ $# -lt 1 -o ! -d /proc/1 ]; then |
8e3b6875 AM |
427 | echo $@ |
428 | return | |
429 | fi | |
33ca787f | 430 | local root_dir good_pids="" good_add_pid |
1e5e8177 AM |
431 | for root_pid in $@; do |
432 | root_dir=$(resolvesymlink /proc/${root_pid}/root) | |
433 | if [ -n "$root_dir" ]; then | |
5a8ff397 AM |
434 | good_add_pid=1 |
435 | if [ -n "${SYSTEM_CHROOTS}" ]; then | |
436 | for r_dir in ${SYSTEM_CHROOTS}; do | |
437 | echo "$root_dir" | grep -q "^${r_dir}" && good_add_pid=0 | |
438 | done | |
439 | fi | |
440 | [ "$good_add_pid" -eq 1 ] && good_pids="$good_pids $root_pid" | |
290eb891 AM |
441 | elif [ ! -d "/proc/$root_pid" ]; then |
442 | good_pids="$good_pids $root_pid" | |
1e5e8177 | 443 | fi |
5a8ff397 AM |
444 | done |
445 | echo $good_pids | |
1e5e8177 AM |
446 | } |
447 | ||
cee18a41 | 448 | # Usage run_cmd Message command_to_run |
18bd13ac | 449 | run_cmd() { |
944d6d80 ER |
450 | local exit_code errors message force_err |
451 | local force_err=0 exit_code=0 | |
d553f606 | 452 | case "$1" in |
739070c4 | 453 | -a) |
8a835e11 | 454 | force_err=1 |
455 | shift | |
456 | ;; | |
d553f606 JR |
457 | esac |
458 | message=$1 | |
459 | show "$message"; busy | |
1b228409 | 460 | shift |
90c59319 | 461 | cd / |
f10f2102 ER |
462 | if errors=$( |
463 | export HOME=/tmp TMPDIR=/tmp | |
464 | if is_no "$RC_LOGGING"; then | |
465 | "$@" 2>&1 | |
466 | else | |
467 | initlog -c "$*" 2>&1 | |
468 | fi | |
469 | ); then | |
cd8dfdf0 | 470 | ok |
d553f606 | 471 | log_success "$1 $message" |
1b228409 | 472 | else |
d553f606 JR |
473 | fail |
474 | log_failed "$1 $message" | |
b7299ffc | 475 | exit_code=1 |
1b228409 | 476 | fi |
d553f606 | 477 | [ -n "$errors" ] && [ $exit_code -eq 1 -o $force_err -eq 1 ] && echo "$errors" |
1b228409 | 478 | return $exit_code |
cee18a41 AM |
479 | } |
480 | ||
e81194ca | 481 | _daemon_set_ulimits() { |
0fba6fe4 ER |
482 | local opt val ksh=${KSH_VERSION:+1} |
483 | set -- ${SERVICE_LIMITS:-$DEFAULT_SERVICE_LIMITS} | |
484 | while [ $# -gt 0 ]; do | |
485 | opt=$1 | |
486 | val=$2 | |
487 | if [ "$ksh" ]; then | |
488 | case "$opt" in | |
489 | -Hu) | |
490 | opt=-Hp | |
491 | ;; | |
492 | -Su) | |
493 | opt=-Sp | |
494 | ;; | |
495 | -u) | |
496 | opt=-p | |
497 | ;; | |
498 | esac | |
499 | fi | |
500 | ulimit $opt $val | |
501 | shift 2 | |
502 | done | |
e81194ca ER |
503 | } |
504 | ||
e2e24f5a | 505 | # A function to start a program (now it's useful on read-only filesystem too) |
18bd13ac | 506 | daemon() { |
944d6d80 ER |
507 | local errors="" prog="" end="" waitname="" waittime="" |
508 | local exit_code=0 | |
42595a81 | 509 | local nice=$SERVICE_RUN_NICE_LEVEL |
a160c01b | 510 | local fork user closefds pidfile makepid chdir=/ |
42595a81 ER |
511 | |
512 | while [ $# -gt 0 ]; do | |
d553f606 | 513 | case $1 in |
739070c4 | 514 | '') |
a160c01b | 515 | msg_usage " daemon [--check] [--user user] [--fork] [--chdir directory] [--closefds] [--waitforname procname] [--waitfortime seconds] [--pidfile file] [--makepid] [+/-nicelevel] {program} <program args>" |
8a835e11 | 516 | return 2 |
d553f606 | 517 | ;; |
739070c4 | 518 | --check) |
d553f606 JR |
519 | # for compatibility with redhat/mandrake |
520 | nls "warning: --check option is ignored!" | |
521 | shift | |
d553f606 | 522 | ;; |
739070c4 | 523 | --user) |
d553f606 | 524 | shift |
7b1a2a70 | 525 | [ "$1" != "root" ] && prog="/bin/su $1 -s /bin/sh -c \"" |
f10f2102 | 526 | user=$1 |
d553f606 | 527 | ;; |
739070c4 ER |
528 | --fork) |
529 | fork=1 | |
b486c392 ER |
530 | prog="/usr/bin/setsid sh -c \"" |
531 | end='&' | |
b486c392 | 532 | ;; |
6b1fd029 ER |
533 | --chdir) |
534 | shift | |
535 | chdir=$1 | |
536 | ;; | |
739070c4 ER |
537 | --closefds) |
538 | closefds=1 | |
f10f2102 | 539 | ;; |
739070c4 | 540 | --waitforname) |
b486c392 | 541 | shift |
683d384e | 542 | waitname="$1" |
683d384e | 543 | ;; |
739070c4 | 544 | --waitfortime) |
b486c392 | 545 | shift |
683d384e | 546 | waittime="$1" |
683d384e | 547 | ;; |
739070c4 | 548 | --pidfile) |
0a177614 ER |
549 | shift |
550 | pidfile="$1" | |
f2dd2d31 | 551 | [[ "$pidfile" != /* ]] && pidfile="/var/run/$pidfile" |
0a177614 | 552 | ;; |
a160c01b PG |
553 | --makepid) |
554 | makepid=1 | |
555 | ;; | |
739070c4 | 556 | -*|+*) |
42595a81 | 557 | nice=$1 |
a6e727aa | 558 | shift |
42595a81 ER |
559 | break |
560 | ;; | |
739070c4 | 561 | *) |
42595a81 | 562 | break |
683d384e | 563 | ;; |
d553f606 | 564 | esac |
42595a81 | 565 | shift |
d553f606 | 566 | done |
2eea8492 | 567 | # If command to execute ends with quotation mark, add remaining |
568 | # arguments and close quotation. | |
569 | if [ "$prog" != "${prog%\"}" ]; then | |
565736ed | 570 | prog="$prog $*$end\"" |
2eea8492 | 571 | else |
565736ed | 572 | prog="$prog $*$end" |
2eea8492 | 573 | fi |
7742e157 | 574 | |
e81194ca | 575 | _daemon_set_ulimits |
f054a85e | 576 | |
3edf5e48 | 577 | [ -z "$DEFAULT_SERVICE_UMASK" ] && DEFAULT_SERVICE_UMASK=022 |
42595a81 | 578 | [ -z "$DEFAULT_SERVICE_RUN_NICE_LEVEL" ] && DEFAULT_SERVICE_RUN_NICE_LEVEL=0 |
3edf5e48 | 579 | |
7742e157 AF |
580 | # And start it up. |
581 | busy | |
6b1fd029 | 582 | cd $chdir |
42595a81 | 583 | [ -n "$SERVICE_CPUSET" ] && is_yes "$CPUSETS" && echo $$ > "/dev/cpuset/${SERVICE_CPUSET}/tasks" |
18bd13ac | 584 | if errors=$( |
f10f2102 | 585 | umask ${SERVICE_UMASK:-$DEFAULT_SERVICE_UMASK}; |
739070c4 | 586 | export USER=root HOME=/tmp TMPDIR=/tmp |
f10f2102 ER |
587 | nice=${nice:-$DEFAULT_SERVICE_RUN_NICE_LEVEL} |
588 | nice=${nice:-0} | |
589 | ||
590 | if [ "$closefds" = 1 ]; then | |
591 | exec 1>&- | |
592 | exec 2>&- | |
593 | exec 0>&- | |
594 | else | |
595 | exec 2>&1 | |
596 | fi | |
597 | ||
ac1f65e1 | 598 | if is_no "$RC_LOGGING"; then |
f10f2102 ER |
599 | prog=$1; shift |
600 | if [ ! -x $prog ]; then | |
601 | logger -t rc-scripts -p daemon.debug "daemon: Searching PATH for $prog, consider using full path in initscript" | |
602 | local a o=$IFS | |
603 | IFS=: | |
604 | for a in $PATH; do | |
605 | if [ -x $a/$prog ]; then | |
606 | prog=$a/$prog | |
607 | break | |
608 | fi | |
609 | done | |
610 | IFS=$o | |
611 | fi | |
612 | /sbin/start-stop-daemon -q --start \ | |
613 | --nicelevel $nice \ | |
614 | ${pidfile:+--pidfile $pidfile} \ | |
86ed0b8f | 615 | ${makepid:+--make-pidfile} \ |
8a5b611f | 616 | ${user:+--chuid $user} \ |
6b1fd029 | 617 | ${chdir:+--chdir "$chdir"} \ |
86ed0b8f TP |
618 | ${fork:+--background} \ |
619 | ${waitname:+--name $waitname} \ | |
f10f2102 ER |
620 | --exec "$prog" \ |
621 | -- ${1:+"$@"} | |
622 | else | |
623 | nice -n $nice initlog -c "$prog" 2>&1 | |
624 | fi | |
18bd13ac | 625 | ); then |
f10f2102 | 626 | |
683d384e AM |
627 | if [ -n "$waitname" -a -n "$waittime" ]; then |
628 | # Save basename. | |
03e01a49 | 629 | base=${waitname##*/} |
683d384e AM |
630 | # Find pid. |
631 | pid=$(pidofproc "$waitname" "$pidfile") | |
632 | [ -z "$pid" ] && pid=$(pidofproc "$base" "$pidfile") | |
633 | i=0 | |
634 | while [ "$i" -lt "$waittime" ]; do | |
42595a81 | 635 | i=$((i + 1)) |
683d384e AM |
636 | checkpid $pid && sleep 1 || break |
637 | done | |
638 | fi | |
d553f606 | 639 | log_success "$1 startup" |
1b228409 | 640 | ok |
7742e157 | 641 | else |
b7299ffc | 642 | exit_code=1 |
1b228409 | 643 | fail |
d553f606 | 644 | log_failed "$1 startup" |
4fbe82fd | 645 | [ -n "$errors" ] && echo >&2 "$errors" |
7742e157 | 646 | fi |
b7299ffc | 647 | return $exit_code |
7742e157 AF |
648 | } |
649 | ||
650 | # A function to stop a program. | |
18bd13ac | 651 | killproc() { |
944d6d80 | 652 | local notset killlevel base pid pidfile result |
7742e157 AF |
653 | # Test syntax. |
654 | if [ $# = 0 ]; then | |
3fa0b8fe | 655 | msg_usage " killproc [--pidfile PIDFILE] {program} [-SIGNAME]" |
228edf1d | 656 | return 2 |
7742e157 AF |
657 | fi |
658 | ||
bb49a1c7 | 659 | while [ "$1" != "${1##-}" ]; do |
8de7f381 | 660 | case $1 in |
739070c4 | 661 | --pidfile) |
53ae90e8 | 662 | pidfile="$2" |
f2dd2d31 | 663 | [[ "$pidfile" != /* ]] && pidfile="/var/run/$pidfile" |
53ae90e8 | 664 | shift 2 |
8de7f381 | 665 | ;; |
739070c4 | 666 | --waitforname) |
53ae90e8 ER |
667 | waitname="$2" |
668 | shift 2 | |
683d384e | 669 | ;; |
739070c4 | 670 | --waitfortime) |
53ae90e8 ER |
671 | waittime="$2" |
672 | shift 2 | |
683d384e | 673 | ;; |
8de7f381 AM |
674 | esac |
675 | done | |
676 | ||
7742e157 | 677 | busy |
8a835e11 | 678 | |
944d6d80 | 679 | local notset=0 |
7742e157 | 680 | # check for second arg to be kill level |
ac1f65e1 | 681 | if [ -n "$2" ]; then |
7742e157 AF |
682 | killlevel=$2 |
683 | else | |
684 | notset=1 | |
7742e157 AF |
685 | fi |
686 | ||
2f269bdf ER |
687 | # experimental start-stop-daemon based killing. |
688 | # works only with pidfile | |
689 | if is_no "$RC_LOGGING" && [ "$pidfile" ]; then | |
5ec58ec2 | 690 | local sig=${killlevel:--TERM} |
2f269bdf ER |
691 | /sbin/start-stop-daemon --stop \ |
692 | --retry ${sig#-}/10/${sig#-}/60/KILL/10 \ | |
693 | -s ${sig#-} \ | |
694 | ${pidfile:+--pidfile $pidfile} | |
695 | result=$? | |
696 | if [ "$result" -eq 0 ]; then | |
697 | ok | |
698 | else | |
699 | fail | |
700 | fi | |
701 | return $result | |
702 | fi | |
703 | ||
704 | ||
228edf1d | 705 | # Save basename. |
03e01a49 | 706 | base=${1##*/} |
7742e157 | 707 | |
228edf1d | 708 | # Find pid. |
8de7f381 AM |
709 | pid=$(pidofproc "$1" "$pidfile") |
710 | [ -z "$pid" ] && pid=$(pidofproc "$base" "$pidfile") | |
7742e157 | 711 | |
228edf1d | 712 | # Kill it. |
ac1f65e1 TP |
713 | if [ -n "$pid" -a "$pid" != "$$" ] && checkpid $pid 2>&1; then |
714 | if [ "$notset" = "1" ]; then | |
228edf1d | 715 | if checkpid $pid 2>&1; then |
716 | # TERM first, then KILL if not dead | |
717 | kill -TERM $pid | |
718 | usleep 100000 | |
719 | if checkpid $pid && sleep 1 && | |
720 | checkpid $pid && sleep 3 && | |
721 | checkpid $pid; then | |
53ae90e8 ER |
722 | # XXX: SIGKILL is sent already on 4th second! |
723 | # HARMFUL for example to mysqld (which is already workarounded) | |
228edf1d | 724 | kill -KILL $pid |
725 | usleep 100000 | |
726 | fi | |
7742e157 | 727 | fi |
228edf1d | 728 | checkpid $pid |
bbb612de AM |
729 | result=$? |
730 | if [ "$result" -eq 0 ]; then | |
228edf1d | 731 | fail |
732 | log_failed "$1 shutdown" | |
733 | else | |
734 | ok | |
735 | log_success "$1 shutdown" | |
736 | fi | |
737 | result=$(( ! $result )) | |
738 | else | |
739 | # use specified level only | |
740 | if checkpid $pid > /dev/null 2>&1; then | |
741 | kill $killlevel $pid | |
742 | result=$? | |
743 | if [ "$result" -eq 0 ]; then | |
744 | ok | |
745 | log_success "$1 got $killlevel" | |
746 | else | |
747 | result=7 | |
748 | fail | |
749 | log_failed "$1 didn't get $killlevel" | |
750 | fi | |
e016cdae | 751 | else |
228edf1d | 752 | result=7 |
753 | died | |
754 | log_failed "$1 shutdown" | |
e016cdae | 755 | fi |
7742e157 AF |
756 | fi |
757 | else | |
228edf1d | 758 | died |
759 | log_failed "$1 shutdown" | |
760 | result=7 | |
7742e157 | 761 | fi |
5e6dfc29 | 762 | |
683d384e | 763 | if [ -n "$waitname" -a -n "$waittime" ]; then |
e6f93a80 | 764 | # Save basename. |
03e01a49 | 765 | base=${waitname##*/} |
e6f93a80 AM |
766 | # Find pid. |
767 | pid=$(pidofproc "$waitname" "$pidfile") | |
768 | [ -z "$pid" ] && pid=$(pidofproc "$base" "$pidfile") | |
683d384e AM |
769 | i=0 |
770 | while [ "$i" -lt "$waittime" ]; do | |
1101d321 | 771 | i=$(( i + 1 )) |
683d384e AM |
772 | checkpid $pid && sleep 1 || break |
773 | done | |
774 | fi | |
7742e157 | 775 | |
228edf1d | 776 | # Remove pid file if any. |
e016cdae | 777 | if [ "$notset" = "1" ]; then |
228edf1d | 778 | rm -f /var/run/${base}.pid |
7742e157 | 779 | fi |
bbb612de AM |
780 | |
781 | return $result | |
7742e157 AF |
782 | } |
783 | ||
784 | # A function to find the pid of a program. | |
18bd13ac | 785 | pidofproc() { |
944d6d80 | 786 | local pid pidfile base=${1##*/} |
8de7f381 AM |
787 | pidfile="$base.pid" |
788 | [ -n "$2" ] && pidfile="$2" | |
7742e157 | 789 | |
8a835e11 | 790 | # Test syntax. |
ac1f65e1 | 791 | if [ $# = 0 ]; then |
8a835e11 | 792 | msg_usage " pidofproc {program}" |
793 | return 2 | |
794 | fi | |
795 | ||
8de7f381 | 796 | # First try pidfile or "/var/run/*.pid" |
f955cf0f | 797 | if [[ "$pidfile" = /* ]]; then |
1c26fe27 AM |
798 | pidfile="${pidfile}" |
799 | else | |
800 | pidfile="/var/run/${pidfile}"; | |
801 | fi | |
ac1f65e1 | 802 | if [ -f "${pidfile}" ]; then |
944d6d80 | 803 | local p pid="" |
7eb94de6 | 804 | for p in $(< "${pidfile}"); do |
3030e60e | 805 | [ -z "$(echo "$p" | awk '{gsub(/[0-9]/,"");print;}')" ] && pid="$pid $p" |
8a835e11 | 806 | done |
7742e157 | 807 | fi |
8a835e11 | 808 | |
7742e157 | 809 | # Next try "pidof" |
1e5e8177 AM |
810 | [ -z "$pid" ] && pidof -o $$ -o $PPID -o %PPID -x "$1" |
811 | pid=$(filter_chroot "$pid") | |
812 | echo $pid | |
7742e157 | 813 | } |
12de71be | 814 | |
18bd13ac | 815 | status() { |
944d6d80 | 816 | local pid subsys daemon cpuset_msg pidfile |
4e901aa0 ER |
817 | if [ "$1" = "--pidfile" ]; then |
818 | pidfile=$2 | |
f2dd2d31 | 819 | [[ "$pidfile" != /* ]] && pidfile="/var/run/$pidfile" |
4e901aa0 ER |
820 | shift 2 |
821 | fi | |
822 | ||
8a835e11 | 823 | subsys=$1 |
824 | daemon=${2:-$subsys} | |
bbb612de | 825 | |
8a835e11 | 826 | # Test syntax. |
ac1f65e1 | 827 | if [ $# = 0 ]; then |
4e901aa0 | 828 | msg_usage " status [--pidfile PIDFILE] {subsys} [{daemon}]" |
8a835e11 | 829 | return 2 |
830 | fi | |
bbb612de | 831 | |
4e901aa0 ER |
832 | # if pidfile specified, pid must be there |
833 | if [ "$pidfile" -a -f "$pidfile" ]; then | |
834 | read pid < $pidfile | |
835 | else | |
836 | pid=$(pidof -o $$ -o $PPID -o %PPID -x $daemon) | |
837 | fi | |
1e5e8177 | 838 | pid=$(filter_chroot "$pid") |
bbb612de | 839 | |
b90fbc1e | 840 | if [ "$pid" ]; then |
814e38ce | 841 | cpuset_msg="..." |
b90fbc1e | 842 | if [ -n "$SERVICE_CPUSET" ] && is_yes "$CPUSETS" ]; then |
6c99c680 | 843 | if $(grep -q "$pid" "/dev/cpuset/${SERVICE_CPUSET}/tasks"); then |
814e38ce JR |
844 | cpuset_msg=$(nls " in cpuset %s..." "$SERVICE_CPUSET") |
845 | else | |
846 | cpuset_msg=$(nls " outside of configured cpuset %s..." "$SERVICE_CPUSET") | |
847 | fi | |
848 | fi | |
849 | nls "%s (pid %s) is running%s" "$daemon" "$pid" "$cpuset_msg" | |
8a835e11 | 850 | return 0 |
8a835e11 | 851 | fi |
852 | ||
853 | # Next try "/var/run/*.pid" files | |
4e901aa0 | 854 | local base=${daemon##*/} |
8a835e11 | 855 | if [ -f /var/run/${base}.pid ]; then |
856 | read pid < /var/run/${base}.pid | |
1e5e8177 | 857 | pid=$(filter_chroot "$pid") |
8a835e11 | 858 | if [ "$pid" != "" ]; then |
859 | nls "%s dead but pid file exists" "$subsys" | |
860 | return 1 | |
861 | fi | |
862 | fi | |
863 | ||
864 | # See if /var/lock/subsys/$subsys exists | |
865 | if [ -f /var/lock/subsys/$subsys ]; then | |
866 | nls "%s dead but subsys locked" "$subsys" | |
867 | return 2 | |
7742e157 | 868 | fi |
8a835e11 | 869 | nls "%s is stopped" "$subsys" |
870 | return 3 | |
7742e157 | 871 | } |
0524c81f | 872 | |
6b4a354c AM |
873 | # Confirm whether we really want to run this service |
874 | confirm() { | |
944d6d80 | 875 | local answer |
d553f606 | 876 | nls -n "Start service %s (Y)es/(N)o/(C)ontinue? [Y] " "$1" |
6b4a354c AM |
877 | read answer |
878 | case $answer in | |
739070c4 | 879 | y|Y|t|T|j|J|"") |
8a835e11 | 880 | return 0 |
6b4a354c | 881 | ;; |
739070c4 | 882 | c|C|k|K|w|W) |
8a835e11 | 883 | return 2 |
6b4a354c | 884 | ;; |
739070c4 | 885 | n|N) |
8a835e11 | 886 | return 1 |
6b4a354c | 887 | ;; |
739070c4 | 888 | *) |
8a835e11 | 889 | confirm $1 |
890 | return $? | |
6b4a354c AM |
891 | ;; |
892 | esac | |
893 | } | |
894 | ||
d553f606 | 895 | # module is needed (ie. is requested, is available and isn't loaded already) |
18bd13ac | 896 | is_module() { |
d553f606 | 897 | # module name without .o at end |
5778a670 ER |
898 | if ! lsmod | grep -q "$1"; then |
899 | if ls -R /lib/modules/$(uname -r)/ 2> /dev/null | grep -q "${1}.\(\|k\)o\(\|.gz\)"; then | |
d553f606 JR |
900 | # true |
901 | return 0 | |
902 | fi | |
903 | fi | |
904 | # false | |
905 | return 1 | |
0524c81f | 906 | } |
f7b2d235 | 907 | |
18bd13ac | 908 | _modprobe() { |
944d6d80 | 909 | local parsed single die args foo result |
f7b2d235 | 910 | parsed=no |
ac1f65e1 | 911 | while is_no "$parsed"; do |
f7b2d235 | 912 | case "$1" in |
739070c4 | 913 | "single") |
8a835e11 | 914 | single=yes |
915 | shift | |
916 | ;; | |
739070c4 | 917 | "die") |
8a835e11 | 918 | die=yes |
919 | shift | |
920 | ;; | |
739070c4 | 921 | -*) |
8a835e11 | 922 | args="$args $1" |
923 | shift | |
924 | ;; | |
739070c4 | 925 | *) |
8a835e11 | 926 | parsed=yes |
927 | ;; | |
f7b2d235 JR |
928 | esac |
929 | done | |
ac1f65e1 | 930 | if is_yes "${single}"; then |
f7b2d235 JR |
931 | foo="$@" |
932 | show "Loading %s kernel module(s)" "$foo" | |
f7b2d235 JR |
933 | busy |
934 | fi | |
ac1f65e1 | 935 | if [ -x /sbin/modprobe ]; then |
f7b2d235 JR |
936 | /sbin/modprobe -s $args "$@" |
937 | result=$? | |
938 | else | |
ac1f65e1 | 939 | deltext; fail |
f7b2d235 JR |
940 | result=1 |
941 | fi | |
ac1f65e1 | 942 | if is_yes "${single}"; then |
f7b2d235 | 943 | deltext |
ac1f65e1 | 944 | if [ $result = "0" ]; then |
d553f606 | 945 | is_yes "$single" && ok |
f7b2d235 JR |
946 | else |
947 | fail | |
ac1f65e1 | 948 | if is_yes "$die"; then |
f7b2d235 JR |
949 | nls "Could not load %s kernel module(s)" "$@" |
950 | exit 1 | |
951 | fi | |
952 | fi | |
953 | fi | |
f7b2d235 | 954 | } |
d553f606 | 955 | |
bc94aa53 ER |
956 | if is_no "$RC_LOGGING"; then |
957 | log_success() { | |
958 | : | |
959 | } | |
d553f606 | 960 | |
18bd13ac | 961 | log_failed() { |
bc94aa53 ER |
962 | : |
963 | } | |
964 | else | |
18bd13ac | 965 | log_success() { |
bc94aa53 ER |
966 | initlog -n $0 -s "$1 $2" -e 1 |
967 | } | |
968 | ||
18bd13ac | 969 | log_failed() { |
bc94aa53 ER |
970 | initlog -n $0 -s "$1 $2" -e 2 |
971 | } | |
972 | fi | |
d553f606 | 973 | |
f0c296a0 JR |
974 | # Check if any flavor of portmapper is running |
975 | check_portmapper() { | |
cbb91a00 ER |
976 | if [ -x /usr/sbin/rpcinfo ]; then |
977 | if /usr/sbin/rpcinfo -p localhost >/dev/null 2>/dev/null; then | |
fd8737b5 | 978 | return 0 |
f0c296a0 JR |
979 | else |
980 | return 1 | |
981 | fi | |
982 | elif [ -x /sbin/pidof ]; then | |
f74fbf2c | 983 | [ -z "$(/sbin/pidof portmap)" -a \ |
739070c4 | 984 | -z "$(/sbin/pidof rpcbind)" ] && return 1 |
f0c296a0 JR |
985 | fi |
986 | return 0 | |
987 | } | |
988 | ||
fab8c1a1 JR |
989 | # is_fsmounted fstype mntpoint |
990 | # Check if filesystem fstype is mounted on mntpoint | |
991 | is_fsmounted() { | |
944d6d80 ER |
992 | local fstype=$1 |
993 | local mntpoint=$2 | |
fab8c1a1 JR |
994 | |
995 | [ -n "$fstype" -a -n "$mntpoint" ] || return 1 | |
996 | ||
81ebaa15 | 997 | if [ -r /proc/mounts ]; then |
bfd0227f | 998 | grep -qE "[[:blank:]]$mntpoint[[:blank:]]+$fstype[[:blank:]]" /proc/mounts |
81ebaa15 | 999 | return $? |
fab8c1a1 | 1000 | else |
81ebaa15 JR |
1001 | if [ "$(/bin/stat -L -f -c %T $mntpoint 2>/dev/null)" = "$fstype" ]; then |
1002 | return 0 | |
1003 | else | |
1004 | return 1 | |
1005 | fi | |
fab8c1a1 JR |
1006 | fi |
1007 | } | |
1008 | ||
0084dcf3 | 1009 | rc_cache_init() { |
6e311c54 ER |
1010 | # If we have cachefile, use it. |
1011 | # If we don't, create memory variables and try to save silently, | |
acf05b4f | 1012 | local cachefile='/var/cache/rc-scripts/msg.cache' |
0084dcf3 | 1013 | |
4132441e ER |
1014 | local term |
1015 | if is_yes "$ISATTY"; then | |
1016 | term=$TERM | |
1017 | else | |
1018 | term=dumb | |
1019 | fi | |
1020 | ||
0084dcf3 ER |
1021 | # We create $check variable which is used to invalidate the cache. |
1022 | # The $check contains user locale and terminal. | |
66f7cfac | 1023 | local check="$term.$LC_MESSAGES.$INIT_COL" |
0084dcf3 | 1024 | |
f9df72e7 | 1025 | if [ -f "$cachefile" -a "$cachefile" -nt /etc/sysconfig/system -a "$cachefile" -nt /etc/sysconfig/init-colors ]; then |
0084dcf3 ER |
1026 | if . "$cachefile" 2>/dev/null; then |
1027 | if [ "$check" = "$_check" ]; then | |
1028 | return | |
1029 | fi | |
1030 | fi | |
f9df72e7 ER |
1031 | fi |
1032 | ||
1033 | # primitive caching | |
1034 | _busy=$(progress "BUSY" "$CBUSY") | |
1035 | _ok=$(progress "DONE") | |
1036 | _started=$(progress "WORK") | |
1037 | _fail=$(progress "FAIL" "$CFAIL") | |
1038 | _died=$(progress "DIED" "$CFAIL") | |
cc54351b ER |
1039 | |
1040 | # we don't use heredoc, as ksh attempts to create tempfile then | |
3ba0bc12 | 1041 | (> "$cachefile" ) 2>/dev/null || return |
cc54351b ER |
1042 | echo "_busy='$_busy';" >> "$cachefile" |
1043 | echo "_ok='$_ok';" >> "$cachefile" | |
1044 | echo "_started='$_started';" >> "$cachefile" | |
1045 | echo "_fail='$_fail';" >> "$cachefile" | |
1046 | echo "_died='$_died';" >> "$cachefile" | |
1047 | echo "_check='$check';" >> "$cachefile" | |
f9df72e7 ER |
1048 | } |
1049 | ||
0084dcf3 | 1050 | rc_gettext_init() { |
9a0a016d ER |
1051 | if [ -z "$GETTEXT" ]; then |
1052 | if [ -x /bin/gettext -o -x /usr/bin/gettext ]; then | |
1053 | GETTEXT=yes | |
1054 | else | |
1055 | GETTEXT=no | |
1056 | fi | |
1057 | fi | |
1058 | ||
1059 | if [ -z "$TPUT" ]; then | |
ac1f65e1 | 1060 | if [ -d /usr/share/terminfo ] && [ -x /usr/bin/tput -o -x /bin/tput ]; then |
9a0a016d ER |
1061 | TPUT=yes |
1062 | # check if we are on proper terminal | |
1063 | tput longname >/dev/null 2>&1 || TPUT=no | |
1064 | else | |
1065 | TPUT=no | |
1066 | fi | |
1067 | fi | |
1068 | } | |
1069 | ||
0084dcf3 ER |
1070 | rc_gettext_init |
1071 | rc_cache_init | |
f9df72e7 | 1072 | |
bbb612de AM |
1073 | #/* |
1074 | # * Local variables: | |
1075 | # * mode: sh | |
1076 | # * indent-tabs-mode: notnil | |
1077 | # * End: | |
1078 | # * | |
bbb612de | 1079 | # */ |