cvs: php4 /ext/mailparse mailparse.c php_mailparse.h

From: Date: Tue, 28 Aug 2001 21:52:10 +0000
Subject: cvs: php4 /ext/mailparse mailparse.c php_mailparse.h
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-7112@lists.php.net to get a copy of this message
wez Tue Aug 28 17:52:10 2001 EDT Modified files: /php4/ext/mailparse mailparse.c php_mailparse.h Log: @- Added mailparse_uudecode_all() which extracts all uuencoded attachments (Wez) Index: php4/ext/mailparse/mailparse.c diff -u php4/ext/mailparse/mailparse.c:1.8 php4/ext/mailparse/mailparse.c:1.9 --- php4/ext/mailparse/mailparse.c:1.8 Mon Jul 30 04:24:29 2001 +++ php4/ext/mailparse/mailparse.c Tue Aug 28 17:52:10 2001 @@ -18,7 +18,7 @@ | the support routines for this extension were based upon. | +----------------------------------------------------------------------+ */ -/* $Id: mailparse.c,v 1.8 2001/07/30 08:24:29 zeev Exp $ */ +/* $Id: mailparse.c,v 1.9 2001/08/28 21:52:10 wez Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -31,6 +31,7 @@ #include "mailparse_rfc822.h" #include "ext/standard/info.h" #include "main/php_output.h" +#include "php_open_temporary_file.h" /* just in case the config check doesn't enable mbstring automatically */ #if !HAVE_MBSTRING @@ -59,6 +60,7 @@ PHP_FE(mailparse_rfc822_parse_addresses, NULL) PHP_FE(mailparse_determine_best_xfer_encoding, NULL) PHP_FE(mailparse_stream_encode, NULL) + PHP_FE(mailparse_uudecode_all, NULL) {NULL, NULL, NULL} }; @@ -137,6 +139,123 @@ php_error(E_WARNING, "%s(): %s %d", get_active_function_name(TSRMLS_C), msg, num); } + +#define UUDEC(c) (char)(((c)-' ')&077) +#define UU_NEXT(v) v = fgetc(infp); if (v == EOF) break; v = UUDEC(v) +static void mailparse_do_uudecode(FILE * infp, FILE * outfp) +{ + int A, B, C, D, n; + + while(!feof(infp)) { + UU_NEXT(n); + + while(n != 0) { + UU_NEXT(A); + UU_NEXT(B); + UU_NEXT(C); + UU_NEXT(D); + + if (n-- > 0) + fputc( (A << 2) | (B >> 4), outfp); + if (n-- > 0) + fputc( (B << 4) | (C >> 2), outfp); + if (n-- > 0) + fputc( (C << 6) | D, outfp); + } + /* skip newline */ + fgetc(infp); + } +} + + +/* {{{ proto array mailparse_uudecode_all(resource fp) + Scan the data from fp and extract each embedded uuencoded file. Returns an array listing filename information +*/ +PHP_FUNCTION(mailparse_uudecode_all) +{ + zval * file, * item; + FILE *infp, *outfp=NULL, *partfp=NULL; + int type; + char * buffer = NULL; + char * outpath = NULL; + int nparts = 0; + + if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS(), "r", &file)) + return; + + infp = (FILE*)zend_fetch_resource(&file TSRMLS_CC, -1, "File-Handle", &type, 1, php_file_le_fopen()); + ZEND_VERIFY_RESOURCE(infp); + + outfp = php_open_temporary_file(NULL, "mailparse", &outpath TSRMLS_CC); + if (outfp == NULL) { + zend_error(E_WARNING, "%s(): unable to open temp file", get_active_function_name(TSRMLS_CC)); + RETURN_FALSE; + } + + rewind(infp); + + buffer = emalloc(4096); + while(fgets(buffer, 4096, infp)) { + /* Look for the "begin " sequence that identifies a uuencoded file */ + if (strncmp(buffer, "begin ", 6) == 0) { + char * origfilename; + int len; + /* parse out the file name. + * The next 4 bytes are an octal number for perms; ignore it */ + origfilename = &buffer[10]; + /* NUL terminate the filename */ + len = strlen(origfilename); + while(isspace(origfilename[len-1])) + origfilename[--len] = '\0'; + + /* make the return an array */ + if (nparts == 0) { + array_init(return_value); + /* create an initial item representing the file with all uuencoded parts + * removed */ + MAKE_STD_ZVAL(item); + array_init(item); + add_assoc_string(item, "filename", outpath, 0); + add_next_index_zval(return_value, item); + } + + /* add an item */ + MAKE_STD_ZVAL(item); + array_init(item); + add_assoc_string(item, "origfilename", origfilename, 1); + + /* create a temp file for the data */ + partfp = php_open_temporary_file(NULL, "mailparse", &outpath TSRMLS_CC); + if (partfp) { + nparts++; + add_assoc_string(item, "filename", outpath, 0); + add_next_index_zval(return_value, item); + + /* decode it */ + mailparse_do_uudecode(infp, partfp); + fclose(partfp); + } + } + else { + /* write to the output file */ + fputs(buffer, outfp); + } + } + fclose(outfp); + rewind(infp); + efree(buffer); + + if (nparts == 0) { + /* delete temporary file */ + unlink(outpath); + efree(outpath); + RETURN_FALSE; + } +} +/* }}} */ + + + /* {{{ proto array mailparse_rfc822_parse_addresses(string addresses) parse addresses and return a hash containing that data Index: php4/ext/mailparse/php_mailparse.h diff -u php4/ext/mailparse/php_mailparse.h:1.2 php4/ext/mailparse/php_mailparse.h:1.3 --- php4/ext/mailparse/php_mailparse.h:1.2 Sat Jul 28 07:35:58 2001 +++ php4/ext/mailparse/php_mailparse.h Tue Aug 28 17:52:10 2001 @@ -18,7 +18,7 @@ | the support routines for this extension were based upon. | +----------------------------------------------------------------------+ */ -/* $Id: php_mailparse.h,v 1.2 2001/07/28 11:35:58 zeev Exp $ */ +/* $Id: php_mailparse.h,v 1.3 2001/08/28 21:52:10 wez Exp $ */ #ifndef PHP_MAILPARSE_H #define PHP_MAILPARSE_H @@ -58,6 +58,7 @@ PHP_FUNCTION(mailparse_rfc822_parse_addresses); PHP_FUNCTION(mailparse_determine_best_xfer_encoding); PHP_FUNCTION(mailparse_stream_encode); +PHP_FUNCTION(mailparse_uudecode_all); #include "rfc2045.h" #include "mailparse_rfc822.h"

« previous php.cvs (#7112) next »