+/***************************************************************************
+ * 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)
void ipt_ACCOUNT_free_entries(struct ipt_ACCOUNT_context *ctx)
{
- if (ctx->handle.handle_nr >= 0)
+ if (ctx->handle.handle_nr != -1)
{
setsockopt(ctx->sockfd, IPPROTO_IP, IPT_SO_SET_ACCOUNT_HANDLE_FREE, &ctx->handle, sizeof (struct ipt_account_handle_sockopt));
ctx->handle.handle_nr = -1;
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;
}