131 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			131 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|  | #!/bin/sh | ||
|  | 
 | ||
|  | # $DIALD_LINK is the name of the link we are connecting. | ||
|  | # $DIALD_DEVICE is the device we are calling out on. | ||
|  | 
 | ||
|  | #CFG_SCRIPTS='/usr/share/diald' | ||
|  | CFG_SCRIPTS='/etc/diald/scripts' | ||
|  | CFG_DEVICE='/etc/diald/device.conf' | ||
|  | CFG_LINK="/etc/diald/link" | ||
|  | CFG_SEQ='/var/run' | ||
|  | 
 | ||
|  | # $DIALD_DEVTYPE is a sanitized version of $DIALD_DEVICE. | ||
|  | case "$DIALD_DEVICE" in | ||
|  | 	ippp*)	DIALD_DEVTYPE='isdn' ;; | ||
|  | 	isdn*)	DIALD_DEVTYPE='isdn' ;; | ||
|  | 	*)	DIALD_DEVTYPE='modem' ;; | ||
|  | esac | ||
|  | 
 | ||
|  | 
 | ||
|  | connect() | ||
|  | { | ||
|  | 	status=0 | ||
|  | 
 | ||
|  | 	# If this device has a dial script we use it to bring up | ||
|  | 	# the physical link. | ||
|  | 	if [ -n "$dial_script"  -a "$dial_script" != '-' ]; then | ||
|  | 		"$CFG_SCRIPTS/$dial_script" | ||
|  | 		status=$? | ||
|  | 		if [ $status -ne 0 ]; then | ||
|  | 			exit $status | ||
|  | 		fi | ||
|  | 	fi | ||
|  | 
 | ||
|  | 	# If we need to do some form of login when connecting this | ||
|  | 	# link over this device, do it now. | ||
|  | 	if [ -n "$LOGIN"  -a "$LOGIN" != '-' ]; then | ||
|  | 		"$CFG_SCRIPTS/login/$LOGIN" | ||
|  | 		status=$? | ||
|  | 	fi | ||
|  | 
 | ||
|  | 	# If everything worked we start from the beginning of the | ||
|  | 	# list again next time | ||
|  | 	if [ $status -eq 0 ]; then | ||
|  | 		echo 1 > "$CFG_SEQ/dialdseq.$DIALD_LINK" | ||
|  | 	fi | ||
|  | 
 | ||
|  | 	exit $status | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | # Save stdin, we need it later if we are dialling a modem. | ||
|  | exec 9<&0 | ||
|  | 
 | ||
|  | # Find out what dial script to use on this device. | ||
|  | exec < "$CFG_DEVICE" | ||
|  | gotdev= | ||
|  | while read dev dial_script dial_args | ||
|  | do | ||
|  | 	# Ignore blank lines and comments. | ||
|  | 	case "$dev" in | ||
|  | 		'#'*|'') | ||
|  | 			continue ;; | ||
|  | 	esac | ||
|  | 
 | ||
|  | 	if [ "$dev" = "$DIALD_DEVICE" -o "$dev" = "$DIALD_DEVTYPE" ]; then | ||
|  | 		gotdev=1 | ||
|  | 		break | ||
|  | 	fi | ||
|  | done | ||
|  | if [ -z "$gotdev" ]; then | ||
|  | 	echo "<3>No entry for $DIALD_DEVICE, type $DIALD_DEVTYPE in $CFG_DEVICE" | ||
|  | 	exit 1 | ||
|  | fi | ||
|  | 
 | ||
|  | 
 | ||
|  | seq=0 | ||
|  | if [ -r "$CFG_SEQ/dialdseq.$DIALD_LINK" ]; then | ||
|  | 	seq=`cat "$CFG_SEQ/dialdseq.$DIALD_LINK"` | ||
|  | fi | ||
|  | seq=`expr $seq + 1` | ||
|  | echo $seq > "$CFG_SEQ/dialdseq.$DIALD_LINK" | ||
|  | 
 | ||
|  | 
 | ||
|  | passes=2 | ||
|  | while [ $passes -gt 0 ]; do | ||
|  | 	passes=`expr $passes - 1` | ||
|  | 
 | ||
|  | 	exec < "$CFG_LINK" | ||
|  | 	dev_type= | ||
|  | 	link_params= | ||
|  | 	base_params= | ||
|  | 	counted=0 | ||
|  | 	while read dev_type link_params | ||
|  | 	do | ||
|  | 		# Ignore blank lines and comments. | ||
|  | 		case "$dev_type" in | ||
|  | 			'#'*|'') | ||
|  | 				continue ;; | ||
|  | 		esac | ||
|  | 
 | ||
|  | 		if [ "$dev_type" = '=' ]; then | ||
|  | 			base_params="$link_params" | ||
|  | 		elif [ "$dev_type" = '+' ]; then | ||
|  | 			base_params="$base_params $link_params" | ||
|  | 		elif [ "$dev_type" = "$DIALD_DEVICE" \ | ||
|  | 		-o "$dev_type" = "$DIALD_DEVTYPE" ]; then | ||
|  | 			counted=`expr $counted + 1` | ||
|  | 			seq=`expr $seq - 1` | ||
|  | 			if [ $seq -eq 0 ]; then | ||
|  | 				passes=0 | ||
|  | 				exec 0<&9 | ||
|  | 				eval "$dial_args $base_params $link_params connect" | ||
|  | 				exit $? | ||
|  | 			fi | ||
|  | 		fi | ||
|  | 	done | ||
|  | 
 | ||
|  | 	# If no entries match there is a problem | ||
|  | 	if [ $counted -eq 0 ]; then | ||
|  | 		echo "<3>No entry for $DIALD_DEVICE, type $DIALD_DEVTYPE in $CFG_LINK" | ||
|  | 		exit 1 | ||
|  | 	fi | ||
|  | 
 | ||
|  | 	# One or more entries exists, we have just run off the end | ||
|  | 	# of the list so we have to start again from the top. | ||
|  | 	echo 1 > "$CFG_SEQ/dialdseq.$DIALD_LINK" | ||
|  | 	seq=1 | ||
|  | done | ||
|  | 
 | ||
|  | exit 1 |