sql plugin supports a list of pools to fall back, specified by e.g. rightsourceip...
authorMartin Willi <martin@strongswan.org>
Wed, 2 Jul 2008 08:31:48 +0000 (08:31 -0000)
committerMartin Willi <martin@strongswan.org>
Wed, 2 Jul 2008 08:31:48 +0000 (08:31 -0000)
src/charon/plugins/sql/sql_attribute.c

index 15a8869..8470427 100644 (file)
@@ -226,13 +226,24 @@ static host_t* acquire_address(private_sql_attribute_t *this,
                                                           char *name, identification_t *id,
                                                           auth_info_t *auth, host_t *requested)
 {
-       host_t *ip;
+       enumerator_t *enumerator;
+       host_t *ip = NULL;
        
-       ip = get_lease(this, name, id);
-       if (!ip)
+       enumerator = enumerator_create_token(name, ",", " ");
+       while (enumerator->enumerate(enumerator, &name))
        {
+               ip = get_lease(this, name, id);
+               if (ip)
+               {
+                       break;
+               }
                ip = create_lease(this, name, id);
+               if (ip)
+               {
+                       break;
+               }
        }
+       enumerator->destroy(enumerator);
        return ip;
 }
 
@@ -242,15 +253,23 @@ static host_t* acquire_address(private_sql_attribute_t *this,
 static bool release_address(private_sql_attribute_t *this,
                                                        char *name, host_t *address)
 {
-       if (this->db->execute(this->db, NULL,
-                       "UPDATE leases SET released = ? WHERE "
-                       "pool IN (SELECT id FROM pools WHERE name = ?) AND "
-                       "address = ? AND released IS NULL",
-                       DB_UINT, time(NULL),
-                       DB_TEXT, name, DB_BLOB, address->get_address(address)) > 0)
+       enumerator_t *enumerator;
+       
+       enumerator = enumerator_create_token(name, ",", " ");
+       while (enumerator->enumerate(enumerator, &name))
        {
-               return TRUE;
+               if (this->db->execute(this->db, NULL,
+                               "UPDATE leases SET released = ? WHERE "
+                               "pool IN (SELECT id FROM pools WHERE name = ?) AND "
+                               "address = ? AND released IS NULL",
+                               DB_UINT, time(NULL),
+                               DB_TEXT, name, DB_BLOB, address->get_address(address)) > 0)
+               {
+                       enumerator->destroy(enumerator);
+                       return TRUE;
+               }
        }
+       enumerator->destroy(enumerator);
        return FALSE;
 }