/[baselayout]/trunk/sh/net.sh
Gentoo

Contents of /trunk/sh/net.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2712 - (hide annotations) (download) (as text)
Fri May 18 20:09:10 2007 UTC (10 years, 6 months ago) by uberlord
File MIME type: text/x-sh
File size: 12936 byte(s)
Be more resilient when the nettree is invalid
1 uberlord 2547 #!/sbin/runscript
2     # Copyright 1999-2007 Gentoo Foundation
3     # Distributed under the terms of the GNU General Public License v2
4    
5     MODULESDIR="${RC_LIBDIR}/net"
6     MODULESLIST="${RC_SVCDIR}/nettree"
7 uberlord 2565 _config_vars="config routes"
8 uberlord 2547
9     [ -z "${IN_BACKGROUND}" ] && IN_BACKGROUND=false
10    
11     depend() {
12 uberlord 2675 local IFACE=${SVCNAME#*.}
13     local IFVAR=$(echo -n "${IFACE}" | sed -e 's/[^[:alnum:]]/_/g')
14 uberlord 2547
15 uberlord 2675 need localmount
16 uberlord 2547 after bootmisc
17 uberlord 2675 provide net
18     case "${IFACE}" in
19 uberlord 2547 lo|lo0) ;;
20     *)
21     after net.lo net.lo0
22     local prov=
23     eval prov=\$RC_NEED_${IFVAR}
24     [ -n "${prov}" ] && need ${prov}
25     eval prov=\$RC_USE_${IFVAR}
26     [ -n "${prov}" ] && use ${prov}
27     eval prov=\$RC_BEFORE_${IFVAR}
28     [ -n "${prov}" ] && before ${prov}
29     eval prov=\$RC_AFTER_${IFVAR}
30     [ -n "${prov}" ] && after ${prov}
31     eval prov=\$RC_PROVIDE_${IFVAR}
32     [ -n "${prov}" ] && provide ${prov}
33     ;;
34 uberlord 2675 esac
35 uberlord 2547 }
36    
37     _shell_var() {
38 uberlord 2675 echo -n "$1" | sed -e 's/[^[:alnum:]]/_/g'
39 uberlord 2547 }
40    
41     # Credit to David Leverton for this function which handily maps a bash array
42     # structure to positional parameters so existing configs work :)
43     # We'll deprecate arrays at some point though.
44     _get_array() {
45 uberlord 2675 if [ -n "${BASH}" ] ; then
46 uberlord 2547 case "$(declare -p "$1" 2>/dev/null)" in
47 uberlord 2675 "declare -a "*)
48     echo "set -- \"\${$1[@]}\""
49     return
50     ;;
51 uberlord 2547 esac
52 uberlord 2675 fi
53 uberlord 2547
54 uberlord 2675 echo "eval set -- \"\$$1\""
55 uberlord 2547 }
56    
57     _wait_for_carrier() {
58 uberlord 2675 local timeout= efunc=einfon
59 uberlord 2547
60 uberlord 2675 _has_carrier && return 0
61 uberlord 2547
62 uberlord 2675 eval timeout=\$carrier_timeout_${IFVAR}
63     timeout=${timeout:-${carrier_timeout:-5}}
64 uberlord 2547
65 uberlord 2668 # Incase users don't want this nice feature ...
66     [ ${timeout} -le 0 ] && return 0
67    
68 uberlord 2675 [ -n "${RC_EBUFFER}" -o "${RC_PREFIX}" = "yes" ] && efunc=einfo
69     ${efunc} "Waiting for carrier (${timeout} seconds) "
70     while [ ${timeout} -gt 0 ] ; do
71 uberlord 2547 sleep 1
72     if _has_carrier ; then
73 uberlord 2675 [ -z "${RC_EBUFFER}" ] && echo
74 uberlord 2574 eend 0
75 uberlord 2675 return 0
76 uberlord 2547 fi
77     timeout=$((${timeout} - 1))
78 uberlord 2668 [ -z "${RC_EBUFFER}" -a "${RC_PREFIX}" != "yes" ] && printf "."
79 uberlord 2675 done
80 uberlord 2547
81 uberlord 2675 [ -z "${RC_EBUFFER}" -a "${RC_PREFIX}" != "yes" ] && echo
82 uberlord 2574 eend 1
83 uberlord 2675 return 1
84 uberlord 2547 }
85    
86     _netmask2cidr() {
87 uberlord 2675 local i= len=0
88 uberlord 2547
89 uberlord 2675 local IFS=.
90     for i in $1; do
91 uberlord 2547 while [ ${i} != "0" ] ; do
92 uberlord 2675 len=$((${len} + ${i} % 2))
93     i=$((${i} >> 1))
94 uberlord 2547 done
95 uberlord 2675 done
96 uberlord 2547
97 uberlord 2675 echo "${len}"
98 uberlord 2547 }
99    
100     _configure_variables() {
101 uberlord 2675 local var= v= t=
102 uberlord 2547
103 uberlord 2675 for var in ${_config_vars} ; do
104 uberlord 2547 local v=
105     for t in "$@" ; do
106 uberlord 2675 eval v=\$${var}_${t}
107     if [ -n "${v}" ] ; then
108 uberlord 2547 eval ${var}_${IFVAR}=\$${var}_${t}
109     continue 2
110     fi
111     done
112 uberlord 2675 done
113 uberlord 2547 }
114    
115     _show_address() {
116 uberlord 2675 einfo "received address $(_get_inet_address "${IFACE}")"
117 uberlord 2547 }
118    
119     # Basically sorts our modules into order and saves the list
120     _gen_module_list() {
121 uberlord 2712 local x= f= force=$1
122     if ! ${force} && [ -s "${MODULESLIST}" -a "${MODULESLIST}" -nt "${MODULESDIR}" ] ; then
123 uberlord 2547 local update=false
124     for x in "${MODULESDIR}"/* ; do
125 uberlord 2675 [ -e "${x}" ] || continue
126     if [ "${x}" -nt "${MODULESLIST}" ] ; then
127 uberlord 2547 update=true
128     break
129 uberlord 2675 fi
130 uberlord 2547 done
131     ${update} || return 0
132 uberlord 2675 fi
133 uberlord 2547
134 uberlord 2675 einfo "Caching network module dependencies"
135     # Run in a subshell to protect the main script
136     (
137     after() {
138 uberlord 2547 eval ${MODULE}_after="\"\${${MODULE}_after}\${${MODULE}_after:+ }$*\""
139 uberlord 2675 }
140 uberlord 2547
141 uberlord 2675 before() {
142 uberlord 2547 local mod=${MODULE}
143     local MODULE=
144     for MODULE in "$@" ; do
145 uberlord 2675 after "${mod}"
146 uberlord 2547 done
147 uberlord 2675 }
148 uberlord 2547
149 uberlord 2675 program() {
150 uberlord 2547 if [ "$1" = "start" -o "$1" = "stop" ] ; then
151 uberlord 2675 local s="$1"
152     shift
153     eval ${MODULE}_program_${s}="\"\${${MODULE}_program_${s}}\${${MODULE}_program_${s}:+ }$*\""
154 uberlord 2547 else
155 uberlord 2675 eval ${MODULE}_program="\"\${${MODULE}_program}\${${MODULE}_program:+ }$*\""
156 uberlord 2547 fi
157 uberlord 2675 }
158 uberlord 2547
159 uberlord 2675 provide() {
160 uberlord 2547 eval ${MODULE}_provide="\"\${${MODULE}_provide}\${${MODULE}_provide:+ }$*\""
161     local x
162     for x in $* ; do
163 uberlord 2675 eval ${x}_providedby="\"\${${MODULE}_providedby}\${${MODULE}_providedby:+ }${MODULE}\""
164 uberlord 2547 done
165 uberlord 2675 }
166 uberlord 2547
167 uberlord 2675 for MODULE in "${MODULESDIR}"/* ; do
168 uberlord 2547 sh -n "${MODULE}" || continue
169     . "${MODULE}" || continue
170     MODULE=${MODULE#${MODULESDIR}/}
171     MODULE=${MODULE%.sh}
172     eval ${MODULE}_depend
173     MODULES="${MODULES} ${MODULE}"
174 uberlord 2675 done
175 uberlord 2547
176 uberlord 2675 VISITED=
177     SORTED=
178     visit() {
179 uberlord 2547 case " ${VISITED} " in
180 uberlord 2675 *" $1 "*) return ;;
181 uberlord 2547 esac
182     VISITED="${VISITED} $1"
183    
184     eval AFTER=\$${1}_after
185     for MODULE in ${AFTER} ; do
186 uberlord 2675 eval PROVIDEDBY=\$${MODULE}_providedby
187     if [ -n "${PROVIDEDBY}" ] ; then
188 uberlord 2547 for MODULE in ${PROVIDEDBY} ; do
189 uberlord 2675 visit "${MODULE}"
190 uberlord 2547 done
191 uberlord 2675 else
192 uberlord 2547 visit "${MODULE}"
193 uberlord 2675 fi
194 uberlord 2547 done
195    
196     eval PROVIDE=\$${1}_provide
197     for MODULE in ${PROVIDE} ; do
198 uberlord 2675 visit "${MODULE}"
199 uberlord 2547 done
200    
201     eval PROVIDEDBY=\$${1}_providedby
202     [ -z "${PROVIDEDBY}" ] && SORTED="${SORTED} $1"
203 uberlord 2675 }
204 uberlord 2547
205 uberlord 2675 for MODULE in ${MODULES} ; do
206 uberlord 2547 visit "${MODULE}"
207 uberlord 2675 done
208 uberlord 2547
209 uberlord 2675 > "${MODULESLIST}"
210     i=0
211     for MODULE in ${SORTED} ; do
212 uberlord 2547 eval PROGRAM=\$${MODULE}_program
213     eval PROGRAM_START=\$${MODULE}_program_start
214     eval PROGRAM_STOP=\$${MODULE}_program_stop
215     #for x in ${PROGRAM} ; do
216 uberlord 2675 # [ -x "${x}" ] || continue 2
217 uberlord 2547 #done
218     eval PROVIDE=\$${MODULE}_provide
219     echo "module_${i}='${MODULE}'" >> "${MODULESLIST}"
220     echo "module_${i}_program='${PROGRAM}'" >> "${MODULESLIST}"
221     echo "module_${i}_program_start='${PROGRAM_START}'" >> "${MODULESLIST}"
222     echo "module_${i}_program_stop='${PROGRAM_STOP}'" >> "${MODULESLIST}"
223     echo "module_${i}_provide='${PROVIDE}'" >> "${MODULESLIST}"
224     i=$((${i} + 1))
225 uberlord 2675 done
226     echo "module_${i}=" >> "${MODULESLIST}"
227     )
228 uberlord 2547
229 uberlord 2675 return 0
230 uberlord 2547 }
231    
232     _load_modules() {
233 uberlord 2712 local starting=$1 mymods=
234    
235 uberlord 2675 # Ensure our list is up to date
236 uberlord 2712 _gen_module_list false
237     if ! . "${MODULESLIST}" ; then
238     _gen_module_list true
239     . "${MODULESLIST}"
240     fi
241 uberlord 2547
242 uberlord 2675 MODULES=
243     if [ "${IFACE}" != "lo" -a "${IFACE}" != "lo0" ] ; then
244 uberlord 2547 eval mymods=\$modules_${IFVAR}
245     [ -z "${mymods}" ] && mymods=${modules}
246 uberlord 2675 fi
247 uberlord 2547
248 uberlord 2675 local i=-1 x= mod= f= provides=
249     while true ; do
250 uberlord 2547 i=$((${i} + 1))
251     eval mod=\$module_${i}
252     [ -z "${mod}" ] && break
253     [ -e "${MODULESDIR}/${mod}.sh" ] || continue
254    
255 uberlord 2675 eval set -- \$module_${i}_program
256 uberlord 2547 if [ -n "$1" ] ; then
257     x=
258     for x in "$@" ; do
259     [ -x "${x}" ] && break
260     done
261     [ -x "${x}" ] || continue
262 uberlord 2675 fi
263 uberlord 2547 if ${starting} ; then
264     eval set -- \$module_${i}_program_start
265     else
266     eval set -- \$module_${i}_program_stop
267     fi
268     if [ -n "$1" ] ; then
269     x=
270     for x in "$@" ; do
271     [ -x "${x}" ] && break
272     done
273     [ -x "${x}" ] || continue
274 uberlord 2675 fi
275 uberlord 2547
276     eval provides=\$module_${i}_provide
277     if ${starting} ; then
278 uberlord 2675 case " ${mymods} " in
279 uberlord 2547 *" !${mod} "*) continue ;;
280     *" !${provides} "*) [ -n "${provides}" ] && continue ;;
281 uberlord 2675 esac
282 uberlord 2547 fi
283     MODULES="${MODULES}${MODULES:+ }${mod}"
284    
285     # Now load and wrap our functions
286     if ! . "${MODULESDIR}/${mod}.sh" ; then
287 uberlord 2675 eend 1 "${SVCNAME}: error loading module \`${mod}'"
288     exit 1
289 uberlord 2547 fi
290    
291     [ -z "${provides}" ] && continue
292    
293     # Wrap our provides
294     local f=
295     for f in pre_start start post_start ; do
296 uberlord 2675 eval "${provides}_${f}() { type ${mod}_${f} >/dev/null 2>/dev/null || return 0; ${mod}_${f} \"\$@\"; }"
297 uberlord 2547 done
298    
299     eval module_${mod}_provides="${provides}"
300     eval module_${provides}_providedby="${mod}"
301 uberlord 2675 done
302 uberlord 2547
303 uberlord 2675 # Wrap our preferred modules
304     for mod in ${mymods} ; do
305 uberlord 2547 case " ${MODULES} " in
306 uberlord 2675 *" ${mod} "*)
307     eval x=\$module_${mod}_provides
308     [ -z "${x}" ] && continue
309     for f in pre_start start post_start ; do
310     eval "${x}_${f}() { type ${mod}_${f} >/dev/null 2>/dev/null || return 0; ${mod}_${f} \"\$@\"; }"
311     done
312     eval module_${x}_providedby="${mod}"
313     ;;
314 uberlord 2547 esac
315 uberlord 2675 done
316 uberlord 2547
317 uberlord 2675 # Finally remove any duplicated provides from our list if we're starting
318     # Otherwise reverse the list
319     local LIST="${MODULES}" p=
320     MODULES=
321     if ${starting} ; then
322 uberlord 2547 for mod in ${LIST} ; do
323 uberlord 2675 eval x=\$module_${mod}_provides
324     if [ -n "${x}" ] ; then
325 uberlord 2547 eval p=\$module_${x}_providedby
326     [ "${mod}" != "${p}" ] && continue
327 uberlord 2675 fi
328     MODULES="${MODULES}${MODULES:+ }${mod}"
329 uberlord 2547 done
330 uberlord 2675 else
331 uberlord 2547 for mod in ${LIST} ; do
332 uberlord 2675 MODULES="${mod}${MODULES:+ }${MODULES}"
333 uberlord 2547 done
334 uberlord 2675 fi
335 uberlord 2547
336 uberlord 2675 veinfo "Loaded modules: ${MODULES}"
337 uberlord 2547 }
338    
339     _load_config() {
340 uberlord 2675 eval "$(_get_array "config_${IFVAR}")"
341     if [ "${IFACE}" = "lo" -o "${IFACE}" = "lo0" ] ; then
342 uberlord 2547 set -- "127.0.0.1/8" "$@"
343 uberlord 2675 else
344 uberlord 2547 if [ $# -eq 0 ] ; then
345 uberlord 2675 ewarn "No configuration specified; defaulting to DHCP"
346     set -- "dhcp"
347 uberlord 2547 fi
348 uberlord 2675 fi
349 uberlord 2547
350 uberlord 2675 # We store our config in an array like vars
351     # so modules can influence it
352     config_index=0
353     for cmd in "$@" ; do
354 uberlord 2547 eval config_${config_index}="'${cmd}'"
355     config_index=$((${config_index} + 1))
356 uberlord 2675 done
357     # Terminate the list
358     eval config_${config_index}=
359 uberlord 2547
360 uberlord 2675 config_index=0
361     eval $(_get_array fallback_${IFVAR})
362     for cmd in "$@" ; do
363 uberlord 2547 eval fallback_${config_index}="'${cmd}'"
364     config_index=$((${config_index} + 1))
365 uberlord 2675 done
366     # Terminate the list
367     eval fallback_${config_index}=
368 uberlord 2547
369     # Don't set to zero, so any net modules don't have to do anything extra
370 uberlord 2675 config_index=-1
371 uberlord 2547 }
372    
373     start() {
374 uberlord 2675 local IFACE=${SVCNAME#*.} oneworked=false module=
375     local IFVAR=$(_shell_var "${IFACE}") cmd= metric=0 our_metric=$metric
376 uberlord 2547
377 uberlord 2675 einfo "Bringing up interface ${IFACE}"
378     eindent
379 uberlord 2547
380 uberlord 2675 if [ -z "${MODULES}" ] ; then
381 uberlord 2547 local MODULES=
382     _load_modules true
383 uberlord 2675 fi
384 uberlord 2547
385 uberlord 2675 _up 2>/dev/null
386 uberlord 2547
387 uberlord 2675 if type preup >/dev/null 2>/dev/null ; then
388 uberlord 2547 ebegin "Running preup"
389     eindent
390     preup || return 1
391     eoutdent
392 uberlord 2675 fi
393 uberlord 2547
394 uberlord 2675 for module in ${MODULES} ; do
395 uberlord 2547 if type "${module}_pre_start" >/dev/null 2>/dev/null ; then
396 uberlord 2675 if ! ${module}_pre_start ; then
397 uberlord 2547 eend 1
398     exit 1
399 uberlord 2675 fi
400 uberlord 2547 fi
401 uberlord 2675 done
402 uberlord 2547
403 uberlord 2624 if ! _exists ; then
404     eerror "ERROR: interface ${IFACE} does not exist"
405     eerror "Ensure that you have loaded the correct kernel module for your hardware"
406     return 1
407     fi
408    
409 uberlord 2574 if ! _wait_for_carrier ; then
410     if service_started devd ; then
411     ewarn "no carrier, but devd will start us when we have one"
412     mark_service_inactive "${SVCNAME}"
413     else
414     eerror "no carrier"
415     fi
416     return 1
417     fi
418    
419 uberlord 2675 local config= config_index=
420     _load_config
421 uberlord 2547 config_index=0
422    
423 uberlord 2675 if [ -n "${our_metric}" ] ; then
424 uberlord 2547 metric=${our_metric}
425 uberlord 2675 elif [ "${IFACE}" != "lo" -a "${IFACE}" != "lo0" ] ; then
426 uberlord 2547 metric=$((${metric} + $(_ifindex)))
427 uberlord 2675 fi
428 uberlord 2547
429 uberlord 2675 while true ; do
430 uberlord 2547 eval config=\$config_${config_index}
431     [ -z "${config}" ] && break
432    
433     set -- "${config}"
434     ebegin "$1"
435     eindent
436     case "$1" in
437 uberlord 2675 noop)
438     if [ -n "$(_get_inet_address)" ] ; then
439 uberlord 2547 oneworked=true
440     break
441 uberlord 2675 fi
442     ;;
443     null) : ;;
444     [0-9]*|*:*) _add_address ${config} ;;
445     *)
446     if type "${config}_start" >/dev/null 2>/dev/null ; then
447 uberlord 2547 "${config}"_start
448 uberlord 2675 else
449 uberlord 2547 eerror "nothing provides \`${config}'"
450 uberlord 2675 fi
451     ;;
452 uberlord 2547 esac
453     if eend $? ; then
454 uberlord 2675 oneworked=true
455 uberlord 2547 else
456 uberlord 2675 eval config=\$fallback_${IFVAR}
457     if [ -n "${config}" ] ; then
458 uberlord 2547 einfo "Trying fallback configuration"
459     eval config_${config_index}=\$fallback_${IFVAR}
460     eval fallback_${config_index}=
461     config_index=$((${config_index} - 1))
462 uberlord 2675 fi
463 uberlord 2547 fi
464     eoutdent
465     config_index=$((${config_index} + 1))
466 uberlord 2675 done
467 uberlord 2547
468     if ! ${oneworked} ; then
469 uberlord 2675 if type failup >/dev/null 2>/dev/null ; then
470 uberlord 2547 ebegin "Running failup"
471     eindent
472     failup
473     eoutdent
474 uberlord 2675 fi
475 uberlord 2547 return 1
476     fi
477    
478 uberlord 2675 local hidefirstroute=false first=true routes=
479     eval "$(_get_array "routes_${IFVAR}")"
480     if [ "${IFACE}" = "lo" -o "${IFACE}" = "lo0" ] ; then
481 uberlord 2547 set -- "127.0.0.0/8 via 127.0.0.1" "$@"
482     hidefirstroute=true
483 uberlord 2675 fi
484     for cmd in "$@" ; do
485 uberlord 2547 if ${first} ; then
486 uberlord 2675 first=false
487     einfo "Adding routes"
488 uberlord 2547 fi
489     eindent
490     ebegin "${cmd}"
491     # Work out if we're a host or a net if not told
492     case "${cmd}" in
493 uberlord 2675 *" -net "*|*" -host "*) ;;
494     *" netmask "*) cmd="-net ${cmd}" ;;
495     *)
496     case "${cmd%% *}" in
497 uberlord 2547 *.*.*.*/32) cmd="-host ${cmd}" ;;
498     *.*.*.*/*|0.0.0.0|default) cmd="-net ${cmd}" ;;
499     *) cmd="-host ${cmd}" ;;
500 uberlord 2675 esac
501     ;;
502 uberlord 2547 esac
503     if ${hidefirstroute} ; then
504 uberlord 2675 _add_route ${cmd} >/dev/null 2>/dev/null
505     hidefirstroute=false
506 uberlord 2547 else
507 uberlord 2675 _add_route ${cmd} >/dev/null
508 uberlord 2547 fi
509     eend $?
510     eoutdent
511 uberlord 2675 done
512 uberlord 2547
513 uberlord 2675 for module in ${MODULES} ; do
514 uberlord 2547 if type "${module}_post_start" >/dev/null 2>/dev/null ; then
515 uberlord 2675 if ! ${module}_post_start ; then
516     eend 1
517     exit 1
518     fi
519 uberlord 2547 fi
520 uberlord 2675 done
521 uberlord 2547
522 uberlord 2675 if type postup >/dev/null 2>/dev/null ; then
523 uberlord 2547 ebegin "Running postup"
524     eindent
525     postup
526     eoutdent
527 uberlord 2675 fi
528 uberlord 2547
529 uberlord 2675 return 0
530 uberlord 2547 }
531    
532     stop() {
533 uberlord 2675 local IFACE=${SVCNAME#*.} module=
534     local IFVAR=$(_shell_var "${IFACE}") opts=
535 uberlord 2547
536 uberlord 2675 einfo "Bringing down interface ${IFACE}"
537     eindent
538 uberlord 2547
539 uberlord 2675 if [ -z "${MODULES}" ] ; then
540 uberlord 2547 local MODULES=
541     _load_modules false
542 uberlord 2675 fi
543 uberlord 2547
544 uberlord 2675 if type predown >/dev/null 2>/dev/null ; then
545 uberlord 2547 ebegin "Running predown"
546     eindent
547     predown || return 1
548     eoutdent
549 uberlord 2675 fi
550 uberlord 2547
551 uberlord 2675 for module in ${MODULES} ; do
552 uberlord 2547 if type "${module}_pre_stop" >/dev/null 2>/dev/null ; then
553 uberlord 2675 if ! ${module}_pre_stop ; then
554     eend 1
555     exit 1
556     fi
557     fi
558     done
559 uberlord 2547
560 uberlord 2675 for module in ${MODULES} ; do
561 uberlord 2547 if type "${module}_stop" >/dev/null 2>/dev/null ; then
562 uberlord 2675 ${module}_stop
563 uberlord 2547 fi
564 uberlord 2675 done
565 uberlord 2547
566 uberlord 2674 # Only delete addresses for non PPP interfaces
567     if ! type is_ppp >/dev/null 2>/dev/null || ! is_ppp ; then
568     _delete_addresses "${IFACE}"
569     fi
570 uberlord 2547
571 uberlord 2675 for module in ${MODULES} ; do
572 uberlord 2547 if type "${module}_post_stop" >/dev/null 2>/dev/null ; then
573 uberlord 2675 ${module}_post_stop
574 uberlord 2547 fi
575 uberlord 2675 done
576 uberlord 2547
577 uberlord 2675 [ "${IN_BACKGROUND}" != "true" ] && \
578     [ "${IFACE}" != "lo" -a "${IFACE}" != "lo0" ] && \
579     _down 2>/dev/null
580 uberlord 2547
581 uberlord 2675 [ -x /sbin/resolvconf ] && resolvconf -d "${IFACE}"
582 uberlord 2547
583 uberlord 2675 if type postdown >/dev/null 2>/dev/null ; then
584 uberlord 2547 ebegin "Running postdown"
585     eindent
586     postdown
587     eoutdent
588 uberlord 2675 fi
589 uberlord 2547
590 uberlord 2675 return 0
591 uberlord 2547 }
592    
593 uberlord 2675 # vim: set ts=4 sw=4 :

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.20