X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Ffile_ops.c;h=3bb6da1d8fc9962ec5048c94a334e0fd3d66c472;hb=e26a8dee20d1726b4995821f717f867f50fc5659;hp=0a790832aeb931069a9929f3f8824decff45699a;hpb=f15df94047f9c4f9a2faddd4700ac24b46afd923;p=citadel.git diff --git a/citadel/file_ops.c b/citadel/file_ops.c index 0a790832a..3bb6da1d8 100644 --- a/citadel/file_ops.c +++ b/citadel/file_ops.c @@ -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" @@ -47,13 +43,14 @@ #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]; @@ -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)); } @@ -569,6 +580,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 +591,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 { + syslog(LOG_ALERT, "Cannot link %s to %s: %s\n", + CC->upl_path, final_filename, strerror(errno) + ); + } + + /* FIXME ... here we need to trigger a network run */ + } + CC->upload_type = UPL_FILE; return; } @@ -615,7 +647,6 @@ void cmd_ucls(char *cmd) } - /* * read from the download file */ @@ -623,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); @@ -635,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(buf, bytes); } else { cprintf("%d %s\n", ERROR, strerror(errno)); } - munmap(buf, CC->download_fp_total); } - /* * write to the upload file */ @@ -683,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); } @@ -806,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"; }