X-Git-Url: http://developer.intra2net.com/git/?p=libipt_ACCOUNT;a=blobdiff_plain;f=src%2Fipt_ACCOUNT_cl.c;h=aa4937a167a0ad49bfc0d6fc3867103e30063c0f;hp=1daf35ee1f921df50e6fb4b109af6c9b2f280789;hb=6a4a14ebf16a59a1aa60006c34b4b4b7bac2be4f;hpb=49ba89493aabfeff81d64be729727b22d504a2c0 diff --git a/src/ipt_ACCOUNT_cl.c b/src/ipt_ACCOUNT_cl.c index 1daf35e..aa4937a 100644 --- a/src/ipt_ACCOUNT_cl.c +++ b/src/ipt_ACCOUNT_cl.c @@ -44,7 +44,7 @@ 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; @@ -139,3 +139,49 @@ struct ipt_account_handle_ip *ipt_ACCOUNT_get_next_entry(struct ipt_ACCOUNT_cont return rtn; } + +int ipt_ACCOUNT_get_handle_usage(struct ipt_ACCOUNT_context *ctx) +{ + 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) +{ + 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; +} + +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) + { + ctx->error_str = "Can't get table names from kernel. Out of memory, MINBUFISZE too small?"; + return -1; + } + ctx->pos = 0; + return 0; +} + +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; + + return rtn; +}