Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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);
}