]> git.ipfire.org Git - people/stevee/perl-ipset.git/commitdiff
Add function to remove addresses or networks from a set.
authorStefan Schantl <stefan.schantl@ipfire.org>
Sat, 17 Sep 2022 13:59:21 +0000 (15:59 +0200)
committerStefan Schantl <stefan.schantl@ipfire.org>
Sat, 17 Sep 2022 13:59:21 +0000 (15:59 +0200)
Signed-off-by: Stefan Schantl <stefan.schantl@ipfire.org>
IPSet.xs
t/IPSet.t

index 75bbf1e718765c6e3bb1dae42032cae7f3f7bb24..160bfa90fbc366c92144701b3b94a9fa9c19c67c 100644 (file)
--- a/IPSet.xs
+++ b/IPSet.xs
@@ -383,6 +383,53 @@ add_address(session, setname, address)
                END:
        OUTPUT:
                RETVAL
+
+bool
+remove_address(session, setname, address)
+       struct ipset_session *session;
+       const char *setname;
+       const char *address;
+
+       PREINIT:
+               enum ipset_cmd cmd = IPSET_CMD_DEL;
+               const struct ipset_type *type;
+
+       CODE:
+               // Assign setname as session data.
+               int r = ipset_session_data_set(session, IPSET_SETNAME, setname);
+               if (r < 0) {
+                       goto ERROR;
+               }
+
+               // Get the set type.
+               type = ipset_type_get(session, cmd);
+               if (type = NULL) {
+                       goto ERROR;
+               }
+
+               // Parse and try to add the given address to the session data.
+               r = ipset_parse_ip(session, IPSET_OPT_IP, address);
+               if (r < 0) {
+                       goto ERROR;
+               }
+
+               r = ipset_cmd(session, cmd, 0);
+               if (r < 0){
+                       goto ERROR;
+               }
+
+               RETVAL = true;
+
+               goto END;
+
+               ERROR:
+                       RETVAL = false;
+
+                       // Reset session data.
+                       ipset_data_reset(ipset_session_data(session));
+               END:
+       OUTPUT:
+               RETVAL
  
 #
 # Get functions to ask for various data or receive error messages.
index 88a61e98b81ea634af3157460aeb7a4ca0960f0e..76bd249280606f61098d3ea91b243bb1976622b5 100644 (file)
--- a/t/IPSet.t
+++ b/t/IPSet.t
@@ -8,7 +8,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 16;
+use Test::More tests => 19;
 BEGIN { use_ok('IPSet') };
 
 #########################
@@ -84,5 +84,14 @@ foreach my $address (@addresses) {
 $data = &IPSet::get_set_data($session, $testset{'name'});
 ok($data->{entries} eq scalar(@addresses), "All addresses added successfully to the set");
 
+# Remove the first address from array from the set.
+my $remove = &IPSet::remove_address($session, $testset{'name'}, $addresses[0]);
+ok($remove, "Successfully removed $addresses[0] from testset");
+
+# Update set data.
+$data = &IPSet::get_set_data($session, $testset{'name'});
+ok($data->{entries} lt scalar(@addresses), "Less entries in the set than at the addresses array");
+ok($data->{entries} gt 0, "At least one entry on the testset");
+
 # CLEANUP: Delete the remaining set.
 &IPSet::delete_set($session, $testset{'name'});