コード例 #1
0
ファイル: module.c プロジェクト: surajpkn/flux-core
static void *module_thread (void *arg)
{
    module_t *p = arg;
    assert (p->magic == MODULE_MAGIC);
    sigset_t signal_set;
    int errnum;
    char *uri = xasprintf ("shmem://%s", zuuid_str (p->uuid));
    char **av = NULL;
    char *rankstr = NULL;
    int ac;

    assert (p->zctx);

    /* Connect to broker socket, enable logging, register built-in services
     */
    if (!(p->h = flux_open (uri, 0)))
        err_exit ("flux_open %s", uri);
    if (flux_opt_set (p->h, FLUX_OPT_ZEROMQ_CONTEXT,
                      p->zctx, sizeof (p->zctx)) < 0)
        err_exit ("flux_opt_set ZEROMQ_CONTEXT");

    rankstr = xasprintf ("%u", p->rank);
    if (flux_attr_fake (p->h, "rank", rankstr, FLUX_ATTRFLAG_IMMUTABLE) < 0) {
        err ("%s: error faking rank attribute", p->name);
        goto done;
    }
    flux_log_set_facility (p->h, p->name);
    modservice_register (p->h, p);

    /* Block all signals
     */
    if (sigfillset (&signal_set) < 0)
        err_exit ("%s: sigfillset", p->name);
    if ((errnum = pthread_sigmask (SIG_BLOCK, &signal_set, NULL)) != 0)
        errn_exit (errnum, "pthread_sigmask");

    /* Run the module's main().
     */
    ac = argz_count (p->argz, p->argz_len);
    av = xzmalloc (sizeof (av[0]) * (ac + 1));
    argz_extract (p->argz, p->argz_len, av);
    if (p->main(p->h, ac, av) < 0) {
        err ("%s: mod_main returned error", p->name);
        goto done;
    }
done:
    if (rankstr)
        free (rankstr);
    if (av)
        free (av);
    flux_close (p->h);
    p->h = NULL;
    return NULL;
}
コード例 #2
0
ファイル: parent.c プロジェクト: flux-framework/flux-core
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;
}
コード例 #3
0
/* Copyright (C) 2002 by  Red Hat, Incorporated. All rights reserved.
 *
 * Permission to use, copy, modify, and distribute this software
 * is freely granted, provided that this notice is preserved.
 */

#include <argz.h>
#include <sys/types.h>

void
_DEFUN (argz_extract, (argz, argz_len, argv),
       char *argz _AND
       size_t argz_len _AND
       char **argv)
{
  size_t i = 0;
  int j = 0;
  const size_t count = argz_count(argz, argz_len);

  for (i = argz_len - 2; i > 0; i--)
    {
      if (argz[i] == '\0')
        {
          j++;
          argv[count - j] = &argz[i + 1];
        }
    }
  argv[0] = &argz[0];
  argv[count] = NULL;
}
コード例 #4
0
ファイル: hwloc.c プロジェクト: dongahn/flux-core
int argz_execp (char *argz, size_t argz_len)
{
    char *argv [argz_count (argz, argz_len) + 1];
    argz_extract (argz, argz_len, argv);
    return execvp (argv[0], argv);
}
コード例 #5
0
ファイル: subprocess.c プロジェクト: cigolabs/flux-core
int subprocess_get_argc (struct subprocess *p)
{
    return (argz_count (p->argz, p->argz_len));
}
コード例 #6
0
ファイル: mount.c プロジェクト: alecrosic/hurd
static error_t
parse_opt (int key, char *arg, struct argp_state *state)
{
    struct fstab_argp_params *params = state->input;
    error_t err;
    switch (key)
    {
    case ARGP_KEY_INIT:
        state->child_inputs[0] = params; /* pass down to fstab_argp parser */
        break;

#define ARGZ(call)							      \
      err = argz_##call; 						      \
      if (err)								      \
	argp_failure (state, 100, ENOMEM, "%s", arg);			      \
      break
    case 'r':
        ARGZ (add (&options, &options_len, "ro"));
    case 'w':
        ARGZ (add (&options, &options_len, "rw"));
    case 'u':
        ARGZ (add (&options, &options_len, "update"));
    case 'B':
        ARGZ (add (&options, &options_len, "bind"));
    case 'o':
        ARGZ (add_sep (&options, &options_len, arg, ','));
    case 'v':
        ++verbose;
        break;
#undef ARGZ

    case 'T':
    {
        char *end;
        unsigned long int ms = strtoul (arg, &end, 10);
        if (end && *end == '\0')
            timeout = ms;
        else
        {
            argp_error (state,
                        "--timeout needs a numeric argument (milliseconds)");
            return EINVAL;
        }
    }
    break;

    case 'p':
        if (arg == 0 || !strcasecmp (arg, "fstab"))
            query_format = qf_fstab;
        else if (!strcasecmp (arg, "mount"))
            query_format = qf_standard;
        else if (!strcasecmp (arg, "translator")
                 || !strcasecmp (arg, "showtrans"))
            query_format = qf_translator;
        else
        {
            argp_error (state, "invalid argument to --format");
            return EINVAL;
        }
        break;

    case 'n':
        /* do nothing */
        break;

    case 'f':
        fake = 1;
        break;

    case 'O':
        err = argz_create_sep (arg, ',', &test_opts, &test_opts_len);
        if (err)
            argp_failure (state, 100, ENOMEM, "%s", arg);
        break;

    case ARGP_KEY_ARG:
        if (mountpoint == 0)	/* One arg: mountpoint */
            mountpoint = arg;
        else if (device == 0)	/* Two args: device, mountpoint */
        {
            device = mountpoint;
            mountpoint = arg;
        }
        else			/* More than two args.  */
        {
            argp_error (state, "too many arguments");
            return EINVAL;
        }
        break;

    case ARGP_KEY_NO_ARGS:
        if (! params->do_all)
        {
            params->do_all = 1;
            mode = query;
        }
        break;

    case ARGP_KEY_END:
        if (params->do_all && mountpoint)
        {
            argp_error (state, "filesystem argument not allowed with --all");
            return EINVAL;
        }
        if (mode == query && options_len != 0)
        {
            argp_error (state,
                        "mount options not allowed without filesystem argument");
            return EINVAL;
        }
        if (mountpoint)
            switch (argz_count (params->types, params->types_len))
            {
            default:
                argp_error (state,
                            "multiple types not allowed with filesystem argument");
                return EINVAL;
            case 1:
                fstype = params->types;
                params->types = 0;
                params->types_len = 0;
                break;
            case 0:
                break;
            }
        break;

    default:
        return ARGP_ERR_UNKNOWN;
    }
    return 0;
}