When using `set device !someprogram'', when
`someprogram''
exits, it causes a select() exception. Handle these select() exceptions on link descriptors in pretty much the same way as loss of carrier rather than dropping out in confusion.
This commit is contained in:
parent
578a7c3375
commit
ba9233fa15
@ -23,7 +23,7 @@
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: bundle.c,v 1.39 1998/10/27 22:53:22 brian Exp $
|
||||
* $Id: bundle.c,v 1.40 1998/10/29 23:47:10 brian Exp $
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
@ -1729,3 +1729,17 @@ bundle_HighestState(struct bundle *bundle)
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
int
|
||||
bundle_Exception(struct bundle *bundle, int fd)
|
||||
{
|
||||
struct datalink *dl;
|
||||
|
||||
for (dl = bundle->links; dl; dl = dl->next)
|
||||
if (dl->physical->fd == fd) {
|
||||
datalink_Down(dl, CLOSE_NORMAL);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -23,7 +23,7 @@
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: bundle.h,v 1.18 1998/10/27 22:53:22 brian Exp $
|
||||
* $Id: bundle.h,v 1.19 1998/10/29 02:12:54 brian Exp $
|
||||
*/
|
||||
|
||||
#define PHASE_DEAD 0 /* Link is dead */
|
||||
@ -184,3 +184,4 @@ extern int bundle_RenameDatalink(struct bundle *, struct datalink *,
|
||||
extern void bundle_setsid(struct bundle *, int);
|
||||
extern void bundle_LockTun(struct bundle *);
|
||||
extern int bundle_HighestState(struct bundle *);
|
||||
extern int bundle_Exception(struct bundle *, int);
|
||||
|
@ -17,7 +17,7 @@
|
||||
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* $Id: main.c,v 1.144 1998/10/22 02:32:49 brian Exp $
|
||||
* $Id: main.c,v 1.145 1998/10/31 17:38:46 brian Exp $
|
||||
*
|
||||
* TODO:
|
||||
*/
|
||||
@ -515,8 +515,12 @@ DoLoop(struct bundle *bundle)
|
||||
|
||||
for (i = 0; i <= nfds; i++)
|
||||
if (FD_ISSET(i, &efds)) {
|
||||
log_Printf(LogERROR, "Exception detected on descriptor %d\n", i);
|
||||
break;
|
||||
log_Printf(LogPHASE, "Exception detected on descriptor %d\n", i);
|
||||
/* We deal gracefully with link descriptor exceptions */
|
||||
if (!bundle_Exception(bundle, i)) {
|
||||
log_Printf(LogERROR, "Exception cannot be handled !\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i <= nfds)
|
||||
|
Loading…
Reference in New Issue
Block a user