]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
plugins: add stream and stream services plugin features
authorMartin Willi <martin@revosec.ch>
Fri, 5 Jul 2013 14:04:16 +0000 (16:04 +0200)
committerMartin Willi <martin@revosec.ch>
Wed, 17 Jul 2013 15:11:01 +0000 (17:11 +0200)
src/libstrongswan/plugins/plugin_feature.c
src/libstrongswan/plugins/plugin_feature.h

index 8a1958be5e5093d7cc7532fa37b18fc9f3ab7334..6a30f7346260f0935460f6d19182db6e24dbdd5b 100644 (file)
@@ -51,6 +51,8 @@ ENUM(plugin_feature_names, FEATURE_NONE, FEATURE_CUSTOM,
        "DATABASE",
        "FETCHER",
        "RESOLVER",
+       "STREAM",
+       "STREAM_SERVICE",
        "CUSTOM",
 );
 
@@ -93,6 +95,10 @@ u_int32_t plugin_feature_hash(plugin_feature_t *feature)
                case FEATURE_EAP_PEER:
                        data = chunk_from_thing(feature->arg);
                        break;
+               case FEATURE_STREAM:
+               case FEATURE_STREAM_SERVICE:
+                       data = chunk_create(feature->arg.prefix,
+                                                               strlen(feature->arg.prefix));
                case FEATURE_CUSTOM:
                        data = chunk_create(feature->arg.custom,
                                                                strlen(feature->arg.custom));
@@ -167,6 +173,9 @@ bool plugin_feature_matches(plugin_feature_t *a, plugin_feature_t *b)
                        case FEATURE_XAUTH_SERVER:
                        case FEATURE_XAUTH_PEER:
                                return streq(a->arg.xauth, b->arg.xauth);
+                       case FEATURE_STREAM:
+                       case FEATURE_STREAM_SERVICE:
+                               return streq(a->arg.prefix, b->arg.prefix);
                }
        }
        return FALSE;
@@ -206,6 +215,8 @@ bool plugin_feature_equals(plugin_feature_t *a, plugin_feature_t *b)
                        case FEATURE_CUSTOM:
                        case FEATURE_XAUTH_SERVER:
                        case FEATURE_XAUTH_PEER:
+                       case FEATURE_STREAM:
+                       case FEATURE_STREAM_SERVICE:
                                return plugin_feature_matches(a, b);
                        case FEATURE_RNG:
                                return a->arg.rng_quality == b->arg.rng_quality;
@@ -373,6 +384,14 @@ char* plugin_feature_get_string(plugin_feature_t *feature)
                                return str;
                        }
                        break;
+               case FEATURE_STREAM:
+               case FEATURE_STREAM_SERVICE:
+                       if (asprintf(&str, "%N:%s", plugin_feature_names, feature->type,
+                                       feature->arg.prefix) > 0)
+                       {
+                               return str;
+                       }
+                       break;
        }
        if (!str)
        {
@@ -470,6 +489,14 @@ bool plugin_feature_load(plugin_t *plugin, plugin_feature_t *feature,
                case FEATURE_RESOLVER:
                        lib->resolver->add_resolver(lib->resolver, reg->arg.reg.f);
                        break;
+               case FEATURE_STREAM:
+                       lib->streams->add_stream(lib->streams, feature->arg.prefix,
+                                                                        reg->arg.reg.f);
+                       break;
+               case FEATURE_STREAM_SERVICE:
+                       lib->streams->add_service(lib->streams, feature->arg.prefix,
+                                                                         reg->arg.reg.f);
+                       break;
                default:
                        break;
        }
@@ -545,6 +572,12 @@ bool plugin_feature_unload(plugin_t *plugin, plugin_feature_t *feature,
                case FEATURE_RESOLVER:
                        lib->resolver->remove_resolver(lib->resolver, reg->arg.reg.f);
                        break;
+               case FEATURE_STREAM:
+                       lib->streams->remove_stream(lib->streams, reg->arg.reg.f);
+                       break;
+               case FEATURE_STREAM_SERVICE:
+                       lib->streams->remove_service(lib->streams, reg->arg.reg.f);
+                       break;
                default:
                        break;
        }
index ea23f766ca3f0044351965cb7c6c0e12f85b449c..9e81353cd5f4b80e449a6ff37bfb10440782d771 100644 (file)
@@ -152,6 +152,10 @@ struct plugin_feature_t {
                FEATURE_FETCHER,
                /** resolver_t */
                FEATURE_RESOLVER,
+               /** stream_t */
+               FEATURE_STREAM,
+               /** stream_service_t */
+               FEATURE_STREAM_SERVICE,
                /** custom feature, described with a string */
                FEATURE_CUSTOM,
        } type;
@@ -205,6 +209,8 @@ struct plugin_feature_t {
                char *custom;
                /** FEATURE_XAUTH_SERVER/CLIENT */
                char *xauth;
+               /** FEATURE_STREAM/STREAM_SERVICE */
+               char *prefix;
 
                /** FEATURE_REGISTER */
                struct {
@@ -297,6 +303,8 @@ struct plugin_feature_t {
 #define _PLUGIN_FEATURE_DATABASE(kind, type)                           __PLUGIN_FEATURE(kind, DATABASE, .database = type)
 #define _PLUGIN_FEATURE_FETCHER(kind, type)                                    __PLUGIN_FEATURE(kind, FETCHER, .fetcher = type)
 #define _PLUGIN_FEATURE_RESOLVER(kind, ...)                                    __PLUGIN_FEATURE(kind, RESOLVER, .custom = NULL)
+#define _PLUGIN_FEATURE_STREAM(kind, type)                                     __PLUGIN_FEATURE(kind, STREAM, .prefix = type)
+#define _PLUGIN_FEATURE_STREAM_SERVICE(kind, type)                     __PLUGIN_FEATURE(kind, STREAM_SERVICE, .prefix = type)
 #define _PLUGIN_FEATURE_CUSTOM(kind, name)                                     __PLUGIN_FEATURE(kind, CUSTOM, .custom = name)
 #define _PLUGIN_FEATURE_XAUTH_SERVER(kind, name)                       __PLUGIN_FEATURE(kind, XAUTH_SERVER, .xauth = name)
 #define _PLUGIN_FEATURE_XAUTH_PEER(kind, name)                         __PLUGIN_FEATURE(kind, XAUTH_PEER, .xauth = name)
@@ -321,6 +329,8 @@ struct plugin_feature_t {
 #define _PLUGIN_FEATURE_REGISTER_DATABASE(type, f)                     __PLUGIN_FEATURE_REGISTER(type, f)
 #define _PLUGIN_FEATURE_REGISTER_FETCHER(type, f)                      __PLUGIN_FEATURE_REGISTER(type, f)
 #define _PLUGIN_FEATURE_REGISTER_RESOLVER(type, f)                     __PLUGIN_FEATURE_REGISTER(type, f)
+#define _PLUGIN_FEATURE_REGISTER_STREAM(type, f)                       __PLUGIN_FEATURE_REGISTER(type, f)
+#define _PLUGIN_FEATURE_REGISTER_STREAM_SERVICE(type, f)       __PLUGIN_FEATURE_REGISTER(type, f)
 
 #define _PLUGIN_FEATURE_CALLBACK(_cb, _data) (plugin_feature_t){ FEATURE_CALLBACK, FEATURE_NONE, .arg.cb = { .f = _cb, .data = _data } }