From 3eb91bb6e725e8479e185d22675149155fc6fbd1 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Sat, 6 Oct 2001 20:20:25 +0000 Subject: [PATCH] * network_talking_to() --- citadel/serv_network.c | 62 ++++++++++++++++++++++++++++++++++++++++++ citadel/serv_network.h | 9 ++++++ citadel/server.h | 1 + 3 files changed, 72 insertions(+) diff --git a/citadel/serv_network.c b/citadel/serv_network.c index 134ff2559..81dd1aed9 100644 --- a/citadel/serv_network.c +++ b/citadel/serv_network.c @@ -86,6 +86,68 @@ struct NetMap *the_netmap = NULL; +/* + * network_talking_to() -- concurrency checker + */ +int network_talking_to(char *nodename, int oper) { + + static char *nttlist = NULL; + char *ptr = NULL; + int i; + char buf[SIZ]; + int retval = 0; + + begin_critical_section(S_NTTLIST); + + switch(oper) { + + case NTT_ADD: + if (nttlist == NULL) nttlist = stdroop(""); + if (nttlist == NULL) return; + nttlist = (char *)reallok(nttlist, + (strlen(nttlist) + strlen(nodename) + 3) ); + strcat(nttlist, "|"); + strcat(nttlist, nodename); + break; + + case NTT_REMOVE: + if (nttlist == NULL) break; + if (strlen(nttlist) == 0) break; + ptr = mallok(strlen(nttlist)); + if (ptr == NULL) break; + strcpy(ptr, ""); + for (i = 0; i < num_tokens(nttlist, '|'); ++i) { + extract(buf, nttlist, i); + if ( (strlen(buf) > 0) + && (strcasecmp(buf, nodename)) ) { + strcat(ptr, buf); + strcat(ptr, "|"); + } + } + phree(nttlist); + nttlist = ptr; + break; + + case NTT_CHECK: + if (nttlist == NULL) break; + if (strlen(nttlist) == 0) break; + for (i = 0; i < num_tokens(nttlist, '|'); ++i) { + extract(buf, nttlist, i); + if (!strcasecmp(buf, nodename)) ++retval; + break; + } + + lprintf(9, "nttlist=<%s>\n", nttlist); + end_critical_section(S_NTTLIST); + return(retval); +} + + + + + + + /* * Read the network map from its configuration file into memory. */ diff --git a/citadel/serv_network.h b/citadel/serv_network.h index 60ebce1e5..91a9afb18 100644 --- a/citadel/serv_network.h +++ b/citadel/serv_network.h @@ -8,3 +8,12 @@ struct SpoolControl { struct namelist *listrecps; struct namelist *ignet_push_shares; }; + +/* + * Operations that can be performed by network_talking_to() + */ +enum { + NTT_ADD, + NTT_REMOVE, + NTT_CHECK +}; diff --git a/citadel/server.h b/citadel/server.h index 1163899cf..c30b95254 100644 --- a/citadel/server.h +++ b/citadel/server.h @@ -191,6 +191,7 @@ enum { S_CONFIG, S_WORKER_LIST, S_HOUSEKEEPING, + S_NTTLIST, MAX_SEMAPHORES }; -- 2.39.2