Subject: bin/2705: pppd returns 0 exit status for most failed connections
To: None <gnats-bugs@NetBSD.ORG>
From: James E. Bernard <jbernard@tater.Mines.EDU>
List: netbsd-bugs
Date: 08/18/1996 08:06:11
>Number: 2705
>Category: bin
>Synopsis: pppd returns 0 exit status for most failed connections
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: bin-bug-people (Utility Bug People)
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Sun Aug 18 10:20:01 1996
>Last-Modified:
>Originator: Jim Bernard
>Organization:
Speaking for myself
>Release: 1.2_BETA
>Environment:
System: NetBSD zoo 1.2_BETA NetBSD 1.2_BETA (ZOO) #0: Sun Aug 18 05:58:18 MDT 1996 local@zoo:/home/local/compile/sys/arch/i386/compile/ZOO i386
>Description:
When pppd is run with -detach to keep it attached to the terminal, the
exit status returned for most failure modes, including a chat-script
failure is 0. (Actually, the exit status doesn't depend on the use
of "-detach".) Having non-zero exit status in such cases is useful, for
example, in a wrapper script that retries failed connections a finite
number of times (in contrast to -persist, which continues forever).
The pppd supplied in NetBSD 1.1 did correctly return non-zero exit
status when the chat script failed.
>How-To-Repeat:
Add "ABORT RINGING" to chat script (to force rapid failure on an otherwise
successful dial attempt) and attempt connection via "pppd -detach". Then
test exit status and observe that it is zero, in spite of failed chat.
(Note that chat itself returns non-zero status in this case.)
>Fix:
The main loop contains a number of "goto fail" jumps in various cases of
failure, and when the "persist" option is not in effect, the code just
breaks to the end and executes "die(0)", which does cleanup and exits
with the specified status (0). The solution is to replace the break with
"die(1)":
*** usr.sbin/pppd/main.c-dist Fri Mar 22 05:32:20 1996
--- usr.sbin/pppd/main.c Sat Aug 17 19:12:44 1996
***************
*** 509,515 ****
}
if (!persist)
! break;
if (demand)
demand_discard();
--- 509,515 ----
}
if (!persist)
! die(1);
if (demand)
demand_discard();
>Audit-Trail:
>Unformatted: