X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Ffile_ops.c;h=3bb6da1d8fc9962ec5048c94a334e0fd3d66c472;hb=e26a8dee20d1726b4995821f717f867f50fc5659;hp=e4453cbdbdc3b97f055403caa48dc0a467f57e7c;hpb=cd5451a0e375c6f2b23e59e3fdccd2af2842a8e3;p=citadel.git diff --git a/citadel/file_ops.c b/citadel/file_ops.c index e4453cbdb..3bb6da1d8 100644 --- a/citadel/file_ops.c +++ b/citadel/file_ops.c @@ -97,7 +97,7 @@ 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); } @@ -373,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)); } @@ -601,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) ); } @@ -641,7 +647,6 @@ void cmd_ucls(char *cmd) } - /* * read from the download file */ @@ -649,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); @@ -661,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 */ @@ -709,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); }