X-Git-Url: http://developer.intra2net.com/git/?p=libipt_ACCOUNT;a=blobdiff_plain;f=src%2Fipt_ACCOUNT_cl.c;h=d773b3d17b999cf237d1925a5587d984d0b6182e;hp=52e6d1fc6c996c152a693b631418a03b359e076e;hb=d7e0bb9c552e772bc1ac461194356d1fd6483000;hpb=322f2b5be72befa4a2d26ebf75114ffa5662a964 diff --git a/src/ipt_ACCOUNT_cl.c b/src/ipt_ACCOUNT_cl.c index 52e6d1f..d773b3d 100644 --- a/src/ipt_ACCOUNT_cl.c +++ b/src/ipt_ACCOUNT_cl.c @@ -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 #include -#include +#include +#include +#include #include 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; }