/*--------------------------------------------------------------------------*/ static void check_monitor(int monsock){ fd_set monavail; struct timeval tv; struct sockaddr monfrom; socklen_t monfromlen; int size; char buf[BUFSIZE]; struct ifreq ifr; // ------ Check if there is new data on the monitor socket FD_ZERO(&monavail); FD_SET(monsock, &monavail); tv.tv_sec = 0; tv.tv_usec = DWELL; select(monsock + 1, &monavail, 0, 0, &tv); if (FD_ISSET(monsock, &monavail)) { monfromlen = sizeof(monfrom); size = recvfrom(monsock, buf, sizeof(buf), 0, &monfrom, &monfromlen); //------ Check if we have received a AX.25-packet strcpy(ifr.ifr_name, monfrom.sa_data); ioctl(monsock, SIOCGIFHWADDR, &ifr); if (ifr.ifr_hwaddr.sa_family == AF_AX25) { #ifdef NEW_AX25_STACK ax25_dump(buf, size, 0); #else ki_dump(buf, size, 0); #endif } // end if AX25 } // end if }
int main(int argc, char **argv) { unsigned char buffer[BUFSIZE]; int dumpstyle = ASCII; int size; int s; char *port = NULL, *dev = NULL; struct sockaddr sa; socklen_t asize = sizeof(sa); struct ifreq ifr; int proto = ETH_P_AX25; int exit_code = EXIT_SUCCESS; timestamp = 0; while ((s = getopt(argc, argv, "8achip:rtv")) != -1) { switch (s) { case '8': sevenbit = 0; break; case 'a': proto = ETH_P_ALL; break; case 'c': color = 1; break; case 'h': dumpstyle = HEX; break; case 'i': ibmhack = 1; break; case 'p': port = optarg; break; case 'r': dumpstyle = READABLE; break; case 't': timestamp = 1; break; case 'v': printf("listen: %s\n", VERSION); return 0; case ':': fprintf(stderr, "listen: option -p needs a port name\n"); return 1; case '?': fprintf(stderr, "Usage: listen [-8] [-a] [-c] [-h] [-i] [-p port] [-r] [-t] [-v]\n"); return 1; } } if (ax25_config_load_ports() == 0) fprintf(stderr, "listen: no AX.25 port data configured\n"); if (port != NULL) { if ((dev = ax25_config_get_dev(port)) == NULL) { fprintf(stderr, "listen: invalid port name - %s\n", port); return 1; } } if ((sock = socket(PF_PACKET, SOCK_PACKET, htons(proto))) == -1) { perror("socket"); return 1; } if (color) { color = initcolor(); /* Initialize color support */ if (!color) printf("Could not initialize color support.\n"); } setservent(1); while (!sigint) { asize = sizeof(sa); signal(SIGINT, handle_sigint); signal(SIGTERM, handle_sigint); if ((size = recvfrom(sock, buffer, sizeof(buffer), 0, &sa, &asize)) == -1) { /* * Signals are cared for by the handler, and we * don't want to abort on SIGWINCH */ if (errno == EINTR) { refresh(); continue; } else if (!(errno == EBADF && sigint)) { perror("recv"); exit_code = errno; } break; } signal(SIGINT, SIG_DFL); signal(SIGTERM, SIG_DFL); if (sock == -1 || sigint) break; if (dev != NULL && strcmp(dev, sa.sa_data) != 0) continue; if (proto == ETH_P_ALL) { strcpy(ifr.ifr_name, sa.sa_data); signal(SIGINT, handle_sigint); signal(SIGTERM, handle_sigint); if (ioctl(sock, SIOCGIFHWADDR, &ifr) == -1) { if (!(errno == EBADF && sigint)) { perror("SIOCGIFHWADDR"); exit_code = errno; break; } } signal(SIGINT, SIG_DFL); signal(SIGTERM, SIG_DFL); if (sock == -1 || sigint) break; if (ifr.ifr_hwaddr.sa_family == AF_AX25) { display_port(sa.sa_data); #ifdef NEW_AX25_STACK ax25_dump(buffer, size, dumpstyle); #else ki_dump(buffer, size, dumpstyle); #endif /* lprintf(T_DATA, "\n"); */ } } else { display_port(sa.sa_data); #ifdef NEW_AX25_STACK ax25_dump(buffer, size, dumpstyle); #else ki_dump(buffer, size, dumpstyle); #endif /* lprintf(T_DATA, "\n"); */ } if (color) refresh(); } if (color) endwin(); return exit_code; }