void process(int fd, int pkt_type) { struct sockaddr from; int fromlen = sizeof (from), cc, omask; struct ipx *ipxdp = (struct ipx *)packet; cc = recvfrom(fd, packet, sizeof (packet), 0, &from, &fromlen); if (cc <= 0) { if (cc < 0 && errno != EINTR) syslog(LOG_ERR, "recvfrom: %m"); return; } if (tracepackets > 1 && ftrace) { fprintf(ftrace,"rcv %d bytes on %s ", cc, ipxdp_ntoa(&ipxdp->ipx_dna)); fprintf(ftrace," from %s\n", ipxdp_ntoa(&ipxdp->ipx_sna)); } if (noteremoterequests && !ipx_neteqnn(ipxdp->ipx_sna.x_net, ipx_zeronet) && !ipx_neteq(ipxdp->ipx_sna, ipxdp->ipx_dna)) { syslog(LOG_ERR, "net of interface (%s) != net on ether (%s)!\n", ipxdp_nettoa(ipxdp->ipx_dna.x_net), ipxdp_nettoa(ipxdp->ipx_sna.x_net)); } /* We get the IPX header in front of the RIF packet*/ cc -= sizeof (struct ipx); #define mask(s) (1<<((s)-1)) omask = sigblock(mask(SIGALRM)); switch(pkt_type) { case SAP_PKT: sap_input(&from, cc); break; case RIP_PKT: rip_input(&from, cc); break; } sigsetmask(omask); }
char * ipxdp_ntoa(struct ipx_addr *addr) { static char buf[100]; sprintf(buf, "%s#%x:%x:%x:%x:%x:%x", ipxdp_nettoa(addr->x_net), addr->x_host.c_host[0], addr->x_host.c_host[1], addr->x_host.c_host[2], addr->x_host.c_host[3], addr->x_host.c_host[4], addr->x_host.c_host[5]); return(buf); }
void dumppacket(FILE *fd, char *dir, struct sockaddr *source, char *cp, int size) { struct rip *msg = (struct rip *)cp; struct netinfo *n; struct sockaddr_ipx *who = (struct sockaddr_ipx *)source; if (msg->rip_cmd && ntohs(msg->rip_cmd) < RIPCMD_MAX) fprintf(fd, "%s %s %s#%x", ripcmds[ntohs(msg->rip_cmd)], dir, ipxdp_ntoa(&who->sipx_addr), ntohs(who->sipx_addr.x_port)); else { fprintf(fd, "Bad cmd 0x%x %s %s#%x\n", ntohs(msg->rip_cmd), dir, ipxdp_ntoa(&who->sipx_addr), ntohs(who->sipx_addr.x_port)); fprintf(fd, "size=%d cp=%p packet=%p\n", size, cp, packet); return; } switch (ntohs(msg->rip_cmd)) { case RIPCMD_REQUEST: case RIPCMD_RESPONSE: fprintf(fd, ":\n"); size -= sizeof (u_short); n = msg->rip_nets; for (; size > 0; n++, size -= sizeof (struct netinfo)) { if (size < sizeof (struct netinfo)) break; fprintf(fd, "\tnet %s metric %d ticks %d\n", ipxdp_nettoa(n->rip_dst), ntohs(n->rip_metric), ntohs(n->rip_ticks)); } break; } }