summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/proto.h2
-rw-r--r--source3/lib/util.c66
2 files changed, 68 insertions, 0 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 6ff2854ca2..39a5d03d76 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -512,6 +512,8 @@ int interpret_protocol(const char *str,int def);
char *automount_lookup(TALLOC_CTX *ctx, const char *user_name);
char *automount_lookup(TALLOC_CTX *ctx, const char *user_name);
bool process_exists(const struct server_id pid);
+bool processes_exist(const struct server_id *pids, int num_pids,
+ bool *results);
const char *uidtoname(uid_t uid);
char *gidtoname(gid_t gid);
uid_t nametouid(const char *name);
diff --git a/source3/lib/util.c b/source3/lib/util.c
index f547ec2a56..9b9d34c22f 100644
--- a/source3/lib/util.c
+++ b/source3/lib/util.c
@@ -657,6 +657,72 @@ bool process_exists(const struct server_id pid)
#endif
}
+bool processes_exist(const struct server_id *pids, int num_pids,
+ bool *results)
+{
+ struct server_id *remote_pids = NULL;
+ int *remote_idx = NULL;
+ bool *remote_results = NULL;
+ int i, num_remote_pids;
+ bool result = false;
+
+ remote_pids = talloc_array(talloc_tos(), struct server_id, num_pids);
+ if (remote_pids == NULL) {
+ goto fail;
+ }
+ remote_idx = talloc_array(talloc_tos(), int, num_pids);
+ if (remote_idx == NULL) {
+ goto fail;
+ }
+ remote_results = talloc_array(talloc_tos(), bool, num_pids);
+ if (remote_results == NULL) {
+ goto fail;
+ }
+
+ num_remote_pids = 0;
+
+ for (i=0; i<num_pids; i++) {
+ if (procid_is_me(&pids[i])) {
+ results[i] = true;
+ continue;
+ }
+ if (procid_is_local(&pids[i])) {
+ results[i] = ((kill(pids[i].pid,0) == 0) ||
+ (errno != ESRCH));
+ continue;
+ }
+
+ remote_pids[num_remote_pids] = pids[i];
+ remote_idx[num_remote_pids] = i;
+ num_remote_pids += 1;
+ }
+
+ if (num_remote_pids != 0) {
+#ifdef CLUSTER_SUPPORT
+ if (!ctdb_processes_exist(messaging_ctdbd_connection(),
+ remote_pids, num_remote_pids,
+ remote_results)) {
+ goto fail;
+ }
+#else
+ for (i=0; i<num_remote_pids; i++) {
+ remote_results[i] = false;
+ }
+#endif
+
+ for (i=0; i<num_remote_pids; i++) {
+ results[remote_idx[i]] = remote_results[i];
+ }
+ }
+
+ result = true;
+fail:
+ TALLOC_FREE(remote_results);
+ TALLOC_FREE(remote_idx);
+ TALLOC_FREE(remote_pids);
+ return result;
+}
+
/*******************************************************************
Convert a uid into a user name.
********************************************************************/