X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Ffile_ops.c;h=9040c4c746b4d009ba5cad19ebc91644be48c1b3;hb=da1debddf5988512ac50ff0b62ac85c8f3b8d0f4;hp=2e7c4f707e0dfc84c48efed2ff03d50a00194be4;hpb=56d69e5d8434e98835a2582c59b771ba69475431;p=citadel.git diff --git a/citadel/file_ops.c b/citadel/file_ops.c index 2e7c4f707..9040c4c74 100644 --- a/citadel/file_ops.c +++ b/citadel/file_ops.c @@ -48,60 +48,56 @@ /* * network_talking_to() -- concurrency checker */ -int network_talking_to(char *nodename, int operation) { +static HashList *nttlist = NULL; +int network_talking_to(const char *nodename, long len, int operation) { - static char *nttlist = NULL; - char *ptr = NULL; - int i; - char buf[SIZ]; int retval = 0; + HashPos *Pos = NULL; + void *vdata; 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); + if (nttlist == NULL) + nttlist = NewHash(1, NULL); + Put(nttlist, nodename, len, NewStrBufPlain(nodename, len), HFreeStrBuf); + syslog(LOG_DEBUG, "nttlist: added <%s>\n", 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; + if ((nttlist == NULL) || + (GetCount(nttlist) == 0)) + break; + Pos = GetNewHashPos(nttlist, 1); + GetHashPosFromKey (nttlist, nodename, len, Pos); + + DeleteEntryFromHash(nttlist, Pos); + DeleteHashPos(&Pos); + syslog(LOG_DEBUG, "nttlist: removed <%s>\n", nodename); + 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; - } + if ((nttlist == NULL) || + (GetCount(nttlist) == 0)) + break; + if (!GetHash(nttlist, nodename, len, &vdata)) + retval ++; + syslog(LOG_DEBUG, "nttlist: have [%d] <%s>\n", retval, nodename); break; } - if (nttlist != NULL) CtdlLogPrintf(CTDL_DEBUG, "nttlist=<%s>\n", nttlist); end_critical_section(S_NTTLIST); return(retval); } +void cleanup_nttlist(void) +{ + begin_critical_section(S_NTTLIST); + DeleteHash(&nttlist); + end_critical_section(S_NTTLIST); +} @@ -365,6 +361,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)); } @@ -593,7 +595,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) ); } @@ -633,7 +635,6 @@ void cmd_ucls(char *cmd) } - /* * read from the download file */ @@ -641,9 +642,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); @@ -653,26 +654,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 */ @@ -701,6 +700,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); } @@ -824,6 +827,7 @@ 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 "file_ops";