static int exec_UpdateSet(struct fdescriptor *d, fd_set *r, fd_set *w, fd_set *e, int *n) { struct physical *p = descriptor2physical(d); struct execdevice *dev = device2exec(p->handler); int result = 0; if (w && dev->fd_out >= 0) { FD_SET(dev->fd_out, w); log_Printf(LogTIMER, "%s: fdset(w) %d\n", p->link.name, dev->fd_out); result++; w = NULL; } if (e && dev->fd_out >= 0) { FD_SET(dev->fd_out, e); log_Printf(LogTIMER, "%s: fdset(e) %d\n", p->link.name, dev->fd_out); result++; } if (result && *n <= dev->fd_out) *n = dev->fd_out + 1; return result + physical_doUpdateSet(d, r, w, e, n, 0); }
int physical_doUpdateSet(struct fdescriptor *d, fd_set *r, fd_set *w, fd_set *e, int *n, int force) { struct physical *p = descriptor2physical(d); int sets; sets = 0; if (p->fd >= 0) { if (r) { FD_SET(p->fd, r); log_Printf(LogTIMER, "%s: fdset(r) %d\n", p->link.name, p->fd); sets++; } if (e) { FD_SET(p->fd, e); log_Printf(LogTIMER, "%s: fdset(e) %d\n", p->link.name, p->fd); sets++; } if (w && (force || link_QueueLen(&p->link) || p->out)) { FD_SET(p->fd, w); log_Printf(LogTIMER, "%s: fdset(w) %d\n", p->link.name, p->fd); sets++; } if (sets && *n < p->fd + 1) *n = p->fd + 1; } return sets; }
static int physical_DescriptorWrite(struct fdescriptor *d, struct bundle *bundle, const fd_set *fdset) { struct physical *p = descriptor2physical(d); int nw, result = 0; if (p->out == NULL) p->out = link_Dequeue(&p->link); if (p->out) { nw = physical_Write(p, MBUF_CTOP(p->out), p->out->m_len); log_Printf(LogDEBUG, "%s: DescriptorWrite: wrote %d(%lu) to %d\n", p->link.name, nw, (unsigned long)p->out->m_len, p->fd); if (nw > 0) { p->out->m_len -= nw; p->out->m_offset += nw; if (p->out->m_len == 0) p->out = m_free(p->out); result = 1; } else if (nw < 0) { if (errno == EAGAIN) result = 1; else if (errno != ENOBUFS) { log_Printf(LogPHASE, "%s: write (%d): %s\n", p->link.name, p->fd, strerror(errno)); datalink_Down(p->dl, CLOSE_NORMAL); } } /* else we shouldn't really have been called ! select() is broken ! */ } return result; }
static int ng_UpdateSet(struct fdescriptor *d, fd_set *r, fd_set *w, fd_set *e, int *n) { struct physical *p = descriptor2physical(d); struct ngdevice *dev = device2ng(p->handler); int result; switch (p->dl->state) { case DATALINK_DIAL: case DATALINK_LOGIN: if (r) { FD_SET(dev->cs, r); log_Printf(LogTIMER, "%s(ctrl): fdset(r) %d\n", p->link.name, dev->cs); result = 1; } else result = 0; break; default: result = physical_doUpdateSet(d, r, w, e, n, 0); break; } return result; }
static int exec_IsSet(struct fdescriptor *d, const fd_set *fdset) { struct physical *p = descriptor2physical(d); struct execdevice *dev = device2exec(p->handler); int result = dev->fd_out >= 0 && FD_ISSET(dev->fd_out, fdset); result += physical_IsSet(d, fdset); return result; }
static int ether_IsSet(struct fdescriptor *d, const fd_set *fdset) { struct physical *p = descriptor2physical(d); struct etherdevice *dev = device2ether(p->handler); int result; result = dev->cs >= 0 && FD_ISSET(dev->cs, fdset); result += physical_IsSet(d, fdset); return result; }
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); }
static void ng_DescriptorRead(struct fdescriptor *d, struct bundle *bundle, const fd_set *fdset) { struct physical *p = descriptor2physical(d); struct ngdevice *dev = device2ng(p->handler); if (dev->cs >= 0 && FD_ISSET(dev->cs, fdset)) ng_MessageIn(p, NULL, 0); if (physical_IsSet(d, fdset)) physical_DescriptorRead(d, bundle, fdset); }
static int ether_UpdateSet(struct fdescriptor *d, fd_set *r, fd_set *w, fd_set *e, int *n) { struct physical *p = descriptor2physical(d); struct etherdevice *dev = device2ether(p->handler); int result; if (r && dev->cs >= 0) { FD_SET(dev->cs, r); log_Printf(LogTIMER, "%s(ctrl): fdset(r) %d\n", p->link.name, dev->cs); result = 1; } else result = 0; result += physical_doUpdateSet(d, r, w, e, n, 0); return result; }
static void ether_DescriptorRead(struct fdescriptor *d, struct bundle *bundle, const fd_set *fdset) { struct physical *p = descriptor2physical(d); struct etherdevice *dev = device2ether(p->handler); if (dev->cs >= 0 && FD_ISSET(dev->cs, fdset)) { ether_MessageIn(dev); if (dev->connected == CARRIER_LOST) { log_Printf(LogPHASE, "%s: Device disconnected\n", p->link.name); datalink_Down(p->dl, CLOSE_NORMAL); return; } } if (physical_IsSet(d, fdset)) physical_DescriptorRead(d, bundle, fdset); }
int physical_IsSet(struct fdescriptor *d, const fd_set *fdset) { struct physical *p = descriptor2physical(d); return p->fd >= 0 && FD_ISSET(p->fd, fdset); }
*p->name.full = '\0'; } void physical_Destroy(struct physical *p) { physical_Close(p); throughput_destroy(&p->link.stats.total); free(p); } static int physical_DescriptorWrite(struct fdescriptor *d, struct bundle *bundle __unused, const fd_set *fdset __unused) { struct physical *p = descriptor2physical(d); int nw, result = 0; if (p->out == NULL) p->out = link_Dequeue(&p->link); if (p->out) { nw = physical_Write(p, MBUF_CTOP(p->out), p->out->m_len); log_Printf(LogDEBUG, "%s: DescriptorWrite: wrote %d(%lu) to %d\n", p->link.name, nw, (unsigned long)p->out->m_len, p->fd); if (nw > 0) { p->out->m_len -= nw; p->out->m_offset += nw; if (p->out->m_len == 0) p->out = m_free(p->out); result = 1;