]> code.citadel.org Git - citadel.git/blobdiff - citadel/file_ops.c
Memleak: free the nttlist (network host list) on exit
[citadel.git] / citadel / file_ops.c
index 6f0669093bc08d705aad4ad141101f18b341ad85..e4453cbdbdc3b97f055403caa48dc0a467f57e7c 100644 (file)
@@ -1,8 +1,5 @@
 /* 
- * $Id$
- *
  * Server functions which handle file transfers and room directories.
- *
  */
 
 #include "sysdep.h"
@@ -35,7 +32,6 @@
 #include "config.h"
 #include "file_ops.h"
 #include "sysdep_decls.h"
-#include "user_ops.h"
 #include "support.h"
 #include "room_ops.h"
 #include "msgbase.h"
 #endif
 
 #include "ctdl_module.h"
+#include "user_ops.h"
 
 /*
  * network_talking_to()  --  concurrency checker
  */
+static char *nttlist = NULL;
 int network_talking_to(char *nodename, int operation) {
 
-       static char *nttlist = NULL;
        char *ptr = NULL;
        int i;
        char buf[SIZ];
@@ -105,6 +102,14 @@ int network_talking_to(char *nodename, int operation) {
        return(retval);
 }
 
+void cleanup_nttlist(void)
+{
+        begin_critical_section(S_NTTLIST);
+       if (nttlist != NULL)
+               free(nttlist);
+       nttlist = NULL;
+        end_critical_section(S_NTTLIST);
+}
 
 
 
@@ -470,7 +475,7 @@ void cmd_uimg(char *cmdbuf)
                }
        }
 
-       if (CC->user.axlevel >= 6) {
+       if (CC->user.axlevel >= AxAideU) {
                snprintf(CC->upl_path, sizeof CC->upl_path, 
                                 "%s/%s",
                                 ctdl_image_dir,
@@ -485,7 +490,7 @@ void cmd_uimg(char *cmdbuf)
        }
 
        if ((!strcasecmp(basenm, "_floorpic_"))
-           && (CC->user.axlevel >= 6)) {
+           && (CC->user.axlevel >= AxAideU)) {
                which_floor = extract_int(cmdbuf, 2);
                snprintf(CC->upl_path, sizeof CC->upl_path,
                                 "%s/floor.%d.gif",
@@ -569,6 +574,7 @@ void cmd_ucls(char *cmd)
 {
        FILE *fp;
        char upload_notice[512];
+       static int seq = 0;
 
        if (CC->upload_fp == NULL) {
                cprintf("%d You don't have an upload file open.\n", ERROR + RESOURCE_NOT_OPEN);
@@ -579,11 +585,31 @@ void cmd_ucls(char *cmd)
        CC->upload_fp = NULL;
 
        if ((!strcasecmp(cmd, "1")) && (CC->upload_type != UPL_FILE)) {
-               CC->upload_type = UPL_FILE;
                cprintf("%d Upload completed.\n", CIT_OK);
 
-               /* FIXME ... here we need to trigger a network run */
+               if (CC->upload_type == UPL_NET) {
+                       char final_filename[PATH_MAX];
+                       snprintf(final_filename, sizeof final_filename,
+                               "%s/%s.%04lx.%04x",
+                               ctdl_netin_dir,
+                               CC->net_node,
+                               (long)getpid(),
+                               ++seq
+                       );
+
+                       if (link(CC->upl_path, final_filename) == 0) {
+                               unlink(CC->upl_path);
+                       }
+                       else {
+                               CtdlLogPrintf(CTDL_ALERT, "Cannot link %d to %d: %s\n",
+                                       CC->upl_path, final_filename, strerror(errno)
+                               );
+                       }
 
+                       /* FIXME ... here we need to trigger a network run */
+               }
+
+               CC->upload_type = UPL_FILE;
                return;
        }
 
@@ -761,7 +787,7 @@ void cmd_nuop(char *cmdbuf)
 
        snprintf(CC->upl_path, sizeof CC->upl_path,
                         "%s/%s.%04lx.%04x",
-                        ctdl_netin_dir,
+                        ctdl_nettmp_dir,
                         CC->net_node, 
                         (long)getpid(), 
                         ++seq);
@@ -794,19 +820,20 @@ void cmd_nuop(char *cmdbuf)
 CTDL_MODULE_INIT(file_ops)
 {
        if (!threading) {
-               CtdlRegisterProtoHook(cmd_delf, "DELF", "Autoconverted. TODO: document me.");
-               CtdlRegisterProtoHook(cmd_movf, "MOVF", "Autoconverted. TODO: document me.");
-               CtdlRegisterProtoHook(cmd_open, "OPEN", "Autoconverted. TODO: document me.");
-               CtdlRegisterProtoHook(cmd_clos, "CLOS", "Autoconverted. TODO: document me.");
-               CtdlRegisterProtoHook(cmd_uopn, "UOPN", "Autoconverted. TODO: document me.");
-               CtdlRegisterProtoHook(cmd_ucls, "UCLS", "Autoconverted. TODO: document me.");
-               CtdlRegisterProtoHook(cmd_read, "READ", "Autoconverted. TODO: document me.");
-               CtdlRegisterProtoHook(cmd_writ, "WRIT", "Autoconverted. TODO: document me.");
-               CtdlRegisterProtoHook(cmd_oimg, "OIMG", "Autoconverted. TODO: document me.");
-               CtdlRegisterProtoHook(cmd_ndop, "NDOP", "Autoconverted. TODO: document me.");
-               CtdlRegisterProtoHook(cmd_nuop, "NUOP", "Autoconverted. TODO: document me.");
-               CtdlRegisterProtoHook(cmd_uimg, "UIMG", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_delf, "DELF", "Delete a file");
+               CtdlRegisterProtoHook(cmd_movf, "MOVF", "Move a file");
+               CtdlRegisterProtoHook(cmd_open, "OPEN", "Open a download file transfer");
+               CtdlRegisterProtoHook(cmd_clos, "CLOS", "Close a download file transfer");
+               CtdlRegisterProtoHook(cmd_uopn, "UOPN", "Open an upload file transfer");
+               CtdlRegisterProtoHook(cmd_ucls, "UCLS", "Close an upload file transfer");
+               CtdlRegisterProtoHook(cmd_read, "READ", "File transfer read operation");
+               CtdlRegisterProtoHook(cmd_writ, "WRIT", "File transfer write operation");
+               CtdlRegisterProtoHook(cmd_ndop, "NDOP", "Open a network spool file for download");
+               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";
 }