$Log$
+ Revision 580.53 2001/10/06 21:32:29 ajc
+ * Finished the concurrency check for network polling. (Now works both for
+ polling and being polled. Severe UUCP deja vu.)
+
Revision 580.52 2001/10/06 20:28:06 ajc
* Began implementing some concurrency stuff for the networker
Fri Jul 10 1998 Art Cancro <ajc@uncensored.citadel.org>
* Initial CVS import
-
#include "citserver.h"
+/*
+ * network_talking_to() -- concurrency checker
+ */
+int network_talking_to(char *nodename, int operation) {
+
+ static char *nttlist = NULL;
+ char *ptr = NULL;
+ int i;
+ char buf[SIZ];
+ int retval = 0;
+
+ begin_critical_section(S_NTTLIST);
+
+ switch(operation) {
+
+ case NTT_ADD:
+ if (nttlist == NULL) nttlist = strdoop("");
+ if (nttlist == NULL) break;
+ 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;
+ }
+
+ if (nttlist != NULL) lprintf(9, "nttlist=<%s>\n", nttlist);
+ end_critical_section(S_NTTLIST);
+ return(retval);
+}
+
+
+
+
/*
* Server command to delete a file from a room's directory
*/
void cmd_writ (char *cmdbuf);
void cmd_ndop (char *cmdbuf);
void cmd_nuop (char *cmdbuf);
+int network_talking_to(char *nodename, int operation);
+
+/*
+ * Operations that can be performed by network_talking_to()
+ */
+enum {
+ NTT_ADD,
+ NTT_REMOVE,
+ NTT_CHECK
+};
*/
/*
- * FIXME do something about concurrency issues:
- * 1. Don't allow the two nodes to poll each other at the same time
- * 2. Don't allow polls during network processing
- * 3. Kill Bill Gates using either a chainsaw or a wood chipper
+ * FIXME
+ * Don't allow polls during network processing
*/
#include "sysdep.h"
#include "internet_addressing.h"
#include "serv_network.h"
#include "clientsocket.h"
+#include "file_ops.h"
/*
-/*
- * network_talking_to() -- concurrency checker
- */
-int network_talking_to(char *nodename, int operation) {
-
- static char *nttlist = NULL;
- char *ptr = NULL;
- int i;
- char buf[SIZ];
- int retval = 0;
-
- begin_critical_section(S_NTTLIST);
-
- switch(operation) {
-
- case NTT_ADD:
- if (nttlist == NULL) nttlist = strdoop("");
- if (nttlist == NULL) break;
- 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;
- }
-
- if (nttlist != NULL) lprintf(9, "nttlist=<%s>\n", nttlist);
- end_critical_section(S_NTTLIST);
- return(retval);
-}
-
-
-
-
-
-
-
/*
* Read the network map from its configuration file into memory.
*/
return;
}
+ if (network_talking_to(node, NTT_CHECK)) {
+ cprintf("%d Already talking to %s right now\n", ERROR);
+ return;
+ }
+
safestrncpy(CC->net_node, node, sizeof CC->net_node);
+ network_talking_to(node, NTT_ADD);
cprintf("%d authenticated as network node '%s'\n", OK,
CC->net_node);
}
struct namelist *listrecps;
struct namelist *ignet_push_shares;
};
-
-/*
- * Operations that can be performed by network_talking_to()
- */
-enum {
- NTT_ADD,
- NTT_REMOVE,
- NTT_CHECK
-};
void logout(struct CitContext *who)
{
who->logged_in = 0;
+
+ /*
+ * If there is a download in progress, abort it.
+ */
if (who->download_fp != NULL) {
fclose(who->download_fp);
who->download_fp = NULL;
}
+
+ /*
+ * If there is an upload in progress, abort it.
+ */
if (who->upload_fp != NULL) {
abort_upl(who);
}
+
+ /*
+ * If we were talking to a network node, we're not anymore...
+ */
+ if (strlen(who->net_node) > 0) {
+ network_talking_to(who->net_node, NTT_REMOVE);
+ }
+
/* Do modular stuff... */
PerformSessionHooks(EVT_LOGOUT);
}