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));
+ setsockopt(ctx->sockfd, IPPROTO_IP, IPT_SO_SET_ACCOUNT_HANDLE_FREE, &ctx->handle, sizeof (struct ipt_acc_handle_sockopt));
ctx->handle.handle_nr = -1;
}
ctx->sockfd =-1;
}
-int ipt_ACCOUNT_read_entries(struct ipt_ACCOUNT_context *ctx, char *table, char dont_flush)
+int ipt_ACCOUNT_read_entries(struct ipt_ACCOUNT_context *ctx, const char *table, char dont_flush)
{
- unsigned int s = sizeof (struct ipt_account_handle_sockopt);
+ unsigned int s = sizeof (struct ipt_acc_handle_sockopt);
int rtn;
strncpy(ctx->handle.name, table, ACCOUNT_TABLE_NAME_LEN-1);
// Check data buffer size
ctx->pos = 0;
- unsigned int new_size = ctx->handle.itemcount * sizeof(struct ipt_account_handle_ip);
+ unsigned int new_size = ctx->handle.itemcount * sizeof(struct ipt_acc_handle_ip);
// We want to prevent reallocations all the time
if (new_size < IPT_ACCOUNT_MIN_BUFSIZE)
new_size = IPT_ACCOUNT_MIN_BUFSIZE;
}
// Copy data from kernel
- memcpy(ctx->data, &ctx->handle, sizeof(struct ipt_account_handle_sockopt));
+ memcpy(ctx->data, &ctx->handle, sizeof(struct ipt_acc_handle_sockopt));
rtn = getsockopt(ctx->sockfd, IPPROTO_IP, IPT_SO_GET_ACCOUNT_GET_DATA, ctx->data, &ctx->data_size);
if (rtn < 0)
{
}
// Free kernel handle but don't reset pos/itemcount
- setsockopt(ctx->sockfd, IPPROTO_IP, IPT_SO_SET_ACCOUNT_HANDLE_FREE, &ctx->handle, sizeof (struct ipt_account_handle_sockopt));
+ setsockopt(ctx->sockfd, IPPROTO_IP, IPT_SO_SET_ACCOUNT_HANDLE_FREE, &ctx->handle, sizeof (struct ipt_acc_handle_sockopt));
ctx->handle.handle_nr = -1;
return 0;
}
-struct ipt_account_handle_ip *ipt_ACCOUNT_get_next_entry(struct ipt_ACCOUNT_context *ctx)
+struct ipt_acc_handle_ip *ipt_ACCOUNT_get_next_entry(struct ipt_ACCOUNT_context *ctx)
{
- struct ipt_account_handle_ip *rtn;
+ struct ipt_acc_handle_ip *rtn;
// Empty or no more items left to return?
if (!ctx->handle.itemcount || ctx->pos >= ctx->handle.itemcount)
return NULL;
// Get next entry
- rtn = (struct ipt_account_handle_ip *)(ctx->data + ctx->pos*sizeof(struct ipt_account_handle_ip));
+ rtn = (struct ipt_acc_handle_ip *)(ctx->data + ctx->pos*sizeof(struct ipt_acc_handle_ip));
ctx->pos++;
return rtn;
}
+
+int ipt_ACCOUNT_get_handle_usage(struct ipt_ACCOUNT_context *ctx)
+{
+ unsigned int s = sizeof (struct ipt_acc_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;
+}
+
+const char *ipt_ACCOUNT_get_next_name(struct ipt_ACCOUNT_context *ctx)
+{
+ if (((char *)ctx->data)[ctx->pos] == 0)
+ return 0;
+
+ const char *rtn = ctx->data + ctx->pos;
+ ctx->pos += strlen(ctx->data+ctx->pos) + 1;
+
+ return rtn;
+}