libipt_ACCOUNT, ipt_ACCOUNT: (tomj) implemented handle usage, free all handles and...
[libipt_ACCOUNT] / iptaccount / iptaccount.c
index 7af5955..f8cc97f 100644 (file)
@@ -44,7 +44,7 @@ void show_usage(void)
     printf ("Unknown command line option. Try: [-u] [-h] [-a] [-f] [-l name]\n");
     printf("[-u] show kernel handle usage\n");
     printf("[-h] free all kernel handles (experts only!)\n");
-    printf("[-u] list all table names\n\n");
+    printf("[-a] list all table names\n\n");
     printf("[-l name] show table data\n");
     printf("[-f] flush data after show\n");
     printf("[-c] loop every second (abort with CTRL+C)\n");
@@ -56,15 +56,9 @@ int main(int argc, char *argv[])
     struct ipt_ACCOUNT_context ctx;
     struct ipt_account_handle_ip *entry;
     int i;
-    char optchar, doHandleUsage=0, doHandleFree=0, doListAll=0, doFlush=0, doContinue=0;
+    char optchar, doHandleUsage=0, doHandleFree=0, doTableNames=0, doFlush=0, doContinue=0;
     char *table_name = NULL;
     
-    // Show handle use count
-    // Free all handles
-    // List all tables
-    // do flush
-    // list TABLENAME
-    
     printf("\nipt_ACCOUNT userspace accounting tool v%s\n\n", VERSION);
 
     if (argc == 1)
@@ -84,7 +78,7 @@ int main(int argc, char *argv[])
                 doHandleFree=1;
                 break;
             case 'a':
-                doListAll=1;
+                doTableNames=1;
                 break;
             case 'f':
                 doFlush=1;
@@ -127,36 +121,77 @@ int main(int argc, char *argv[])
         exit (-1);
     }
 
-    // Read out data
-    printf("Showing table: %s\n", table_name);
-    i = 0;
-    while (!exit_now)
+    // Get handle usage?
+    if (doHandleUsage)
     {
-        // Get entries from table test
-        if (ipt_ACCOUNT_read_entries(&ctx, table_name, !doFlush))
+        int rtn = ipt_ACCOUNT_get_handle_usage(&ctx);
+        if (rtn < 0)
         {
-            printf("Read failed: %s\n", ctx.error_str);
-            ipt_ACCOUNT_deinit(&ctx);
+            printf("get_handle_usage failed: %s\n", ctx.error_str);
             exit (-1);
         }
         
-        printf("Run #%d - %u %s found\n", i, ctx.handle.itemcount, ctx.handle.itemcount == 1 ? "item" : "items");
-        
-        // Output and free entries
-        while ((entry = ipt_ACCOUNT_get_next_entry(&ctx)) != NULL)
+        printf("Current kernel handle usage: %d\n", ctx.handle.itemcount);
+    }
+    
+    if (doHandleFree)
+    {
+        int rtn = ipt_ACCOUNT_free_all_handles(&ctx);
+        if (rtn < 0)
         {
-            printf("IP: %s SRC packets: %u bytes: %u DST packets: %u bytes: %u\n",
-                   addr_to_dotted(entry->ip), entry->src_packets, entry->src_bytes, entry->dst_packets, entry->dst_bytes);
+            printf("handle_free_all failed: %s\n", ctx.error_str);
+            exit (-1);
         }
         
-        if (doContinue)
+        printf("Freed all handles in kernel space\n");
+    }
+
+    if (doTableNames)
+    {
+        int rtn = ipt_ACCOUNT_get_table_names(&ctx);
+        if (rtn < 0)
         {
-            sleep(1);
-            i++;
-        } else
-            exit_now = 1;
+            printf("get_table_names failed: %s\n", ctx.error_str);
+            exit (-1);
+        }
+        char *name;
+        while ((name = ipt_ACCOUNT_get_next_name(&ctx)) != NULL)
+            printf("Found table: %s\n", name);
     }
+        
+    if (table_name)
+    {
+        // Read out data
+        printf("Showing table: %s\n", table_name);
+        i = 0;
+        while (!exit_now)
+        {
+            // Get entries from table test
+            if (ipt_ACCOUNT_read_entries(&ctx, table_name, !doFlush))
+            {
+                printf("Read failed: %s\n", ctx.error_str);
+                ipt_ACCOUNT_deinit(&ctx);
+                exit (-1);
+            }
             
+            printf("Run #%d - %u %s found\n", i, ctx.handle.itemcount, ctx.handle.itemcount == 1 ? "item" : "items");
+            
+            // Output and free entries
+            while ((entry = ipt_ACCOUNT_get_next_entry(&ctx)) != NULL)
+            {
+                printf("IP: %s SRC packets: %u bytes: %u DST packets: %u bytes: %u\n",
+                    addr_to_dotted(entry->ip), entry->src_packets, entry->src_bytes, entry->dst_packets, entry->dst_bytes);
+            }
+            
+            if (doContinue)
+            {
+                sleep(1);
+                i++;
+            } else
+                exit_now = 1;
+        }
+    }            
+        
     printf("Finished.\n");
     ipt_ACCOUNT_deinit(&ctx);
     exit (0);