summaryrefslogtreecommitdiff
path: root/net-dialup/capi4k-utils/files/capi.initd
diff options
context:
space:
mode:
Diffstat (limited to 'net-dialup/capi4k-utils/files/capi.initd')
-rw-r--r--net-dialup/capi4k-utils/files/capi.initd180
1 files changed, 180 insertions, 0 deletions
diff --git a/net-dialup/capi4k-utils/files/capi.initd b/net-dialup/capi4k-utils/files/capi.initd
new file mode 100644
index 00000000000..6ed53648ece
--- /dev/null
+++ b/net-dialup/capi4k-utils/files/capi.initd
@@ -0,0 +1,180 @@
+#!/sbin/runscript
+# Copyright 1999-2008 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+opts="info showconfig"
+
+depend() {
+ after isapnp pcmcia bluetooth
+}
+
+# possible firmware locations (list and order taken from 'capiinit')
+FWDIRS="/lib/firmware/isdn /lib/firmware /usr/share/isdn /usr/lib/isdn /lib/isdn"
+
+# Firmware search
+findfw() { # <fw_name>
+ local DIR
+ for DIR in ${FWDIRS}; do
+ if [ -f "${DIR}/${1}" ]; then
+ echo "${DIR}/${1}"; return 0
+ fi
+ done
+ return 1
+}
+
+# looking for 'detected' cards (currently only 'sedlfax')
+detected() { # <driver>
+ # /proc/capi/controller: <controller> <drivername> <state> <cardname> <controllerinfo>
+ sed -n "s:^\([1-9][0-9]*\) \+${1} \+detected \+.*:\1:p" \
+ /proc/capi/controller 2>/dev/null
+}
+
+# detecting loaded mISDN modules
+misdn_modules() {
+ sed -n "s:^mISDN_core \+[0-9]\+ \+[0-9]\+ \+\([^ ]\+\).*\$:\1:p" \
+ /proc/modules 2>/dev/null | tr "," " "
+}
+
+# detecting loaded CAPI drivers
+capi_drivers() {
+ local DRV MISDN=0
+ for DRV in $(sed -n "s:^[0-9]\+ \+\([^ ]\+\).*\$:\1:p" /proc/capi/controller 2>/dev/null); do
+ case "${DRV}" in
+ mISDN) MISDN=1;;
+ ?*) echo "${DRV}";;
+ esac
+ done
+ # dirty hack to find loaded mISDN modules
+ if [ ${MISDN} -gt 0 ]; then
+ for DRV in $(misdn_modules); do
+ case "${DRV}" in
+ mISDN_*|l3udss1|faxl3) continue;;
+ ?*) echo "${DRV}";;
+ esac
+ done
+ fi
+}
+
+# detecting bluetooth CIP connections
+bluez_cip() {
+ [ -x /usr/bin/ciptool ] && \
+ sed -n "s:[0-9]\+ \+cmtp \+[^ ]\+ \+\([0-9A-F:]\+\) \+.*\$:\1:p" \
+ /proc/capi/controller 2>/dev/null
+}
+
+
+
+start() {
+ if [ ! -e /etc/capi.conf ] ; then
+ eerror "You're missing /etc/capi.conf (comes with a capi-driver)."
+ eerror "Emerge net-dialup/fritzcapi if you're having an AVM Fritz!Card"
+ return 1
+ fi
+
+ ebegin "Loading CAPI"
+ [ -f /proc/capi/capi20 ] || /sbin/modprobe -s capi
+ eend $? || return 1
+
+ local CNT=0 # wait for udev (max 10s)
+ while [ ! -c /dev/capi20 -a ${CNT} -lt 40 ]; do
+ sleep 0.25; : $((CNT++))
+ done
+
+ ebegin "Starting CAPI"
+ /usr/sbin/capiinit activate 2>/dev/null
+ if eend $?; then
+ local CIP MSG INFO FW CARD MISDN
+
+ # HACK: loading ISAR.BIN onto 'sedlfax' cards
+ # shouldn't be necessary, but mISDN is crappy
+ MISDN=$(detected "mISDN")
+ if [ -n "${MISDN}" ]; then
+ FW=$(findfw "ISAR.BIN")
+ if [ -n "${FW}" ]; then
+ for CARD in ${MISDN}; do
+ ebegin "Loading firmware '${FW##*/}' onto controller ${CARD}"
+ /usr/sbin/avmcapictrl load "${FW}" "${CARD}" 2>&1 >/dev/null
+ eend $?
+ done
+ else
+ eerror "Firmware 'ISAR.BIN' not found in ${FWDIRS%% *}"
+ fi
+ fi
+
+ # connect to CIP devices
+ if [ -n "${CAPI_CIP_DEVICES}" -a -x /usr/bin/ciptool ]; then
+ for CIP in ${CAPI_CIP_DEVICES}; do
+ ebegin "CIP connect to ${CIP}"
+ INFO=$(/usr/bin/ciptool connect "${CIP}" 2>&1)
+ if ! eend $?; then
+ [ -n "${INFO}" ] && \
+ echo "${INFO}" | while read line MSG; do eerror " ${MSG}"; done
+ fi
+ done
+ sleep 0.3 # give subsystems time to initialize
+ fi
+
+ # load 'capidrv'
+ [ -f /proc/capi/capidrv -o "${CAPI_LOAD_CAPIDRV}" != "yes" ] || /sbin/modprobe -s capidrv
+
+ # show controllers
+ INFO=$(cat /proc/capi/controller)
+ if [ -n "${INFO}" ]; then
+ einfo "Available CAPI controllers:"
+ echo "${INFO}" | while read MSG; do einfo " ${MSG}"; done
+ fi
+ fi
+ return 0 # never fail
+}
+
+stop() {
+ local DRV CIP RET FCNT=0 DRIVERS=$(capi_drivers | sort -u)
+
+ # if some CAPI applications are still running, kill 'em
+ if fuser -s /dev/capi20 2>/dev/null; then
+ ebegin "Stopping CAPI applications"
+ fuser -ks /dev/capi20; RET=$?
+ while [ ${RET} -eq 0 -a ${FCNT} -lt 10 ]; do
+ : $((FCNT++)); sleep 0.5; fuser -s /dev/capi20; RET=$?
+ done
+ [ ${RET} -ne 0 ]
+ eend $?
+ fi
+
+ # release bluetooth CIP connections
+ for CIP in $(bluez_cip); do
+ ebegin "Release CIP connection to ${CIP}"
+ /usr/bin/ciptool release "${CIP}"
+ eend
+ done
+
+ ebegin "Stopping CAPI"
+ [ "${CAPI_LOAD_CAPIDRV}" = "yes" ] && /sbin/modprobe -sqr capidrv
+ [ "${CAPI_UNLOAD_CARDS}" = "yes" ] && /usr/sbin/capiinit stop &>/dev/null
+ for DRV in ${DRIVERS}; do
+ /sbin/modprobe -sqr "${DRV}"
+ done
+ /sbin/modprobe -sqr capi
+ eend 0 # ignore errors
+}
+
+info() {
+ if [ -f /proc/capi/controller ]; then
+ local MSG
+ while read MSG; do einfo "${MSG}"; done < /proc/capi/controller
+ else
+ eerror "ERROR: CAPI not loaded"
+ return 1
+ fi
+}
+
+showconfig() {
+ local MSG INFO
+ if INFO=$(/usr/sbin/capiinit show 2>&1); then
+ echo "${INFO}" | while read MSG; do einfo "${MSG}"; done
+ return 0
+ fi
+ echo "${INFO}" | while read MSG; do eerror "${MSG}"; done
+ return 1
+}