struct pipeline *textOutInit(char *fileName, char *compressType) /* Set up stdout to be HTTP text, file (if fileName is specified), or * compressed file (if both fileName and compressType are specified -- * see textOut.h for supported compression types). * Return NULL if no compression, otherwise a pipeline handle on which * textOutClose should be called when we're done writing stdout. */ { struct pipeline *compressPipeline = NULL; trimSpaces(fileName); if (isEmpty(fileName)) { printf("Content-Type: text/plain\n\n"); } else if (isEmpty(compressType) || sameWord(compressType, textOutCompressNone)) { printf("Content-Type: application/octet-stream\n"); printf("Content-Disposition: attachment; filename=%s\n\n", fileName); } else { char *suffix = getCompressSuffix(compressType); printf("Content-Type: application/x-%s\n", compressType); if (endsWith(fileName, suffix)) printf("Content-Disposition: attachment; filename=%s\n\n", fileName); else printf("Content-Disposition: attachment; filename=%s%s\n\n", fileName, suffix); /* Send the Content header uncompressed! */ fflush(stdout); /* Make sure no environment variables interfere with compressor. */ cleanEnvVars(compressType); /* Redirect stdout to compressor pipeline object. */ compressPipeline = pipelineOpen1(getCompressor(compressType), pipelineWrite, NULL, NULL); if (-1 == dup2(pipelineFd(compressPipeline), STDOUT_FILENO)) errnoAbort("dup2(pipelineFd %d, stdout %d) failed in textOpen()", pipelineFd(compressPipeline), STDOUT_FILENO); } pushWarnHandler(textOutWarnHandler); pushAbortHandler(textOutAbortHandler); return(compressPipeline); }
struct lineFile *lineFileDecompressFd(char *name, bool zTerm, int fd) /* open a linefile with decompression from a file or socket descriptor */ { struct pipeline *pl; struct lineFile *lf; pl = pipelineOpenFd1(getDecompressor(name), pipelineRead, fd, STDERR_FILENO); lf = lineFileAttach(name, zTerm, pipelineFd(pl)); lf->pl = pl; return lf; }
struct lineFile *lineFileDecompressMem(bool zTerm, char *mem, long size) /* open a linefile with decompression from a memory stream */ { struct pipeline *pl; struct lineFile *lf; char *fileName = getFileNameFromHdrSig(mem); if (fileName==NULL) return NULL; pl = pipelineOpenMem1(getDecompressor(fileName), pipelineRead, mem, size, STDERR_FILENO); lf = lineFileAttach(fileName, zTerm, pipelineFd(pl)); lf->pl = pl; return lf; }
struct lineFile *lineFileDecompress(char *fileName, bool zTerm) /* open a linefile with decompression */ { struct pipeline *pl; struct lineFile *lf; char *testName = NULL; char *testbytes = NULL; /* the header signatures for .gz, .bz2, .Z, * .zip are all 2-4 bytes only */ if (fileName==NULL) return NULL; testbytes=headerBytes(fileName,4); if (!testbytes) return NULL; /* avoid error from pipeline */ testName=getFileNameFromHdrSig(testbytes); freez(&testbytes); if (!testName) return NULL; /* avoid error from pipeline */ pl = pipelineOpen1(getDecompressor(fileName), pipelineRead, fileName, NULL); lf = lineFileAttach(fileName, zTerm, pipelineFd(pl)); lf->pl = pl; return lf; }
struct pipeline *textOutInit(char *fileName, char *compressType, int *saveStdout) /* Set up stdout to be HTTP text, file (if fileName is specified), or * compressed file (if both fileName and compressType are specified -- * see textOut.h for supported compression types). * Return NULL if no compression, otherwise a pipeline handle on which * textOutClose should be called when we're done writing stdout. */ { struct pipeline *compressPipeline = NULL; // if path contains a slash, we are outputting to a local file boolean outToFile = (strchr(fileName, '/') != NULL); if (outToFile) { FILE *f; f = fopen(fileName, "w"); /* We want to capture stdout output to a file */ fflush(stdout); int tempOut = dup(STDOUT_FILENO); if (saveStdout) *saveStdout = tempOut; dup2(fileno(f),STDOUT_FILENO); /* closes STDOUT before setting it again */ fclose(f); } trimSpaces(fileName); if (isEmpty(fileName)) { printf("Content-Type: text/plain\n\n"); } else if (isEmpty(compressType) || sameWord(compressType, textOutCompressNone)) { if (!outToFile) { printf("Content-Type: application/octet-stream\n"); printf("Content-Disposition: attachment; filename=%s\n\n", fileName); } } else { if (!outToFile) { char *suffix = getCompressSuffix(compressType); printf("Content-Type: application/x-%s\n", compressType); if (endsWith(fileName, suffix)) printf("Content-Disposition: attachment; filename=%s\n\n", fileName); else printf("Content-Disposition: attachment; filename=%s%s\n\n", fileName, suffix); /* Send the Content header uncompressed! */ fflush(stdout); } /* Make sure no environment variables interfere with compressor. */ cleanEnvVars(compressType); /* Redirect stdout to compressor pipeline object. */ compressPipeline = pipelineOpen1(getCompressor(compressType), pipelineWrite, NULL, NULL); if (-1 == dup2(pipelineFd(compressPipeline), STDOUT_FILENO)) errnoAbort("dup2(pipelineFd %d, stdout %d) failed in textOpen()", pipelineFd(compressPipeline), STDOUT_FILENO); } pushWarnHandler(textOutWarnHandler); pushAbortHandler(textOutAbortHandler); return(compressPipeline); }