Esempio n. 1
0
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);
}
Esempio n. 2
0
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);
}