"DATABASE",
"FETCHER",
"RESOLVER",
+ "STREAM",
+ "STREAM_SERVICE",
"CUSTOM",
);
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));
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;
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;
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)
{
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;
}
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;
}
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;
char *custom;
/** FEATURE_XAUTH_SERVER/CLIENT */
char *xauth;
+ /** FEATURE_STREAM/STREAM_SERVICE */
+ char *prefix;
/** FEATURE_REGISTER */
struct {
#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)
#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 } }