void test_insmod_codec (void) { int argc = 2; char *argv[] = { "foo", "bar", NULL }; char *argz = NULL; size_t argz_len = 0; char *av[16]; char *json_str; char *s; int rc; json_str = flux_insmod_json_encode ("/foo/bar", argc, argv); ok (json_str != NULL, "flux_insmod_json_encode works"); rc = flux_insmod_json_decode (json_str, &s, &argz, &argz_len); argz_extract (argz, argz_len, av); ok (rc == 0 && s != NULL && !strcmp (s, "/foo/bar") && !strcmp (av[0], "foo") && !strcmp (av[1], "bar") && av[2] == NULL, "flux_insmod_json_decode works"); if (argz) free (argz); free (s); free (json_str); }
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); }