--- parser3/src/main/pa_common.C 2002/03/27 15:30:36 1.106 +++ parser3/src/main/pa_common.C 2002/08/05 13:47:37 1.114 @@ -3,10 +3,10 @@ Copyright(c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) - - $Id: pa_common.C,v 1.106 2002/03/27 15:30:36 paf Exp $ */ +static const char* IDENT_COMMON_C="$Date: 2002/08/05 13:47:37 $"; + #include "pa_common.h" #include "pa_types.h" #include "pa_exception.h" @@ -137,7 +137,17 @@ bool file_read(Pool& pool, const String& // they delay update till open, so we would receive "!^test[" string // if would do stat, next open. if((f=open(fname, O_RDONLY|(as_text?_O_TEXT:_O_BINARY)))>=0) { - lock_shared_blocking(f); + if(lock_shared_blocking(f)!=0) { + Exception e("file.lock", + &file_spec, + "shared lock failed: %s (%d), actual filename '%s'", + strerror(errno), errno, fname); + unlock(f); + close(f); + if(fail_on_read_problem) + throw e; + return false; + } if(stat(fname, &finfo)!=0) { Exception e("file.missing", &file_spec, @@ -151,7 +161,7 @@ bool file_read(Pool& pool, const String& } #ifdef NO_FOREIGN_GROUP_FILES if(finfo.st_gid/*foreign?*/!=getegid()) { - Exception e("parser.runtime", 0, + Exception e("parser.runtime", &file_spec, "parser reading files of foreign group disabled [recompile parser without --disable-foreign-group-files configure option], actual filename '%s'", fname); @@ -216,7 +226,8 @@ bool file_write_action_under_lock( const char *action_name, void (*action)(int, void *), void *context, bool as_text, bool do_append, - bool do_block) { + bool do_block, + bool fail_on_lock_problem) { const char *fname=file_spec.cstr(String::UL_FILE_SPEC); int f; if(access(fname, W_OK)!=0) // no @@ -227,7 +238,13 @@ bool file_write_action_under_lock( |(as_text?_O_TEXT:_O_BINARY) |(do_append?O_APPEND:O_TRUNC), 0664))>=0) { if((do_block?lock_exclusive_blocking(f):lock_exclusive_nonblocking(f))!=0) { + Exception e("file.lock", + &file_spec, + "shared lock failed: %s (%d), actual filename '%s'", + strerror(errno), errno, fname); close(f); + if(fail_on_lock_problem) + throw e; return false; } @@ -265,8 +282,15 @@ struct File_write_action_info { #endif static void file_write_action(int f, void *context) { File_write_action_info& info=*static_cast(context); - if(info.size) - write(f, info.data, info.size); + if(info.size) { + size_t written=write(f, info.data, info.size); + if(written!=info.size) + throw Exception(0, + 0, + "write failed: %s (%d), number of bytes written not equal to requested (%u!=%u)", + strerror(errno), errno, + written, info.size); + } } void file_write( const String& file_spec, @@ -323,7 +347,7 @@ static bool entry_readable(const String& const char *fname=file_spec.cstr(String::UL_FILE_SPEC); struct stat finfo; if(access(fname, R_OK)==0 && stat(fname, &finfo)==0) { - bool is_dir=finfo.st_mode&S_IFDIR != 0; + bool is_dir=(finfo.st_mode&S_IFDIR) != 0; return is_dir==need_dir; } return false; @@ -411,19 +435,23 @@ char *rsplit(char *string, char delim) { /// @todo less stupid type detection char *format(Pool& pool, double value, char *fmt) { - char *result=(char *)pool.malloc(MAX_NUMBER, 4); + char local_buf[MAX_NUMBER]; + size_t size; + if(fmt) if(strpbrk(fmt, "diouxX")) if(strpbrk(fmt, "ouxX")) - snprintf(result, MAX_NUMBER, fmt, (uint)value ); + size=snprintf(local_buf, sizeof(local_buf), fmt, (uint)value); else - snprintf(result, MAX_NUMBER, fmt, (int)value ); + size=snprintf(local_buf, sizeof(local_buf), fmt, (int)value); else - snprintf(result, MAX_NUMBER, fmt, value); + size=snprintf(local_buf, sizeof(local_buf), fmt, value); else - snprintf(result, MAX_NUMBER, "%d", (int)value); + size=snprintf(local_buf, sizeof(local_buf), "%d", (int)value); - return result; + char *pool_buf=(char *)pool.malloc(size+1, 4); + memcpy(pool_buf, local_buf, size+1); + return pool_buf; } size_t stdout_write(const void *buf, size_t size) {