# #include "util.h" #include "pkts.h" #include "buf.h" #define SIGAIO 17 int net, netf; netint() { netf++; } net_init(lskt, fhost, fskt) short lskt, fskt; long fhost; { struct netdf { short n_prot1; short n_prot2; long n_fhost; short n_fskt; short n_lskt; } netdf; register struct netdf *ndp; netf = 0; signal(SIGAIO, &netint); ndp = &netdf; ndp->n_prot1 = INETPROT; ndp->n_prot2 = TCPPROT; ndp->n_fhost = fhost; ndp->n_fskt = fskt; ndp->n_lskt = lskt; if ((net = netopen(devnet, ndp)) == ERR) { logerr("net_init netopen error %d\n", errno); return(FALSE); } return(TRUE); } net_close() { close(net); } struct rcvpkt *rd_pkt() { register struct rcvpkt *ppkt; if ( ((ppkt = gtque(&frq)) == NULL) && ((ppkt = gtque(&rwaitq)) == NULL) ) return(NULL); if (!rd_net(ppkt)) { enque(&frq, ppkt); return(NULL); } stats.s_rpkt++; return(ppkt); } rd_net(ppkt) register struct rcvpkt *ppkt; { int plen; if ((plen = read(net, &ppkt->rp_net, NETDATA)) == ERR) { logerr("rd_net read error %d\n", errno); return(FALSE); } if (plen == 0) { return(FALSE); } ppkt->rp_len = plen; return(TRUE); } wr_pkt(ppkt, plen) char *ppkt; short plen; { short i; if (plen & 01) plen++; for (i = 0; i < 5; i++) { if (write(net, ppkt, plen) == ERR) wr_err(errno); else { stats.s_spkt++; return(TRUE); } } return(FALSE); } wr_err(eno) int eno; { switch(eno) { case EIO: stats.s_errs[WEIO]++; break; case EACCES: stats.s_errs[WREFUSE]++; break; default: stats.s_errs[WERR]++; break; } return; }