int sched_plugin_load (struct sched_plugin_loader *sploader, const char *s) { char *path = NULL; char *name = NULL; char *searchpath = getenv ("FLUX_MODULE_PATH"); void *dso = NULL; if (sploader->plugin) { errno = EEXIST; goto error; } if (!searchpath) { flux_log (sploader->h, LOG_ERR, "FLUX_MODULE_PATH not set"); goto error; } if (strchr (s, '/')) { if (!(name = flux_modname (s))) { flux_log (sploader->h, LOG_ERR, "%s: %s", s, dlerror ()); errno = ENOENT; goto error; } if (!(path = strdup (s))) { errno = ENOMEM; goto error; } } else { if (!(path = flux_modfind (searchpath, s))) { flux_log (sploader->h, LOG_ERR, "%s: not found in module search path %s", s, searchpath); goto error; } if (!(name = flux_modname (path))) goto error; } if (!(dso = dlopen (path, RTLD_NOW | RTLD_LOCAL | RTLD_DEEPBIND))) { flux_log (sploader->h, LOG_ERR, "failed to open sched plugin: %s", dlerror ()); goto error; } flux_log (sploader->h, LOG_DEBUG, "loaded: %s", name); if (!(sploader->plugin = plugin_create (sploader->h, dso))) { dlclose (dso); goto error; } sploader->plugin->name = name; sploader->plugin->path = path; return 0; error: if (path) free (path); if (name) free (name); return -1; }
void mod_info (flux_t h, opt_t opt) { char *modpath = NULL; char *modname = NULL; char *digest = NULL; if (opt.argc != 1) usage (); if (strchr (opt.argv[0], '/')) { if (!(modpath = realpath (opt.argv[0], NULL))) oom (); if (!(modname = flux_modname (modpath))) msg_exit ("%s", dlerror ()); } else { char *searchpath = getenv ("FLUX_MODULE_PATH"); if (!searchpath) searchpath = MODULE_PATH; modname = xstrdup (opt.argv[0]); if (!(modpath = flux_modfind (searchpath, modname))) msg_exit ("%s: not found in module search path", modname); } digest = sha1 (modpath); printf ("Module name: %s\n", modname); printf ("Module path: %s\n", modpath); printf ("SHA1 Digest: %s\n", digest); printf ("Size: %d bytes\n", filesize (modpath)); if (modpath) free (modpath); if (modname) free (modname); if (digest) free (digest); }
void mod_insmod (flux_t h, opt_t opt) { char *modpath = NULL; char *modname = NULL; if (opt.argc < 1) usage (); if (strchr (opt.argv[0], '/')) { if (!(modpath = realpath (opt.argv[0], NULL))) oom (); if (!(modname = flux_modname (modpath))) msg_exit ("%s", dlerror ()); } else { char *searchpath = getenv ("FLUX_MODULE_PATH"); if (!searchpath) searchpath = MODULE_PATH; modname = xstrdup (opt.argv[0]); if (!(modpath = flux_modfind (searchpath, modname))) msg_exit ("%s: not found in module search path", modname); } opt.argv++; opt.argc--; if (opt.direct) { char *service = getservice (modname); char *topic = xasprintf ("%s.insmod", service); char *json_str = flux_insmod_json_encode (modpath, opt.argc, opt.argv); assert (json_str != NULL); flux_rpc_t *r = flux_rpc_multi (h, topic, json_str, opt.nodeset, 0); if (!r) err_exit ("%s", topic); while (!flux_rpc_completed (r)) { uint32_t nodeid = FLUX_NODEID_ANY; if (flux_rpc_get (r, NULL, NULL) < 0) err_exit ("%s[%d]", topic, nodeid == FLUX_NODEID_ANY ? -1 : nodeid); } flux_rpc_destroy (r); free (topic); free (service); free (json_str); } else { if (flux_modctl_load (h, opt.nodeset, modpath, opt.argc, opt.argv) < 0) err_exit ("%s", modname); } if (modpath) free (modpath); if (modname) free (modname); }
void test_helpers (void) { char *name, *path; const char *modpath = flux_conf_get ("module_path", CONF_FLAG_INTREE); path = xasprintf ("%s/kvs/.libs/kvs.so", modpath); ok (access (path, F_OK) == 0, "built kvs module is located"); name = flux_modname (path); ok ((name != NULL), "flux_modname on kvs should find a name"); skip (name == NULL, 1, "skip next test because kvs.so name is NULL"); like (name, "^kvs$", "flux_modname says kvs module is named kvs"); end_skip; if (name) free (name); free (path); ok (!flux_modfind ("nowhere", "foo"), "flux_modfind fails with nonexistent directory"); ok (!flux_modfind (".", "foo"), "flux_modfind fails in current directory"); ok (!flux_modfind (modpath, "foo"), "flux_modfind fails to find unknown module in moduledir"); path = xasprintf ("%s/kvs/.libs", modpath); name = flux_modfind (path, "kvs"); ok ((name != NULL), "flux_modfind finds kvs in flat directory"); if (name) free (name); free (path); name = flux_modfind (modpath, "kvs"); ok ((name != NULL), "flux_modfind also finds kvs in moduledir"); if (name) free (name); path = xasprintf ("foo:bar:xyz:%s:zzz", modpath); name = flux_modfind (path, "kvs"); ok ((name != NULL), "flux_modfind also finds kvs in search path"); if (name) free (name); free (path); }
static module_t *module_create (const char *path, char *argz, size_t argz_len) { module_t *m = xzmalloc (sizeof (*m)); struct stat sb; char **av = NULL; if (stat (path, &sb) < 0 || !(m->name = flux_modname (path, NULL, NULL)) || !(m->digest = digest (path))) { module_destroy (m); errno = ESRCH; return NULL; } m->size = sb.st_size; m->dso = dlopen (path, RTLD_NOW | RTLD_LOCAL); if (!m->dso || !(m->main = dlsym (m->dso, "mod_main"))) { module_destroy (m); errno = EINVAL; return NULL; } av = xzmalloc (sizeof (av[0]) * (argz_count (argz, argz_len) + 1)); argz_extract (argz, argz_len, av); if (m->main (NULL, argz_count (argz, argz_len), av) < 0) { module_destroy (m); errno = EINVAL; return NULL; } if (zhash_lookup (modules, m->name)) { module_destroy (m); errno = EEXIST; return NULL; } zhash_update (modules, m->name, m); zhash_freefn (modules, m->name, (zhash_free_fn *)module_destroy); if (av) free (av); return m; }