X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Ffile_ops.c;h=d1b529d57efada1399545722745c3873bdf07e5c;hb=9caef44a2f42ab81b2489ae19859f1bbc25d4430;hp=0438b244e2870ff6625baa56cdcd58278cc78c20;hpb=d618782c3acea2b76ad78b2744093bf9b99ca6ab;p=citadel.git diff --git a/citadel/file_ops.c b/citadel/file_ops.c index 0438b244e..d1b529d57 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,64 +43,7 @@ #endif #include "ctdl_module.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 = strdup(""); - if (nttlist == NULL) break; - nttlist = (char *)realloc(nttlist, - (strlen(nttlist) + strlen(nodename) + 3) ); - strcat(nttlist, "|"); - strcat(nttlist, nodename); - break; - - case NTT_REMOVE: - if (nttlist == NULL) break; - if (IsEmptyStr(nttlist)) break; - ptr = malloc(strlen(nttlist)); - if (ptr == NULL) break; - strcpy(ptr, ""); - for (i = 0; i < num_tokens(nttlist, '|'); ++i) { - extract_token(buf, nttlist, i, '|', sizeof buf); - if ( (!IsEmptyStr(buf)) - && (strcasecmp(buf, nodename)) ) { - strcat(ptr, buf); - strcat(ptr, "|"); - } - } - free(nttlist); - nttlist = ptr; - break; - - case NTT_CHECK: - if (nttlist == NULL) break; - if (IsEmptyStr(nttlist)) break; - for (i = 0; i < num_tokens(nttlist, '|'); ++i) { - extract_token(buf, nttlist, i, '|', sizeof buf); - if (!strcasecmp(buf, nodename)) ++retval; - } - break; - } - - if (nttlist != NULL) CtdlLogPrintf(CTDL_DEBUG, "nttlist=<%s>\n", nttlist); - end_critical_section(S_NTTLIST); - return(retval); -} - +#include "user_ops.h" @@ -164,7 +103,6 @@ void cmd_movf(char *cmdbuf) char buf[PATH_MAX]; int a; struct ctdlroom qrbuf; - int rv = 0; extract_token(filename, cmdbuf, 0, '|', sizeof filename); extract_token(newroom, cmdbuf, 1, '|', sizeof newroom); @@ -218,7 +156,7 @@ void cmd_movf(char *cmdbuf) snprintf(buf, sizeof buf, "cat ./files/%s/filedir |grep \"%s\" >>./files/%s/filedir", CC->room.QRdirname, filename, qrbuf.QRdirname); - rv = system(buf); + system(buf); cprintf("%d File '%s' has been moved.\n", CIT_OK, filename); } @@ -368,6 +306,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)); } @@ -580,7 +524,6 @@ 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); if (CC->upload_type == UPL_NET) { @@ -597,7 +540,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) ); } @@ -605,6 +548,7 @@ void cmd_ucls(char *cmd) /* FIXME ... here we need to trigger a network run */ } + CC->upload_type = UPL_FILE; return; } @@ -636,7 +580,6 @@ void cmd_ucls(char *cmd) } - /* * read from the download file */ @@ -644,9 +587,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 +599,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 */ @@ -695,15 +636,17 @@ void cmd_writ(char *cmdbuf) } if (bytes > 100000) { - cprintf("%d You may not write more than 100000 bytes.\n", - ERROR + TOO_BIG); - return; + bytes = 100000; } cprintf("%d %d\n", SEND_BINARY, bytes); 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); } @@ -815,6 +758,7 @@ void cmd_nuop(char *cmdbuf) CTDL_MODULE_INIT(file_ops) { if (!threading) { + CtdlRegisterProtoHook(cmd_delf, "DELF", "Delete a file"); CtdlRegisterProtoHook(cmd_movf, "MOVF", "Move a file"); CtdlRegisterProtoHook(cmd_open, "OPEN", "Open a download file transfer"); @@ -829,5 +773,5 @@ CTDL_MODULE_INIT(file_ops) CtdlRegisterProtoHook(cmd_uimg, "UIMG", "Upload an image file"); } /* return our Subversion id for the Log */ - return "$Id$"; + return "file_ops"; }