Exemple #1
0
pid_t
pidinfo (pid_t pid, char **name)
{
        char buf[NAME_MAX * 2] = {0,};
        FILE *f                = NULL;
        char path[PATH_MAX]    = {0,};
        char *p                = NULL;
        int ret                = 0;

        sprintf (path, PROC"/%d/status", pid);

        f = fopen (path, "r");
        if (!f)
                return -1;

        if (name)
                *name = NULL;
        for (;;) {
                size_t len;
                memset (buf, 0, sizeof (buf));
                if (fgets (buf, sizeof (buf), f) == NULL ||
                    (len = strlen (buf)) == 0 ||
                    buf[len - 1] != '\n') {
                        pid = -1;
                        goto out;
                }
                buf[len - 1] = '\0';

                if (name && !*name) {
                        p = strtail (buf, "Name:");
                        if (p) {
                                while (isspace (*++p));
                                *name = gf_strdup (p);
                                if (!*name) {
                                        pid = -2;
                                        goto out;
                                }
                                continue;
                        }
                }

                p = strtail (buf, "PPid:");
                if (p)
                        break;
        }

        while (isspace (*++p));
        ret = gf_string2int (p, &pid);
        if (ret == -1)
                pid = -1;

 out:
        fclose (f);
        if (pid == -1 && name && *name)
                GF_FREE (name);
        if (pid == -2)
                fprintf (stderr, "out of memory\n");
        return pid;
}
Exemple #2
0
int
prociter(int (*proch)(pid_t pid, pid_t ppid, char *tmpname, void *data),
         void *data)
{
    char *name = NULL;
    DIR *d = NULL;
    struct dirent *de = NULL;
    struct dirent scratch[2] = {
        {
            0,
        },
    };
    pid_t pid = -1;
    pid_t ppid = -1;
    int ret = 0;

    d = sys_opendir(PROC);
    if (!d)
        return -1;

    for (;;) {
        errno = 0;
        de = sys_readdir(d, scratch);
        if (!de || errno != 0)
            break;

        if (gf_string2int(de->d_name, &pid) != -1 && pid >= 0) {
            ppid = pidinfo(pid, &name);
            switch (ppid) {
                case -1:
                    continue;
                case -2:
                    break;
            }
            ret = proch(pid, ppid, name, data);
            GF_FREE(name);
            if (ret)
                break;
        }
    }
    sys_closedir(d);
    if (!de && errno) {
        fprintf(stderr, "failed to traverse " PROC " (%s)\n", strerror(errno));
        ret = -1;
    }

    return ret;
}
Exemple #3
0
int
prociter (int (*proch) (pid_t pid, pid_t ppid, char *tmpname, void *data),
          void *data)
{
        char *name        = NULL;
        DIR *d            = NULL;
        struct dirent *de = NULL;
        pid_t pid         = -1;
        pid_t ppid        = -1;
        int ret           = 0;

        d = opendir (PROC);
        if (!d) {
                ret = -1;
                goto out;
        }
        while (errno = 0, de = readdir (d)) {
                if (gf_string2int (de->d_name, &pid) != -1 && pid >= 0) {
                        ppid = pidinfo (pid, &name);
                        switch (ppid) {
                        case -1: continue;
                        case -2: closedir (d); return -1;
                        }
                        ret = proch (pid, ppid, name, data);
                        if (ret) {
                                goto out;
                        }
                        GF_FREE (name);
                        name = NULL;
                }
        }
        if (errno) {
                fprintf (stderr, "failed to traverse "PROC" (%s)\n",
                         strerror (errno));
                goto out;
        }

        ret = 0;
out:
        if (d)
                closedir (d);

        if (name)
                GF_FREE (name);

        return ret;
}
Exemple #4
0
static error_t
parse_opts (int key, char *arg, struct argp_state *state)
{
    cmd_args_t   *cmd_args      = NULL;
    uint32_t      n             = 0;
    double        d             = 0.0;
    gf_boolean_t  b             = _gf_false;
    char         *pwd           = NULL;
    char          tmp_buf[2048] = {0,};

    cmd_args = state->input;

    switch (key) {
    case ARGP_VOLFILE_SERVER_KEY:
        cmd_args->volfile_server = gf_strdup (arg);
        break;

    case ARGP_VOLFILE_MAX_FETCH_ATTEMPTS:
        n = 0;

        if (gf_string2uint_base10 (arg, &n) == 0) {
            cmd_args->max_connect_attempts = n;
            break;
        }

        argp_failure (state, -1, 0,
                      "Invalid limit on connect attempts %s", arg);
        break;

    case ARGP_READ_ONLY_KEY:
        cmd_args->read_only = 1;
        break;

    case ARGP_MAC_COMPAT_KEY:
        if (!arg)
            arg = "on";

        if (gf_string2boolean (arg, &b) == 0) {
            cmd_args->mac_compat = b;

            break;
        }

        argp_failure (state, -1, 0,
                      "invalid value \"%s\" for mac-compat", arg);
        break;

    case ARGP_VOLUME_FILE_KEY:
        if (cmd_args->volfile)
            GF_FREE (cmd_args->volfile);

        if (arg[0] != '/') {
            pwd = getcwd (NULL, PATH_MAX);
            if (!pwd) {
                argp_failure (state, -1, errno,
                              "getcwd failed with error no %d",
                              errno);
                break;
            }
            snprintf (tmp_buf, 1024, "%s/%s", pwd, arg);
            cmd_args->volfile = gf_strdup (tmp_buf);
            free (pwd);
        } else {
            cmd_args->volfile = gf_strdup (arg);
        }

        break;

    case ARGP_LOG_SERVER_KEY:
        if (cmd_args->log_server)
            GF_FREE (cmd_args->log_server);

        cmd_args->log_server = gf_strdup (arg);
        break;

    case ARGP_LOG_LEVEL_KEY:
        if (strcasecmp (arg, ARGP_LOG_LEVEL_NONE_OPTION) == 0) {
            cmd_args->log_level = GF_LOG_NONE;
            break;
        }
        if (strcasecmp (arg, ARGP_LOG_LEVEL_CRITICAL_OPTION) == 0) {
            cmd_args->log_level = GF_LOG_CRITICAL;
            break;
        }
        if (strcasecmp (arg, ARGP_LOG_LEVEL_ERROR_OPTION) == 0) {
            cmd_args->log_level = GF_LOG_ERROR;
            break;
        }
        if (strcasecmp (arg, ARGP_LOG_LEVEL_WARNING_OPTION) == 0) {
            cmd_args->log_level = GF_LOG_WARNING;
            break;
        }
        if (strcasecmp (arg, ARGP_LOG_LEVEL_NORMAL_OPTION) == 0) {
            cmd_args->log_level = GF_LOG_NORMAL;
            break;
        }
        if (strcasecmp (arg, ARGP_LOG_LEVEL_DEBUG_OPTION) == 0) {
            cmd_args->log_level = GF_LOG_DEBUG;
            break;
        }
        if (strcasecmp (arg, ARGP_LOG_LEVEL_TRACE_OPTION) == 0) {
            cmd_args->log_level = GF_LOG_TRACE;
            break;
        }

        argp_failure (state, -1, 0, "unknown log level %s", arg);
        break;

    case ARGP_LOG_FILE_KEY:
        cmd_args->log_file = gf_strdup (arg);
        break;

    case ARGP_VOLFILE_SERVER_PORT_KEY:
        n = 0;

        if (gf_string2uint_base10 (arg, &n) == 0) {
            cmd_args->volfile_server_port = n;
            break;
        }

        argp_failure (state, -1, 0,
                      "unknown volfile server port %s", arg);
        break;

    case ARGP_LOG_SERVER_PORT_KEY:
        n = 0;

        if (gf_string2uint_base10 (arg, &n) == 0) {
            cmd_args->log_server_port = n;
            break;
        }

        argp_failure (state, -1, 0,
                      "unknown log server port %s", arg);
        break;

    case ARGP_VOLFILE_SERVER_TRANSPORT_KEY:
        cmd_args->volfile_server_transport = gf_strdup (arg);
        break;

    case ARGP_VOLFILE_ID_KEY:
        cmd_args->volfile_id = gf_strdup (arg);
        break;

    case ARGP_PID_FILE_KEY:
        cmd_args->pid_file = gf_strdup (arg);
        break;

    case ARGP_NO_DAEMON_KEY:
        cmd_args->no_daemon_mode = ENABLE_NO_DAEMON_MODE;
        break;

    case ARGP_RUN_ID_KEY:
        cmd_args->run_id = gf_strdup (arg);
        break;

    case ARGP_DEBUG_KEY:
        cmd_args->debug_mode = ENABLE_DEBUG_MODE;
        break;

    case ARGP_DIRECT_IO_MODE_KEY:
        if (!arg)
            arg = "on";

        if (gf_string2boolean (arg, &b) == 0) {
            cmd_args->fuse_direct_io_mode = b;

            break;
        }

        argp_failure (state, -1, 0,
                      "unknown direct I/O mode setting \"%s\"", arg);
        break;

    case ARGP_ENTRY_TIMEOUT_KEY:
        d = 0.0;

        gf_string2double (arg, &d);
        if (!(d < 0.0)) {
            cmd_args->fuse_entry_timeout = d;
            break;
        }

        argp_failure (state, -1, 0, "unknown entry timeout %s", arg);
        break;

    case ARGP_ATTRIBUTE_TIMEOUT_KEY:
        d = 0.0;

        gf_string2double (arg, &d);
        if (!(d < 0.0)) {
            cmd_args->fuse_attribute_timeout = d;
            break;
        }

        argp_failure (state, -1, 0,
                      "unknown attribute timeout %s", arg);
        break;

    case ARGP_CLIENT_PID_KEY:
        if (gf_string2int (arg, &cmd_args->client_pid) == 0) {
            cmd_args->client_pid_set = 1;
            break;
        }

        argp_failure (state, -1, 0,
                      "unknown client pid %s", arg);
        break;

    case ARGP_VOLFILE_CHECK_KEY:
        cmd_args->volfile_check = 1;
        break;

    case ARGP_VOLUME_NAME_KEY:
        cmd_args->volume_name = gf_strdup (arg);
        break;

    case ARGP_XLATOR_OPTION_KEY:
        gf_remember_xlator_option (&cmd_args->xlator_options, arg);
        break;

    case ARGP_KEY_NO_ARGS:
        break;

    case ARGP_KEY_ARG:
        if (state->arg_num >= 1)
            argp_usage (state);

        cmd_args->mount_point = gf_strdup (arg);
        break;

    case ARGP_DUMP_FUSE_KEY:
        cmd_args->dump_fuse = gf_strdup (arg);
        break;
    case ARGP_BRICK_NAME_KEY:
        cmd_args->brick_name = gf_strdup (arg);
        break;
    case ARGP_BRICK_PORT_KEY:
        n = 0;

        if (gf_string2uint_base10 (arg, &n) == 0) {
            cmd_args->brick_port = n;
            break;
        }

        argp_failure (state, -1, 0,
                      "unknown brick (listen) port %s", arg);
        break;
    }

    return 0;
}
Exemple #5
0
pid_t
pidinfo (pid_t pid, char **name)
{
        char buf[NAME_MAX * 2] = {0,};
        FILE *f                = NULL;
        char *p                = NULL;
        char *free_p           = NULL;
        int ret                = 0;

        ret = gf_asprintf (&p, PROC"/%d/status", pid);
        if (ret == -1)
                goto oom;

        f = fopen (p, "r");
        if (!f) {
                GF_FREE (p);
                return -1;
        }
        free_p = p;

        if (name)
                *name = NULL;
        for (;;) {
                memset (buf, 0, sizeof (buf));
                if (fgets (buf, sizeof (buf), f) == NULL ||
                    buf[strlen (buf) - 1] != '\n') {
                        pid = -1;
                        goto out;
                }
                buf[strlen (buf) -1] = '\0';

                if (name && !*name) {
                        p = strtail (buf, "Name:");
                        if (p) {
                                while (isspace (*++p));
                                *name = gf_strdup (p);
                                if (!*name)
                                        goto oom;
                                continue;
                        }
                }

                p = strtail (buf, "PPid:");
                if (p)
                        break;
        }

        while (isspace (*++p));
        ret = gf_string2int (p, &pid);
        if (ret == -1)
                pid = -1;

 out:
        if (free_p)
                GF_FREE (free_p);
        fclose (f);
        return pid;

 oom:
        if (free_p)
                GF_FREE (free_p);
        fclose (f);
        fprintf (stderr, "out of memory\n");
        return -2;
}