int getchar(void) { unsigned char c = '\0'; int i; for (;;) { i = apbus ? apcall_read(1, &c, 1) : rom_read(1, &c, 1); if (i == 1) break; if (i != -2 && i != 0) return -1; } return c; }
/* * Receive a packet, including the ether header. * Return the total length received (or -1 on error). */ ssize_t netif_get(struct iodesc *desc, void *pkt, size_t maxlen, time_t timo) { struct romdev *pd; int tick0; ssize_t len; pd = (struct romdev *)desc->io_netif; #ifdef NETIF_DEBUG if (netif_debug) printf("netif_get: pkt=0x%x, maxlen=%d, tmo=%d\n", pkt, maxlen, timo); #endif tick0 = getsecs(); do { len = apcall_read(pd->fd, pkt, maxlen); } while ((len == 0) && ((getsecs() - tick0) < timo)); #ifdef NETIF_DEBUG if (netif_debug) printf("netif_get: received len=%d\n", len); #endif if (len < 12) return -1; #ifdef NETIF_DEBUG if (netif_debug) { struct ether_header *eh = pkt; printf("dst: %s ", ether_sprintf(eh->ether_dhost)); printf("src: %s ", ether_sprintf(eh->ether_shost)); printf("type: 0x%x\n", eh->ether_type & 0xFFFF); } #endif return len; }