X-Git-Url: https://git.decadent.org.uk/gitweb/?p=ap-utils.git;a=blobdiff_plain;f=lib%2Fstat.c;fp=lib%2Fstat.c;h=56f46953428170f43f1eff1a0dc935e8cde0533d;hp=c3d969ca7ce3b6d3bacc3c995c6d99cb286765d4;hb=67fc54773e1504698e80c9cb83977bde32665350;hpb=6a9e980b8799891e0a5467a0126a60b169c8f4eb diff --git a/lib/stat.c b/lib/stat.c index c3d969c..56f4695 100644 --- a/lib/stat.c +++ b/lib/stat.c @@ -22,15 +22,13 @@ #include #include #include +#include #include #include "ap-utils.h" #include "ap-curses.h" -#define ERR_RET_PRESS _("Unable to get data from AP. Press Q to continue.") -#define QHELP _("Q - quit to menu.") -#define PIPE _("pipe error. Press any key.") -#define FCNTL _("fcntl error. Press any key.") -#define FORK _("fork error. Press any key.") +#define QHELP _("Q - quit to menu. Other key - force update.") +#define SELECT _("select() function error. Press any key.") extern WINDOW *main_sub; extern short ap_type; @@ -47,11 +45,11 @@ void EthStat() char EthTx[] = { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x01, 0x07, 0x02, 0x00 }; - char c; char message[1024]; - pid_t pid; - int j, child_pipe[2]; + int j; varbind varbinds[2]; + fd_set rds; + struct timeval timeout; if (ap_type == ATMEL12350) { EthRx[5] = 0xE0; @@ -60,41 +58,27 @@ void EthStat() EthTx[6] = 0x3E; } - if (pipe(child_pipe) == -1) { - print_helperr(PIPE); - goto exit; - } - - if (fcntl(child_pipe[0], F_SETFL, O_NONBLOCK) == -1) { - print_helperr(FCNTL); - goto exit; - } print_title(_("Ethernet Statistics")); print_help(QHELP); noecho(); - switch (pid = fork()) { - case -1: - print_helperr(FORK); - goto exit; - case 0: - close(child_pipe[1]); - varbinds[0].oid = EthRx; - varbinds[0].len_oid = sizeof(EthRx); - varbinds[1].oid = EthTx; - varbinds[1].len_oid = sizeof(EthTx); - - start: - varbinds[0].value = EthTx; + varbinds[0].oid = EthRx; + varbinds[0].len_oid = sizeof(EthRx); + varbinds[1].oid = EthTx; + varbinds[1].len_oid = sizeof(EthTx); + + while (1) { +// varbinds[0].value = EthTx; varbinds[0].len_val = 0; varbinds[0].type = NULL_VALUE; - varbinds[1].value = EthTx; +// varbinds[1].value = EthTx; varbinds[1].len_val = 0; varbinds[1].type = NULL_VALUE; if (snmp(varbinds, 2, GET) <= 0) { - print_helperr(ERR_RET_PRESS); - goto exit_child; + print_helperr(ERR_RET); + getch(); + goto quit; } if (varbinds[0].len_val == 64) { @@ -105,8 +89,9 @@ void EthStat() len_val); memcpy(EthRxStat, varbinds[0].value, varbinds[0].len_val); } else { - print_helperr(_("EthRxStat packet error. Press Q to continue.")); - goto exit_child; + print_helperr(_("EthRxStat packet error. Press any key.")); + getch(); + goto quit; } if (varbinds[1].len_val == 56) { @@ -117,8 +102,9 @@ void EthStat() len_val); memcpy(EthTxStat, varbinds[1].value, varbinds[1].len_val); } else { - print_helperr(_("EthTxStat packet error. Press Q to continue.")); - goto exit_child; + print_helperr(_("EthTxStat packet error. Press any key.")); + getch(); + goto quit; } mvwaddstr(main_sub, 1, 2, _("Received:")); mvwaddstr(main_sub, 1, 30, _("Transmitted:")); @@ -188,26 +174,33 @@ void EthStat() swap4(EthTxStat->TotalCollisionsTx)); mvwaddstr(main_sub, 18, 2, message); wrefresh(main_sub); - exit_child: - switch (j = read(child_pipe[0], &c, 1)) { - case -1: + + timeout.tv_sec = 1; + timeout.tv_usec = 0; + FD_ZERO(&rds); + FD_SET(0, &rds); + + /* wait up to timeout until anything is avail. for reading on stdin */ + j = select(1, &rds, NULL, NULL, &timeout); + + /* error occured */ + if (j == -1) { + print_helperr(SELECT); + getch(); break; - default: - exit(0); } - sleep(1); - goto start; - default: - close(child_pipe[0]); - while (getch() != 'q'); - write(child_pipe[1], "0", 1); - wait((int *) 0); - close(child_pipe[1]); - goto quit; + + /* not timed out => anything avail. for reading in &rds */ + if (j != 0) { + j = getc(stdin); + if (j == 'q' || j == 'Q') + break; + + } + + /* j = 0 => timeout => continue looping */ } - exit: - getch(); quit: if (EthRxStat) free(EthRxStat); @@ -228,50 +221,40 @@ void WirelessStat() { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x03, 0x01, 0x00 }; - char message[80], c; - pid_t pid; - int j, child_pipe[2]; - + char message[80]; + int j; varbind varbinds[1]; + fd_set rds; + struct timeval timeout; if (ap_type == ATMEL12350) { Wireless[5] = 0xE0; Wireless[6] = 0x3E; } - if (pipe(child_pipe) == -1) { - print_helperr(PIPE); - goto exit; - } - - if (fcntl(child_pipe[0], F_SETFL, O_NONBLOCK) == -1) { - print_helperr(FCNTL); - goto exit; - } print_title(_("Wireless Statistics")); print_help(QHELP); noecho(); - switch (pid = fork()) { - case -1: - print_helperr(FORK); - goto exit_child; - case 0: - close(child_pipe[1]); - varbinds[0].oid = Wireless; - varbinds[0].len_oid = sizeof(Wireless); + varbinds[0].oid = Wireless; + varbinds[0].len_oid = sizeof(Wireless); - start: + while (1) { varbinds[0].value = Wireless; varbinds[0].len_val = 0; varbinds[0].type = NULL_VALUE; if (snmp(varbinds, 1, GET) <= 0) { - print_helperr(ERR_RET_PRESS); - goto exit_child; + print_helperr(ERR_RET); + getch(); + goto quit; } - if (varbinds[0].len_val == 88) { + if (varbinds[0].len_val == 88 || varbinds[0].len_val == 104) { + /* + * 88 ... using traditional ATMEL 12350 MIB + * 104 .. using functionally enhanced ATMEL 12350 MIB by VERNET + */ if (WirelessStat) free(WirelessStat); WirelessStat = @@ -279,8 +262,9 @@ void WirelessStat() memcpy(WirelessStat, varbinds[0].value, varbinds[0].len_val); } else { print_helperr - (_("WirelessStat packet error. Press Q to continue.")); - goto exit; + (_("WirelessStat packet error. Press any key.")); + getch(); + goto quit; } sprintf(message, @@ -342,28 +326,50 @@ void WirelessStat() sprintf(message, "InvalidPLCP %10u", swap4(WirelessStat->InvalidPLCP)); mvwaddstr(main_sub, 15, 1, message); - + /* ATMEL12350 MIB 'VERNET' modification has in addition the following */ + if (varbinds[0].len_val == 104) { + mvwaddstr(main_sub, 16, 1, "TransmittedPackets:"); + sprintf(message, "* at 11 Mbps %10u", + swap4(WirelessStat->TransmittedPackets_11Mbps)); + mvwaddstr(main_sub, 17, 1, message); + sprintf(message, "* at 5.5 Mbps %10u", + swap4(WirelessStat->TransmittedPackets_55Mbps)); + mvwaddstr(main_sub, 18, 1, message); + sprintf(message, "* at 2 Mbps %10u", + swap4(WirelessStat->TransmittedPackets_2Mbps)); + mvwaddstr(main_sub, 19, 1, message); + sprintf(message, "* at 1 Mbps %10u", + swap4(WirelessStat->TransmittedPackets_1Mbps)); + mvwaddstr(main_sub, 20, 1, message); + } wrefresh(main_sub); - exit_child: - switch (j = read(child_pipe[0], &c, 1)) { - case -1: + + timeout.tv_sec = 1; + timeout.tv_usec = 0; + FD_ZERO(&rds); + FD_SET(0, &rds); + + /* wait up to timeout until anything is avail. for reading on stdin */ + j = select(1, &rds, NULL, NULL, &timeout); + + /* error occured */ + if (j == -1) { + print_helperr(SELECT); + getch(); break; - default: - exit(0); } - sleep(1); - goto start; - default: - close(child_pipe[0]); - while (getch() != 'q'); - write(child_pipe[1], "0", 1); - wait((int *) 0); - close(child_pipe[1]); - goto quit; + + /* not timed out => anything avail. for reading in &rds */ + if (j != 0) { + j = getc(stdin); + if (j == 'q' || j == 'Q') + break; + + } + + /* j = 0 => timeout => continue looping */ } - exit: - getch(); quit: if (WirelessStat) free(WirelessStat); @@ -408,76 +414,61 @@ void nwn_wireless_stat() char oid_dot11WEPExcludedCount[] = { 0x2a, 0x86, 0x48, 0xce, 0x34, 0x01, 0x05, 0x01, 0x06, 0x01 }; - char message[80], c; - pid_t pid; - int j, child_pipe[2], i; + char message[80]; + int j; + fd_set rds; + struct timeval timeout; varbind varbinds[16]; curs_set(0); - if (pipe(child_pipe) == -1) { - print_helperr(_("pipe error. Press any key")); - goto exit; - } - - if (fcntl(child_pipe[0], F_SETFL, O_NONBLOCK) == -1) { - print_helperr(_("fcntl error. Press any key")); - goto exit; - } print_title(_("Wireless Statistics")); - print_help(_("Q - quit to menu.")); + print_help(QHELP); noecho(); - switch (pid = fork()) { - case -1: - print_helperr(_("fork error. Press any key")); - goto exit_child; - case 0: - close(child_pipe[1]); - varbinds[0].oid = oid_dot11TransmittedFragmentCount; - varbinds[0].len_oid = sizeof(oid_dot11TransmittedFragmentCount); - varbinds[1].oid = oid_dot11MulticastTransmittedFrameCount; - varbinds[1].len_oid = - sizeof(oid_dot11MulticastTransmittedFrameCount); - varbinds[2].oid = oid_dot11FailedCount; - varbinds[2].len_oid = sizeof(oid_dot11FailedCount); - varbinds[3].oid = oid_dot11RetryCount; - varbinds[3].len_oid = sizeof(oid_dot11RetryCount); - varbinds[4].oid = oid_dot11MultipleRetryCount; - varbinds[4].len_oid = sizeof(oid_dot11MultipleRetryCount); - varbinds[5].oid = oid_dot11FrameDuplicateCount; - varbinds[5].len_oid = sizeof(oid_dot11FrameDuplicateCount); - varbinds[6].oid = oid_dot11RTSSuccessCount; - varbinds[6].len_oid = sizeof(oid_dot11RTSSuccessCount); - varbinds[7].oid = oid_dot11RTSFailureCount; - varbinds[7].len_oid = sizeof(oid_dot11RTSFailureCount); - varbinds[8].oid = oid_dot11ACKFailureCount; - varbinds[8].len_oid = sizeof(oid_dot11ACKFailureCount); - varbinds[9].oid = oid_dot11ReceivedFragmentCount; - varbinds[9].len_oid = sizeof(oid_dot11ReceivedFragmentCount); - varbinds[10].oid = oid_dot11MulticastReceivedFrameCount; - varbinds[10].len_oid = - sizeof(oid_dot11MulticastReceivedFrameCount); - varbinds[11].oid = oid_dot11FCSErrorCount; - varbinds[11].len_oid = sizeof(oid_dot11FCSErrorCount); - varbinds[12].oid = oid_dot11TransmittedFrameCount; - varbinds[12].len_oid = sizeof(oid_dot11TransmittedFrameCount); - varbinds[13].oid = oid_dot11WEPUndecryptableCount; - varbinds[13].len_oid = sizeof(oid_dot11WEPUndecryptableCount); - varbinds[14].oid = oid_dot11WEPICVErrorCount; - varbinds[14].len_oid = sizeof(oid_dot11WEPICVErrorCount); - varbinds[15].oid = oid_dot11WEPExcludedCount; - varbinds[15].len_oid = sizeof(oid_dot11WEPExcludedCount); - - start: - for (i = 0; i < 16; i++) { - varbinds[i].value = oid_dot11TransmittedFragmentCount; - varbinds[i].len_val = 0; - varbinds[i].type = 0x05; + varbinds[0].oid = oid_dot11TransmittedFragmentCount; + varbinds[0].len_oid = sizeof(oid_dot11TransmittedFragmentCount); + varbinds[1].oid = oid_dot11MulticastTransmittedFrameCount; + varbinds[1].len_oid = sizeof(oid_dot11MulticastTransmittedFrameCount); + varbinds[2].oid = oid_dot11FailedCount; + varbinds[2].len_oid = sizeof(oid_dot11FailedCount); + varbinds[3].oid = oid_dot11RetryCount; + varbinds[3].len_oid = sizeof(oid_dot11RetryCount); + varbinds[4].oid = oid_dot11MultipleRetryCount; + varbinds[4].len_oid = sizeof(oid_dot11MultipleRetryCount); + varbinds[5].oid = oid_dot11FrameDuplicateCount; + varbinds[5].len_oid = sizeof(oid_dot11FrameDuplicateCount); + varbinds[6].oid = oid_dot11RTSSuccessCount; + varbinds[6].len_oid = sizeof(oid_dot11RTSSuccessCount); + varbinds[7].oid = oid_dot11RTSFailureCount; + varbinds[7].len_oid = sizeof(oid_dot11RTSFailureCount); + varbinds[8].oid = oid_dot11ACKFailureCount; + varbinds[8].len_oid = sizeof(oid_dot11ACKFailureCount); + varbinds[9].oid = oid_dot11ReceivedFragmentCount; + varbinds[9].len_oid = sizeof(oid_dot11ReceivedFragmentCount); + varbinds[10].oid = oid_dot11MulticastReceivedFrameCount; + varbinds[10].len_oid = sizeof(oid_dot11MulticastReceivedFrameCount); + varbinds[11].oid = oid_dot11FCSErrorCount; + varbinds[11].len_oid = sizeof(oid_dot11FCSErrorCount); + varbinds[12].oid = oid_dot11TransmittedFrameCount; + varbinds[12].len_oid = sizeof(oid_dot11TransmittedFrameCount); + varbinds[13].oid = oid_dot11WEPUndecryptableCount; + varbinds[13].len_oid = sizeof(oid_dot11WEPUndecryptableCount); + varbinds[14].oid = oid_dot11WEPICVErrorCount; + varbinds[14].len_oid = sizeof(oid_dot11WEPICVErrorCount); + varbinds[15].oid = oid_dot11WEPExcludedCount; + varbinds[15].len_oid = sizeof(oid_dot11WEPExcludedCount); + + while (1) { + for (j = 0; j < 16; j++) { + varbinds[j].value = oid_dot11TransmittedFragmentCount; + varbinds[j].len_val = 0; + varbinds[j].type = 0x05; } if (snmp(varbinds, 16, GET) <= 0) { - print_helperr(ERR_RET_PRESS); - goto exit_child; + print_helperr(ERR_RET); + getch(); + goto quit; } sprintf(message, "FragmentTx %10lu FragmentRx %10lu", @@ -512,26 +503,33 @@ void nwn_wireless_stat() (long) swap4(*(varbinds[14].value))); mvwaddstr(main_sub, 10, 1, message); wrefresh(main_sub); - exit_child: - switch (j = read(child_pipe[0], &c, 1)) { - case -1: + + timeout.tv_sec = 1; + timeout.tv_usec = 0; + FD_ZERO(&rds); + FD_SET(0, &rds); + + /* wait up to timeout until anything is avail. for reading on stdin */ + j = select(1, &rds, NULL, NULL, &timeout); + + /* error occured */ + if (j == -1) { + print_helperr(SELECT); + getch(); break; - default: - exit(0); } - sleep(1); - goto start; - default: - close(child_pipe[0]); - while (getch() != 'q'); - write(child_pipe[1], "0", 1); - wait((int *) 0); - close(child_pipe[1]); - goto quit; + + /* not timed out => anything avail. for reading in &rds */ + if (j != 0) { + j = getc(stdin); + if (j == 'q' || j == 'Q') + break; + + } + + /* j = 0 => timeout => continue looping */ } - exit: - getch(); quit: wclear(main_sub); print_title("");