--- parser3/src/main/pa_common.C 2013/04/21 21:59:07 1.270 +++ parser3/src/main/pa_common.C 2013/07/30 12:36:22 1.277 @@ -36,7 +36,18 @@ #include "pcre.h" #include "pa_request.h" -volatile const char * IDENT_PA_COMMON_C="$Id: pa_common.C,v 1.270 2013/04/21 21:59:07 moko Exp $" IDENT_PA_COMMON_H IDENT_PA_HASH_H IDENT_PA_ARRAY_H IDENT_PA_STACK_H; +#ifdef _MSC_VER +#include +#include +#endif + +#ifdef _MSC_VER +#define pa_mkdir(path, mode) _mkdir(path) +#else +#define pa_mkdir(path, mode) mkdir(path, mode) +#endif + +volatile const char * IDENT_PA_COMMON_C="$Id: pa_common.C,v 1.277 2013/07/30 12:36:22 moko Exp $" IDENT_PA_COMMON_H IDENT_PA_HASH_H IDENT_PA_ARRAY_H IDENT_PA_STACK_H; // some maybe-undefined constants @@ -118,23 +129,13 @@ void fix_line_breaks(char *str, size_t& str[length]=0; // terminating } -char* file_read_text(Request_charsets& charsets, - const String& file_spec, - bool fail_on_read_problem, - HashStringValue* params, - bool transcode_result) { - File_read_result file= - file_read(charsets, file_spec, true, params, fail_on_read_problem, 0, 0, 0, transcode_result); +char* file_read_text(Request_charsets& charsets, const String& file_spec, bool fail_on_read_problem, HashStringValue* params, bool transcode_result) { + File_read_result file=file_read(charsets, file_spec, true, params, fail_on_read_problem, 0, 0, 0, transcode_result); return file.success?file.str:0; } -char* file_load_text(Request& r, - const String& file_spec, - bool fail_on_read_problem, - HashStringValue* params, - bool transcode_result) { - File_read_result file= - file_load(r, file_spec, true, params, fail_on_read_problem, 0, 0, 0, transcode_result); +char* file_load_text(Request& r, const String& file_spec, bool fail_on_read_problem, HashStringValue* params, bool transcode_result) { + File_read_result file=file_load(r, file_spec, true, params, fail_on_read_problem, 0, 0, 0, transcode_result); return file.success?file.str:0; } @@ -160,29 +161,21 @@ struct File_read_action_info { char* buf; size_t offset; size_t count; }; #endif -static void file_read_action( - struct stat& finfo, - int f, - const String& file_spec, const char* /*fname*/, bool as_text, - void *context) { + +static void file_read_action(struct stat& finfo, int f, const String& file_spec, const char* /*fname*/, bool as_text, void *context) { File_read_action_info& info=*static_cast(context); size_t to_read_size=info.count; if(!to_read_size) to_read_size=(size_t)finfo.st_size; assert( !(info.buf && as_text) ); - if(to_read_size) { + if(to_read_size) { if(info.offset) lseek(f, info.offset, SEEK_SET); - *info.data=info.buf - ? info.buf - : (char *)pa_malloc_atomic(to_read_size+1); - *info.data_size=(size_t)read(f, *info.data, to_read_size); - - if(ssize_t(*info.data_size)<0 || *info.data_size>to_read_size) - throw Exception("file.read", - &file_spec, - "read failed: actually read %u bytes count not in [0..%u] valid range", - *info.data_size, to_read_size); + *info.data=info.buf ? info.buf : (char *)pa_malloc_atomic(to_read_size+1); + ssize_t result=read(f, *info.data, to_read_size); + if(result<0) + throw Exception("file.read", &file_spec, "read failed: %s (%d)", strerror(errno), errno); + *info.data_size=result; } else { // empty file // for both, text and binary: for text we need that terminator, for binary we need nonzero pointer to be able to save such files *info.data=(char *)pa_malloc_atomic(1); @@ -344,7 +337,7 @@ void create_dir_for_file(const String& f size_t pos_after=1; size_t pos_before; while((pos_before=file_spec.pos('/', pos_after))!=STRING_NOT_FOUND) { - mkdir(file_spec.mid(0, pos_before).taint_cstr(String::L_FILE_SPEC), 0775); + pa_mkdir(file_spec.mid(0, pos_before).taint_cstr(String::L_FILE_SPEC), 0775); pos_after=pos_before+1; } } @@ -414,16 +407,18 @@ struct File_write_action_info { size_t length; }; #endif + static void file_write_action(int f, void *context) { File_write_action_info& info=*static_cast(context); if(info.length) { - int written=write(f, info.str, info.length); + ssize_t written=write(f, info.str, info.length); if(written<0) - throw Exception("file.access", - 0, - "write failed: %s (%d)", strerror(errno), errno); + throw Exception("file.write", 0, "write failed: %s (%d)", strerror(errno), errno); + if((size_t)written!=info.length) + throw Exception("file.write", 0, "write failed: %u of %u bytes written", written, info.length); } } + void file_write( Request_charsets& charsets, const String& file_spec, @@ -489,11 +484,11 @@ static bool entry_readable(const String& } // throws nothing! [this is required in file_move & file_delete] -static void rmdir(const String& file_spec, size_t pos_after=0) { +static void rmdir(const String& file_spec, size_t pos_after) { char* dir_spec=file_spec.taint_cstrm(String::L_FILE_SPEC); size_t length=strlen(dir_spec); while( (length=get_dir(dir_spec, length)) && (length > pos_after) ){ -#ifdef WIN32 +#ifdef _MSC_VER if(!entry_readable(dir_spec, true)) break; DWORD attrs=GetFileAttributes(dir_spec); @@ -650,7 +645,7 @@ enum FormatType { FormatUInt, FormatDouble }; -FormatType format_type(char* fmt){ +FormatType format_type(const char* fmt){ enum FormatState { Percent, Flags, @@ -661,7 +656,7 @@ FormatType format_type(char* fmt){ FormatType result=FormatInvalid; - char* pos=fmt; + const char* pos=fmt; while(char c=*(pos++)){ switch(state){ case Percent: @@ -705,7 +700,7 @@ FormatType format_type(char* fmt){ } -const char* format(double value, char* fmt) { +const char* format(double value, const char* fmt) { char local_buf[MAX_NUMBER]; int size=-1; @@ -855,14 +850,6 @@ void back_slashes_to_slashes(char* s) { if(*s=='\\') *s='/'; } -/* -void slashes_to_back_slashes(char* s) { - if(s) - for(; *s; s++) - if(*s=='/') - *s='\\'; -} -*/ #endif bool StrStartFromNC(const char* str, const char* substr, bool equal){ @@ -988,7 +975,7 @@ int __vsnprintf(char* b, size_t s, const if((ssize_t)s<0) return 0; -#if _MSC_VER +#ifdef _MSC_VER /* win32: mk:@MSITStore:C:\Program%20Files\Microsoft%20Visual%20Studio\MSDN\2001APR\1033\vccore.chm::/html/_crt__vsnprintf.2c_._vsnwprintf.htm @@ -1050,7 +1037,7 @@ int __snprintf(char* b, size_t s, const * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. * */ -static char *base64_alphabet = +static const char *base64_alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /**