diff options
author | Eduardo Chappa <echappa@gmx.com> | 2013-02-03 00:59:38 -0700 |
---|---|---|
committer | Eduardo Chappa <echappa@gmx.com> | 2013-02-03 00:59:38 -0700 |
commit | 094ca96844842928810f14844413109fc6cdd890 (patch) | |
tree | e60efbb980f38ba9308ccb4fb2b77b87bbc115f3 /alpine/pipe.c | |
download | alpine-094ca96844842928810f14844413109fc6cdd890.tar.xz |
Initial Alpine Version
Diffstat (limited to 'alpine/pipe.c')
-rw-r--r-- | alpine/pipe.c | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/alpine/pipe.c b/alpine/pipe.c new file mode 100644 index 00000000..033d67b9 --- /dev/null +++ b/alpine/pipe.c @@ -0,0 +1,150 @@ +#if !defined(lint) && !defined(DOS) +static char rcsid[] = "$Id: pipe.c 155 2006-09-29 23:28:46Z hubert@u.washington.edu $"; +#endif +/* + * ======================================================================== + * Copyright 2006-2007 University of Washington + * Copyright 2013 Eduardo Chappa + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * ======================================================================== + */ + + +#include "../pith/headers.h" +#include "../pith/pipe.h" +#include "../pith/stream.h" +#include "../pith/status.h" + +#include "signal.h" +#include "pipe.h" + + +/* + * Support structure and functions to support piping raw message texts... + */ +static struct raw_pipe_data { + MAILSTREAM *stream; + unsigned long msgno, len; + long char_limit, flags; + char *cur, *body; +} raw_pipe; + + +int +raw_pipe_getc(unsigned char *c) +{ + static char *free_this = NULL; + + /* + * What is this if doing? + * + * If((just_starting && unsuccessful_fetch_header) + * || (no_chars_available && haven't_fetched_body + * && (not_supposed_to_fetch + * || (supposed_to_fetch_all && unsuccessful_fetch_text) + * || (supposed_to_partial_fetch && unsuccessful_partial_fetch)) + * || (no_chars_available)) + * return(0); + * + * otherwise, fall through and return next character + */ + if((!raw_pipe.cur + && !(raw_pipe.cur = mail_fetch_header(raw_pipe.stream, raw_pipe.msgno, + NULL, NULL, + &raw_pipe.len, + raw_pipe.flags))) + || ((raw_pipe.len <= 0L) && !raw_pipe.body + && (raw_pipe.char_limit == 0L + || (raw_pipe.char_limit < 0L + && !(raw_pipe.cur = raw_pipe.body = + pine_mail_fetch_text(raw_pipe.stream, + raw_pipe.msgno, + NULL, + &raw_pipe.len, + raw_pipe.flags))) + || (raw_pipe.char_limit > 0L + && !(raw_pipe.cur = raw_pipe.body = + pine_mail_partial_fetch_wrapper(raw_pipe.stream, + raw_pipe.msgno, + NULL, + &raw_pipe.len, + raw_pipe.flags, + (unsigned long) raw_pipe.char_limit, + &free_this, 1))))) + || (raw_pipe.len <= 0L)){ + + if(free_this) + fs_give((void **) &free_this); + + return(0); + } + + if(raw_pipe.char_limit > 0L + && raw_pipe.body + && raw_pipe.len > raw_pipe.char_limit) + raw_pipe.len = raw_pipe.char_limit; + + if(raw_pipe.len > 0L){ + *c = (unsigned char) *raw_pipe.cur++; + raw_pipe.len--; + return(1); + } + else + return(0); + +} + + +/* + * Set up for using raw_pipe_getc + * + * Args: stream + * msgno + * char_limit Set to -1 means whole thing + * 0 means headers only + * > 0 means headers plus char_limit body chars + * flags -- passed to fetch functions + */ +void +prime_raw_pipe_getc(MAILSTREAM *stream, long int msgno, long int char_limit, long int flags) +{ + raw_pipe.stream = stream; + raw_pipe.msgno = (unsigned long) msgno; + raw_pipe.char_limit = char_limit; + raw_pipe.len = 0L; + raw_pipe.flags = flags; + raw_pipe.cur = NULL; + raw_pipe.body = NULL; +} + + +/*---------------------------------------------------------------------- + Actually open the pipe used to write piped data down + + Args: + Returns: TRUE if success, otherwise FALSE + + ----*/ +PIPE_S * +cmd_pipe_open(char *cmd, char **result, int flags, gf_io_t *pc) +{ + char err[200]; + PIPE_S *pipe; + + if((pipe = open_system_pipe(cmd, result, NULL, flags, 0, + pipe_callback, pipe_report_error)) != NULL) + gf_set_writec(pc, pipe, 0L, PipeStar, (flags & PIPE_RAW) ? 0 : WRITE_TO_LOCALE); + else{ + /* TRANSLATORS: The argument is the command name being piped to. */ + snprintf(err, sizeof(err), _("Error opening pipe: %s"), cmd ? cmd : "?"); + q_status_message(SM_ORDER | SM_DING, 3, 3, err) ; + } + + return(pipe); +} |