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'; }
void physical_DescriptorRead(struct fdescriptor *d, struct bundle *bundle, const fd_set *fdset) { struct physical *p = descriptor2physical(d); u_char *rbuff; int n, found; rbuff = p->input.buf + p->input.sz; /* something to read */ n = physical_Read(p, rbuff, sizeof p->input.buf - p->input.sz); log_Printf(LogDEBUG, "%s: DescriptorRead: read %d/%d from %d\n", p->link.name, n, (int)(sizeof p->input.buf - p->input.sz), p->fd); if (n <= 0) { if (n < 0) log_Printf(LogPHASE, "%s: read (%d): %s\n", p->link.name, p->fd, strerror(errno)); else log_Printf(LogPHASE, "%s: read (%d): Got zero bytes\n", p->link.name, p->fd); datalink_Down(p->dl, CLOSE_NORMAL); return; } rbuff -= p->input.sz; n += p->input.sz; if (p->link.lcp.fsm.state <= ST_CLOSED) { if (p->type != PHYS_DEDICATED) { found = hdlc_Detect((u_char const **)&rbuff, n, physical_IsSync(p)); if (rbuff != p->input.buf) log_WritePrompts(p->dl, "%.*s", (int)(rbuff - p->input.buf), p->input.buf); p->input.sz = n - (rbuff - p->input.buf); if (found) { /* LCP packet is detected. Turn ourselves into packet mode */ log_Printf(LogPHASE, "%s: PPP packet detected, coming up\n", p->link.name); log_SetTtyCommandMode(p->dl); datalink_Up(p->dl, 0, 1); link_PullPacket(&p->link, rbuff, p->input.sz, bundle); p->input.sz = 0; } else bcopy(rbuff, p->input.buf, p->input.sz); } else /* In -dedicated mode, we just discard input until LCP is started */ p->input.sz = 0; } else if (n > 0) link_PullPacket(&p->link, rbuff, n, bundle); }