int elektraSpecloadOpen (Plugin * handle, Key * errorKey) { Specload * specload = elektraMalloc (sizeof (Specload)); KeySet * conf = elektraPluginGetConfig (handle); if (ksLookupByName (conf, "system/module", 0) != NULL || ksLookupByName (conf, "system/sendspec", 0) != NULL) { elektraFree (specload); return ELEKTRA_PLUGIN_STATUS_SUCCESS; } if (!getAppAndArgs (conf, &specload->app, &specload->argv, errorKey)) { elektraFree (specload); return ELEKTRA_PLUGIN_STATUS_ERROR; } specload->quickDumpConfig = ksNew (0, KS_END); specload->quickDump = elektraInvokeOpen ("quickdump", specload->quickDumpConfig, errorKey); if (!specload->quickDump) { elektraFree (specload); return ELEKTRA_PLUGIN_STATUS_ERROR; } elektraPluginSetData (handle, specload); return ELEKTRA_PLUGIN_STATUS_SUCCESS; }
int elektraAugeasOpen (Plugin * handle, Key * parentKey) { augeas * augeasHandle; augeasHandle = aug_init (NULL, NULL, AUG_NO_MODL_AUTOLOAD | AUG_NO_ERR_CLOSE); int ret; if (aug_error (augeasHandle) != AUG_NOERROR) { char * errormessage; ret = asprintf (&errormessage, "Unable to initialize augeas: %s", aug_error_message (augeasHandle)); if (ret >= 0) { ELEKTRA_SET_ERROR (87, parentKey, "Unable to allocate memory for a detailed augeas error message"); return -1; } ELEKTRA_SET_ERROR (85, parentKey, errormessage); elektraFree (errormessage); return -1; } elektraPluginSetData (handle, augeasHandle); return 0; }
int elektraDbusGet (Plugin * handle, KeySet * returned, Key * parentKey) { if (!strcmp (keyName (parentKey), "system/elektra/modules/dbus")) { KeySet * contract = ksNew (30, keyNew ("system/elektra/modules/dbus", KEY_VALUE, "dbus plugin waits for your orders", KEY_END), keyNew ("system/elektra/modules/dbus/exports", KEY_END), keyNew ("system/elektra/modules/dbus/exports/get", KEY_FUNC, elektraDbusGet, KEY_END), keyNew ("system/elektra/modules/dbus/exports/set", KEY_FUNC, elektraDbusSet, KEY_END), keyNew ("system/elektra/modules/dbus/exports/close", KEY_FUNC, elektraDbusClose, KEY_END), #include ELEKTRA_README (dbus) keyNew ("system/elektra/modules/dbus/infos/version", KEY_VALUE, PLUGINVERSION, KEY_END), KS_END); ksAppend (returned, contract); ksDel (contract); return 1; /* success */ } // remember all keys KeySet * ks = (KeySet *)elektraPluginGetData (handle); if (ks) ksDel (ks); elektraPluginSetData (handle, ksDup (returned)); return 1; /* success */ }
int elektraDbusSet (Plugin * handle, KeySet * returned, Key * parentKey) { KeySet * oldKeys = (KeySet *)elektraPluginGetData (handle); // because elektraLogchangeGet will always be executed before elektraLogchangeSet // we know that oldKeys must exist here! ksRewind (oldKeys); ksRewind (returned); KeySet * addedKeys = ksDup (returned); KeySet * changedKeys = ksNew (0, KS_END); KeySet * removedKeys = ksNew (0, KS_END); Key * k = 0; while ((k = ksNext (oldKeys)) != 0) { Key * p = ksLookup (addedKeys, k, KDB_O_POP); // Note: keyDel not needed, because at least two references exist if (p) { if (keyNeedSync (p)) { ksAppendKey (changedKeys, p); } } else { ksAppendKey (removedKeys, k); } } if (!strncmp (keyName (parentKey), "user", 4)) { announceKeys (addedKeys, "KeyAdded", DBUS_BUS_SESSION); announceKeys (changedKeys, "KeyChanged", DBUS_BUS_SESSION); announceKeys (removedKeys, "KeyDeleted", DBUS_BUS_SESSION); } else if (!strncmp (keyName (parentKey), "system", 6)) { announceKeys (addedKeys, "KeyAdded", DBUS_BUS_SYSTEM); announceKeys (changedKeys, "KeyChanged", DBUS_BUS_SYSTEM); announceKeys (removedKeys, "KeyDeleted", DBUS_BUS_SYSTEM); } ksDel (oldKeys); ksDel (addedKeys); ksDel (changedKeys); ksDel (removedKeys); // for next invocation of elektraLogchangeSet, remember our current keyset elektraPluginSetData (handle, ksDup (returned)); return 1; /* success */ }
int elektraSpecloadClose (Plugin * handle, Key * errorKey) { Specload * specload = elektraPluginGetData (handle); if (specload != NULL) { elektraInvokeClose (specload->quickDump, errorKey); ksDel (specload->quickDumpConfig); elektraFree (specload->app); freeArgv (specload->argv); elektraFree (specload); elektraPluginSetData (handle, NULL); } return ELEKTRA_PLUGIN_STATUS_SUCCESS; }
int elektraWresolverOpen (Plugin * handle, Key * errorKey) { KeySet * resolverConfig = elektraPluginGetConfig (handle); const char * path = keyString (ksLookupByName (resolverConfig, "/path", 0)); if (!path) { ELEKTRA_SET_ERROR (34, errorKey, "Could not find file configuration"); return -1; } resolverHandles * p = elektraMalloc (sizeof (resolverHandles)); // switch is only present to forget no namespace and to get // a warning whenever a new namespace is present. // (also used below in close) // In fact its linear code executed: switch (KEY_NS_SPEC) { case KEY_NS_SPEC: resolverInit (&p->spec, path); elektraResolveSpec (&p->spec, errorKey); case KEY_NS_DIR: resolverInit (&p->dir, path); elektraResolveDir (&p->dir, errorKey); case KEY_NS_USER: resolverInit (&p->user, path); elektraResolveUser (&p->user, errorKey); case KEY_NS_SYSTEM: resolverInit (&p->system, path); elektraResolveSystem (&p->system, errorKey); case KEY_NS_PROC: case KEY_NS_EMPTY: case KEY_NS_NONE: case KEY_NS_META: case KEY_NS_CASCADING: break; } elektraPluginSetData (handle, p); return 0; /* success */ }
int elektraAugeasOpen(Plugin *handle, Key *parentKey) { augeas *augeasHandle; augeasHandle = aug_init (NULL, NULL, AUG_NO_MODL_AUTOLOAD | AUG_NO_ERR_CLOSE); if (aug_error (augeasHandle) != AUG_NOERROR) { char *errormessage; asprintf (&errormessage, "Unable to initialize augeas: %s", aug_error_message (augeasHandle)); ELEKTRA_SET_ERROR(85, parentKey, errormessage); free (errormessage); return -1; } elektraPluginSetData (handle, augeasHandle); return 0; }
/**This function avoid that every return path need to release the * configuration. */ inline static int openHelper (ckdb::Plugin * handle, kdb::KeySet & config, ckdb::Key * errorKey, Builder builder) { if (config.lookup ("/module")) { // suppress warnings if it is just a module // don't buildup the Delegated then return 0; } try { elektraPluginSetData (handle, (*builder) (config)); } catch (const char * msg) { #ifdef KDBERRORS_H ELEKTRA_ADD_WARNING (69, errorKey, msg); #endif return -1; } return get (handle) != nullptr ? 1 : -1; }