]> git.decadent.org.uk Git - ap-utils.git/blobdiff - lib/stat.c
Imported Upstream version 1.4.2~pre2~a
[ap-utils.git] / lib / stat.c
index c3d969ca7ce3b6d3bacc3c995c6d99cb286765d4..56f46953428170f43f1eff1a0dc935e8cde0533d 100644 (file)
 #include <fcntl.h>
 #include <signal.h>
 #include <string.h>
+#include <sys/time.h>
 #include <sys/wait.h>
 #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("");