libipt_ACCOUNT, ipt_ACCOUNT: (tomj) implemented handle usage, free all handles and...
[libipt_ACCOUNT] / src / ipt_ACCOUNT_cl.c
index 52e6d1f..d773b3d 100644 (file)
@@ -1,7 +1,19 @@
+/***************************************************************************
+ *   Copyright (C) 2004 by Intra2net AG                                    *
+ *   opensource@intra2net.com                                              *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU Lesser General Public License           *
+ *   version 2.1 as published by the Free Software Foundation;             *
+ *                                                                         *
+ ***************************************************************************/
+
 #include <sys/types.h>
 #include <sys/socket.h>
-#include <netinet/in.h>
 
+#include <netinet/in.h>
+#include <linux/if.h>
+#include <linux/netfilter_ipv4/ip_tables.h>
 #include <ipt_ACCOUNT_cl.h>
 
 int ipt_ACCOUNT_init(struct ipt_ACCOUNT_context *ctx)
@@ -128,49 +140,48 @@ struct ipt_account_handle_ip *ipt_ACCOUNT_get_next_entry(struct ipt_ACCOUNT_cont
     return rtn;
 }
 
-char *addr_to_dotted(unsigned int addr)
+int ipt_ACCOUNT_get_handle_usage(struct ipt_ACCOUNT_context *ctx)
 {
-    static char buf[20];
-    const unsigned char *bytep;
-
-    bytep = (const unsigned char *) &addr;
-    sprintf(buf, "%d.%d.%d.%d", bytep[0], bytep[1], bytep[2], bytep[3]);
-    return buf;
-}
-
-int main(void)
+    unsigned int s = sizeof (struct ipt_account_handle_sockopt);
+    if (getsockopt(ctx->sockfd, IPPROTO_IP, IPT_SO_GET_ACCOUNT_GET_HANDLE_USAGE, &ctx->handle, &s) < 0)
+    {
+        ctx->error_str = "Can't get handle usage information from kernel";
+        return -1;
+    }
+    
+    return ctx->handle.itemcount;
+ }
+    
+int ipt_ACCOUNT_free_all_handles(struct ipt_ACCOUNT_context *ctx)
 {
-    struct ipt_ACCOUNT_context ctx;
-    struct ipt_account_handle_ip *entry;
-    int i;
+    if (setsockopt(ctx->sockfd, IPPROTO_IP, IPT_SO_SET_ACCOUNT_HANDLE_FREE_ALL, NULL, 0) < 0)
+    {
+        ctx->error_str = "Can't free all kernel handles";
+        return -1;
+    }
+    
+    return 0;
+}
     
-    if(ipt_ACCOUNT_init(&ctx))
+int ipt_ACCOUNT_get_table_names(struct ipt_ACCOUNT_context *ctx)
+{
+    int rtn = getsockopt(ctx->sockfd, IPPROTO_IP, IPT_SO_GET_ACCOUNT_GET_TABLE_NAMES, ctx->data, &ctx->data_size);
+    if (rtn < 0)
     {
-        printf("Init failed: %s\n", ctx.error_str);
-        exit (-1);
+        ctx->error_str = "Can't get table names from kernel. Out of memory, MINBUFISZE too small?";
+        return -1;
     }
+    ctx->pos = 0;
+    return 0;
+}
 
-    for (i = 0; i < 3; i++)
-    {
-        printf("Run #%d\n", i);
-        
-        // Get entries from table test
-        if (ipt_ACCOUNT_read_entries(&ctx, "test", 0))
-        {
-            printf("Read failed: %s\n", ctx.error_str);
-            ipt_ACCOUNT_deinit(&ctx);
-            exit (-1);
-        }
+char *ipt_ACCOUNT_get_next_name(struct ipt_ACCOUNT_context *ctx)
+{
+    if (((char *)ctx->data)[ctx->pos] == NULL)
+        return NULL;
+
+    char *rtn = ctx->data + ctx->pos;
+    ctx->pos += strlen(ctx->data+ctx->pos) + 1;
         
-        // 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);
-        }
-        sleep(1);
-    }
-            
-    ipt_ACCOUNT_deinit(&ctx);
-    exit (0);
+    return rtn;
 }