void datalink_ComeDown(struct datalink *dl, int how) { int stayonline; if (how == CLOSE_LCP) datalink_DontHangup(dl); else if (how == CLOSE_STAYDOWN) datalink_StayDown(dl); stayonline = dl->stayonline; dl->stayonline = 0; if (dl->state >= DATALINK_READY && stayonline) { physical_StopDeviceTimer(dl->physical); datalink_NewState(dl, DATALINK_READY); } else if (dl->state != DATALINK_CLOSED && dl->state != DATALINK_HANGUP) { physical_Offline(dl->physical); if (dl->script.run && dl->state != DATALINK_OPENING) { if (dl->state == DATALINK_LOGOUT) { datalink_NewState(dl, DATALINK_HANGUP); if (!chat_Setup(&dl->chat, dl->cfg.script.hangup, NULL)) log_Printf(LogWARN, "Invalid hangup script\n"); } else { datalink_NewState(dl, DATALINK_LOGOUT); if (!chat_Setup(&dl->chat, dl->cfg.script.logout, NULL)) log_Printf(LogWARN, "Invalid logout script\n"); } } else datalink_HangupDone(dl); } }
void physical_Close(struct physical *p) { int newsid; char fn[PATH_MAX]; struct utmpx ut; if (p->fd < 0) return; log_Printf(LogDEBUG, "%s: Close\n", p->link.name); if (p->handler && p->handler->cooked) (*p->handler->cooked)(p); physical_StopDeviceTimer(p); if (p->Utmp) { memset(&ut, 0, sizeof ut); ut.ut_type = DEAD_PROCESS; gettimeofday(&ut.ut_tv, NULL); snprintf(ut.ut_id, sizeof ut.ut_id, "%xppp", (int)getpid()); ID0logout(&ut); p->Utmp = 0; } newsid = tcgetpgrp(p->fd) == getpgrp(); close(p->fd); p->fd = -1; log_SetTtyCommandMode(p->dl); throughput_stop(&p->link.stats.total); throughput_log(&p->link.stats.total, LogPHASE, p->link.name); if (p->session_owner != (pid_t)-1) { log_Printf(LogPHASE, "%s: HUPing %ld\n", p->link.name, (long)p->session_owner); ID0kill(p->session_owner, SIGHUP); p->session_owner = (pid_t)-1; } if (newsid) bundle_setsid(p->dl->bundle, 0); if (*p->name.full == '/') { snprintf(fn, sizeof fn, "%s%s.if", _PATH_VARRUN, p->name.base); #ifndef RELEASE_CRUNCH if (ID0unlink(fn) == -1) log_Printf(LogALERT, "%s: Can't remove %s: %s\n", p->link.name, fn, strerror(errno)); #else ID0unlink(fn); #endif } physical_Unlock(p); if (p->handler && p->handler->destroy) (*p->handler->destroy)(p); p->handler = NULL; p->name.base = p->name.full; *p->name.full = '\0'; }
void physical_Close(struct physical *p) { int newsid; char fn[PATH_MAX]; if (p->fd < 0) return; log_Printf(LogDEBUG, "%s: Close\n", p->link.name); if (p->handler && p->handler->cooked) (*p->handler->cooked)(p); physical_StopDeviceTimer(p); if (p->Utmp) { if (p->handler && (p->handler->type == TCP_DEVICE || p->handler->type == UDP_DEVICE)) /* Careful - we logged in on line ``ppp'' with IP as our host */ ID0logout(PPPOTCPLINE, 1); else ID0logout(p->name.base, 0); p->Utmp = 0; } newsid = tcgetpgrp(p->fd) == getpgrp(); close(p->fd); p->fd = -1; log_SetTtyCommandMode(p->dl); throughput_stop(&p->link.stats.total); throughput_log(&p->link.stats.total, LogPHASE, p->link.name); if (p->session_owner != (pid_t)-1) { log_Printf(LogPHASE, "%s: HUPing %ld\n", p->link.name, (long)p->session_owner); ID0kill(p->session_owner, SIGHUP); p->session_owner = (pid_t)-1; } if (newsid) bundle_setsid(p->dl->bundle, 0); if (*p->name.full == '/') { snprintf(fn, sizeof fn, "%s%s.if", _PATH_VARRUN, p->name.base); #ifndef RELEASE_CRUNCH if (ID0unlink(fn) == -1) log_Printf(LogALERT, "%s: Can't remove %s: %s\n", p->link.name, fn, strerror(errno)); #else ID0unlink(fn); #endif } physical_Unlock(p); if (p->handler && p->handler->destroy) (*p->handler->destroy)(p); p->handler = NULL; p->name.base = p->name.full; *p->name.full = '\0'; }
static void datalink_LoginDone(struct datalink *dl) { chat_Finish(&dl->chat); if (!dl->script.packetmode) { dl->dial.tries = -1; dl->dial.incs = 0; datalink_NewState(dl, DATALINK_READY); } else if (!physical_Raw(dl->physical)) { dl->dial.tries = 0; log_Printf(LogWARN, "datalink_LoginDone: Not connected.\n"); if (dl->script.run) { datalink_NewState(dl, DATALINK_LOGOUT); if (!chat_Setup(&dl->chat, dl->cfg.script.logout, NULL)) log_Printf(LogWARN, "Invalid logout script\n"); } else { physical_StopDeviceTimer(dl->physical); if (dl->physical->type == PHYS_DEDICATED) /* force a redial timeout */ physical_Close(dl->physical); datalink_HangupDone(dl); } } else { dl->dial.tries = -1; dl->dial.incs = 0; hdlc_Init(&dl->physical->hdlc, &dl->physical->link.lcp); async_Setup(&dl->physical->async); lcp_Setup(&dl->physical->link.lcp, dl->state == DATALINK_READY ? 0 : dl->physical->link.lcp.cfg.openmode); ccp_Setup(&dl->physical->link.ccp); datalink_NewState(dl, DATALINK_LCP); fsm_Up(&dl->physical->link.lcp.fsm); fsm_Open(&dl->physical->link.lcp.fsm); } }