]> code.citadel.org Git - citadel.git/blobdiff - citadel/serv_network.c
* Any "delete message" operation which is synchronous to a client is now
[citadel.git] / citadel / serv_network.c
index 867fabb22cc9c8db7929c3f7e72a6a5f51ec642e..05c86f74507c6e824fd63e50fe70d511bc969e90 100644 (file)
@@ -31,6 +31,7 @@
 #include <signal.h>
 #include <pwd.h>
 #include <errno.h>
+#include <sys/stat.h>
 #include <sys/types.h>
 #include <dirent.h>
 #if TIME_WITH_SYS_TIME
@@ -723,14 +724,23 @@ void network_spool_msg(long msgnum, void *userdata) {
 
                                        /* write it to the spool file */
                                        snprintf(filename, sizeof filename,
-                                               "./network/spoolout/%s",
-                                               mptr->remote_nodename);
+#ifndef HAVE_SPOOL_DIR
+                                                        "."
+#else
+                                                        SPOOL_DIR
+#endif /* HAVE_SPOOL_DIR */
+                                                        "/network/spoolout/%s",
+                                                        mptr->remote_nodename);
+                                       lprintf(CTDL_DEBUG, "Appending to %s\n", filename);
                                        fp = fopen(filename, "ab");
                                        if (fp != NULL) {
                                                fwrite(sermsg.ser,
                                                        sermsg.len, 1, fp);
                                                fclose(fp);
                                        }
+                                       else {
+                                               lprintf(CTDL_ERR, "%s: %s\n", filename, strerror(errno));
+                                       }
 
                                        /* free the serialized version */
                                        free(sermsg.ser);
@@ -745,7 +755,7 @@ void network_spool_msg(long msgnum, void *userdata) {
 
        /* Delete this message if delete-after-send is set */
        if (delete_after_send) {
-               CtdlDeleteMessages(CC->room.QRname, msgnum, "");
+               CtdlDeleteMessages(CC->room.QRname, msgnum, "", 0);
        }
 
 }
@@ -1371,13 +1381,22 @@ void network_process_buffer(char *buffer, long size) {
                                        strcpy(nexthop, msg->cm_fields['D']);
                                }
                                snprintf(filename, sizeof filename,
-                                       "./network/spoolout/%s", nexthop);
+#ifndef HAVE_SPOOL_DIR
+                                                "."
+#else
+                                                SPOOL_DIR
+#endif /* HAVE_SPOOL_DIR */
+                                                "/network/spoolout/%s", nexthop);
+                               lprintf(CTDL_DEBUG, "Appending to %s\n", filename);
                                fp = fopen(filename, "ab");
                                if (fp != NULL) {
                                        fwrite(sermsg.ser,
                                                sermsg.len, 1, fp);
                                        fclose(fp);
                                }
+                               else {
+                                       lprintf(CTDL_ERR, "%s: %s\n", filename, strerror(errno));
+                               }
                                free(sermsg.ser);
                                CtdlFreeMessage(msg);
                                return;
@@ -1537,13 +1556,24 @@ void network_do_spoolin(void) {
        struct dirent *d;
        char filename[256];
 
-       dp = opendir("./network/spoolin");
+       dp = opendir(
+#ifndef HAVE_SPOOL_DIR
+                                "."
+#else
+                                SPOOL_DIR
+#endif /* HAVE_SPOOL_DIR */
+                                "/network/spoolin");
        if (dp == NULL) return;
 
        while (d = readdir(dp), d != NULL) {
                if ((strcmp(d->d_name, ".")) && (strcmp(d->d_name, ".."))) {
                        snprintf(filename, sizeof filename,
-                               "./network/spoolin/%s", d->d_name);
+#ifndef HAVE_SPOOL_DIR
+                                        "."
+#else
+                                        SPOOL_DIR
+#endif /* HAVE_SPOOL_DIR */
+                                        "/network/spoolin/%s", d->d_name);
                        network_process_file(filename);
                }
        }
@@ -1551,7 +1581,6 @@ void network_do_spoolin(void) {
        closedir(dp);
 }
 
-
 /*
  * Delete any files in the outbound queue that were intended
  * to be sent to nodes which no longer exist.
@@ -1563,14 +1592,25 @@ void network_purge_spoolout(void) {
        char nexthop[256];
        int i;
 
-       dp = opendir("./network/spoolout");
+       dp = opendir(
+#ifndef HAVE_SPOOL_DIR
+                                "."
+#else
+                                SPOOL_DIR
+#endif /* HAVE_SPOOL_DIR */
+                                "/network/spoolout");
        if (dp == NULL) return;
 
        while (d = readdir(dp), d != NULL) {
                if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
                        continue;
                snprintf(filename, sizeof filename,
-                       "./network/spoolout/%s", d->d_name);
+#ifndef HAVE_SPOOL_DIR
+                                "."
+#else
+                                SPOOL_DIR
+#endif /* HAVE_SPOOL_DIR */
+                                "/network/spoolout/%s", d->d_name);
 
                strcpy(nexthop, "");
                i = is_valid_node(nexthop, NULL, d->d_name);
@@ -1585,7 +1625,6 @@ void network_purge_spoolout(void) {
 }
 
 
-
 /*
  * receive network spool from the remote system
  */
@@ -1655,8 +1694,15 @@ void receive_spool(int sock, char *remote_nodename) {
                lprintf(CTDL_NOTICE, "Received %ld octets from <%s>",
                                download_len, remote_nodename);
        lprintf(CTDL_DEBUG, "%s", buf);
-       snprintf(buf, sizeof buf, "mv %s ./network/spoolin/%s.%ld",
-               tempfilename, remote_nodename, (long) getpid());
+       /* TODO: make move inline. forking is verry expensive. */
+       snprintf(buf, sizeof buf, "mv %s "
+#ifndef HAVE_SPOOL_DIR
+                        "."
+#else
+                        SPOOL_DIR
+#endif /* HAVE_SPOOL_DIR */
+                        "/network/spoolin/%s.%ld",
+                        tempfilename, remote_nodename, (long) getpid());
        system(buf);
 }
 
@@ -1681,7 +1727,13 @@ void transmit_spool(int sock, char *remote_nodename)
                return;
        }
 
-       snprintf(sfname, sizeof sfname, "./network/spoolout/%s", remote_nodename);
+       snprintf(sfname, sizeof sfname, 
+#ifndef HAVE_SPOOL_DIR
+                        "."
+#else
+                        SPOOL_DIR
+#endif /* HAVE_SPOOL_DIR */
+                        "/network/spoolout/%s", remote_nodename);
        fd = open(sfname, O_RDONLY);
        if (fd < 0) {
                if (errno != ENOENT) {
@@ -1722,10 +1774,11 @@ ABORTUPL:
        close(fd);
        if (sock_puts(sock, "UCLS 1") < 0) return;
        if (sock_gets(sock, buf) < 0) return;
-       lprintf(CTDL_NOTICE, "Sent %ld octets to <%s>",
+       lprintf(CTDL_NOTICE, "Sent %ld octets to <%s>\n",
                        bytes_written, remote_nodename);
        lprintf(CTDL_DEBUG, "<%s\n", buf);
        if (buf[0] == '2') {
+               lprintf(CTDL_DEBUG, "Removing <%s>\n", sfname);
                unlink(sfname);
        }
 }
@@ -1807,7 +1860,12 @@ void network_poll_other_citadel_nodes(int full_poll) {
                        poll = full_poll;
                        if (poll == 0) {
                                snprintf(spoolfile, sizeof spoolfile,
-                                       "./network/spoolout/%s", node);
+#ifndef HAVE_SPOOL_DIR
+                                                "."
+#else
+                                                SPOOL_DIR
+#endif
+                                                "/network/spoolout/%s", node);
                                if (access(spoolfile, R_OK) == 0) {
                                        poll = 1;
                                }
@@ -1823,6 +1881,24 @@ void network_poll_other_citadel_nodes(int full_poll) {
 
 
 
+/*
+ * It's ok if these directories already exist.  Just fail silently.
+ */
+void create_spool_dirs(void) {
+#ifndef HAVE_SPOOL_DIR
+       mkdir("./network", 0700);
+       mkdir("./network/systems", 0700);
+       mkdir("./network/spoolin", 0700);
+       mkdir("./network/spoolout", 0700);
+#else
+       mkdir(SPOOL_DIR "/network", 0700);
+       mkdir(SPOOL_DIR "/network/systems", 0700);
+       mkdir(SPOOL_DIR "/network/spoolin", 0700);
+       mkdir(SPOOL_DIR "/network/spoolout", 0700);
+#endif /* HAVE_SPOOL_DIR */
+}
+
+
 
 
 
@@ -1844,6 +1920,8 @@ void network_do_queue(void) {
                full_processing = 0;
        }
 
+       create_spool_dirs();
+
        /*
         * This is a simple concurrency check to make sure only one queue run
         * is done at a time.  We could do this with a mutex, but since we
@@ -1961,13 +2039,12 @@ void cmd_netp(char *cmdbuf)
                CC->net_node);
 }
 
-
-
 /*
  * Module entry point
  */
 char *serv_network_init(void)
 {
+       create_spool_dirs();
        CtdlRegisterProtoHook(cmd_gnet, "GNET", "Get network config");
        CtdlRegisterProtoHook(cmd_snet, "SNET", "Set network config");
        CtdlRegisterProtoHook(cmd_netp, "NETP", "Identify as network poller");