diff options
author | Csaba Henk <csaba@gluster.com> | 2011-09-13 13:12:38 +0200 |
---|---|---|
committer | Vijay Bellur <vijay@gluster.com> | 2011-09-22 05:23:54 -0700 |
commit | 7e04913aa6f4ddb45e95099ef648564bf90da0b3 (patch) | |
tree | c456a74980b0dcc7eaa6338ee46454a55bf16156 /xlators/features/marker/utils/src/procdiggy.c | |
parent | 2ab00369e7ef99d287dad5301d2f334dcfd67a70 (diff) |
gsyncd: control rsync target
- require/perform rsync invocation with unprotected args
(so that target is revealed to gateway program)
- make use of some procfs wizardry to find gsyncd sibling
and match rsync target against its working directory
Change-Id: Iae1e39b0e61f22563c0f2a2e0605567e0d1902df
BUG: 2825
Reviewed-on: http://review.gluster.com/461
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vijay@gluster.com>
Diffstat (limited to 'xlators/features/marker/utils/src/procdiggy.c')
-rw-r--r-- | xlators/features/marker/utils/src/procdiggy.c | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/xlators/features/marker/utils/src/procdiggy.c b/xlators/features/marker/utils/src/procdiggy.c new file mode 100644 index 000000000..fc0f97999 --- /dev/null +++ b/xlators/features/marker/utils/src/procdiggy.c @@ -0,0 +1,124 @@ +/* + Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com> + This file is part of GlusterFS. + + GlusterFS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 3 of the License, + or (at your option) any later version. + + GlusterFS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see + <http://www.gnu.org/licenses/>. +*/ + + +#ifndef _CONFIG_H +#define _CONFIG_H +#include "config.h" +#endif + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> +#include <string.h> +#include <ctype.h> + +#include "common-utils.h" +#include "procdiggy.h" + +pid_t +pidinfo (pid_t pid, char **name) +{ + char buf[NAME_MAX * 2] = {0,}; + FILE *f = NULL; + char *p = NULL; + int ret = 0; + + ret = gf_asprintf (&p, PROC"/%d/status", pid); + if (ret == -1) + goto oom; + + f = fopen (p, "r"); + if (!f) + return -1; + + 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: + fclose (f); + return pid; + + oom: + fclose (f); + fprintf (stderr, "out of memory\n"); + return -2; +} + +int +prociter (int (*proch) (pid_t pid, pid_t ppid, char *name, 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); + 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: return -1; + } + ret = proch (pid, ppid, name, data); + if (ret) + return ret; + } + } + if (errno) { + fprintf (stderr, "failed to traverse "PROC" (%s)\n", + strerror (errno)); + return -1; + } + + return 0; +} |