Make parameters const, its not altered inside.
[citadel.git] / citadel / file_ops.c
index ada1a78141a11a6e7ee583e5c12885091872531b..4ec3f8e5149029531728344a191f7f38b80c6105 100644 (file)
@@ -1,8 +1,5 @@
 /* 
- * $Id$
- *
  * Server functions which handle file transfers and room directories.
- *
  */
 
 #include "sysdep.h"
@@ -51,9 +48,9 @@
 /*
  * network_talking_to()  --  concurrency checker
  */
-int network_talking_to(char *nodename, int operation) {
+static char *nttlist = NULL;
+int network_talking_to(const char *nodename, int operation) {
 
-       static char *nttlist = NULL;
        char *ptr = NULL;
        int i;
        char buf[SIZ];
@@ -100,11 +97,19 @@ int network_talking_to(char *nodename, int operation) {
                        break;
        }
 
-       if (nttlist != NULL) CtdlLogPrintf(CTDL_DEBUG, "nttlist=<%s>\n", nttlist);
+       if (nttlist != NULL) syslog(LOG_DEBUG, "nttlist=<%s>\n", nttlist);
        end_critical_section(S_NTTLIST);
        return(retval);
 }
 
+void cleanup_nttlist(void)
+{
+        begin_critical_section(S_NTTLIST);
+       if (nttlist != NULL)
+               free(nttlist);
+       nttlist = NULL;
+        end_critical_section(S_NTTLIST);
+}
 
 
 
@@ -368,6 +373,12 @@ void cmd_oimg(char *cmdbuf)
                return;
        }
        rv = fread(&MimeTestBuf[0], 1, 32, CC->download_fp);
+       if (rv == -1) {
+               cprintf("%d Cannot access %s: %s\n",
+                       ERROR + FILE_NOT_FOUND, pathname, strerror(errno));
+               return;
+       }
+
        rewind (CC->download_fp);
        OpenCmdResult(pathname, GuessMimeType(&MimeTestBuf[0], 32));
 }
@@ -596,7 +607,7 @@ void cmd_ucls(char *cmd)
                                unlink(CC->upl_path);
                        }
                        else {
-                               CtdlLogPrintf(CTDL_ALERT, "Cannot link %d to %d: %s\n",
+                               syslog(LOG_ALERT, "Cannot link %s to %s: %s\n",
                                        CC->upl_path, final_filename, strerror(errno)
                                );
                        }
@@ -636,7 +647,6 @@ void cmd_ucls(char *cmd)
 }
 
 
-
 /*
  * read from the download file
  */
@@ -644,9 +654,9 @@ void cmd_read(char *cmdbuf)
 {
        long start_pos;
        size_t bytes;
-       size_t actual_bytes;
-       char *buf = NULL;
+       char buf[SIZ];
 
+       /* The client will transmit its requested offset and byte count */
        start_pos = extract_long(cmdbuf, 0);
        bytes = extract_int(cmdbuf, 1);
 
@@ -656,26 +666,24 @@ void cmd_read(char *cmdbuf)
                return;
        }
 
-       buf = mmap(NULL, 
-                  CC->download_fp_total, 
-                  PROT_READ, 
-                  MAP_PRIVATE,
-                  fileno(CC->download_fp), 
-                  0);
-       
-       actual_bytes = CC->download_fp_total - start_pos;
-       if ((actual_bytes > 0) && (buf != NULL)) {
-               cprintf("%d %d\n", BINARY_FOLLOWS, (int)actual_bytes);
-               client_write(buf + start_pos, actual_bytes);
+       /* If necessary, reduce the byte count to the size of our buffer */
+       if (bytes > sizeof(buf)) {
+               bytes = sizeof(buf);
+       }
+
+       fseek(CC->download_fp, start_pos, 0);
+       bytes = fread(buf, 1, bytes, CC->download_fp);
+       if (bytes > 0) {
+               /* Tell the client the actual byte count and transmit it */
+               cprintf("%d %d\n", BINARY_FOLLOWS, (int)bytes);
+               client_write(bufbytes);
        }
        else {
                cprintf("%d %s\n", ERROR, strerror(errno));
        }
-       munmap(buf, CC->download_fp_total);
 }
 
 
-
 /*
  * write to the upload file
  */
@@ -704,6 +712,10 @@ void cmd_writ(char *cmdbuf)
        buf = malloc(bytes + 1);
        client_read(buf, bytes);
        rv = fwrite(buf, bytes, 1, CC->upload_fp);
+       if (rv == -1) {
+               syslog(LOG_EMERG, "Couldn't write: %s\n",
+                      strerror(errno));
+       }
        free(buf);
 }
 
@@ -827,7 +839,8 @@ CTDL_MODULE_INIT(file_ops)
                CtdlRegisterProtoHook(cmd_nuop, "NUOP", "Open a network spool file for upload");
                CtdlRegisterProtoHook(cmd_oimg, "OIMG", "Open an image file for download");
                CtdlRegisterProtoHook(cmd_uimg, "UIMG", "Upload an image file");
+               CtdlRegisterCleanupHook(cleanup_nttlist);
        }
         /* return our Subversion id for the Log */
-       return "$Id$";
+       return "file_ops";
 }