diff options
author | Andreas Baumann <abaumann@yahoo.com> | 2009-03-24 12:38:26 +0100 |
---|---|---|
committer | Andreas Baumann <abaumann@yahoo.com> | 2009-03-24 12:38:26 +0100 |
commit | b305975aaf8052277406ad11291bec3cdce93dff (patch) | |
tree | 5332f9a600c94c1eea1ba4453a26e4ba4ed58766 /src | |
parent | bea663376a1113c3cf0519f7959cbdd693c8fbc0 (diff) | |
download | wolfbones-b305975aaf8052277406ad11291bec3cdce93dff.tar.gz wolfbones-b305975aaf8052277406ad11291bec3cdce93dff.tar.bz2 |
started to add stdlib stub for itoa
Diffstat (limited to 'src')
-rw-r--r-- | src/GNUmakefile | 1 | ||||
-rw-r--r-- | src/Makefile.W32 | 1 | ||||
-rw-r--r-- | src/log/log.c | 23 | ||||
-rw-r--r-- | src/port/stdlib.c | 76 |
4 files changed, 92 insertions, 9 deletions
diff --git a/src/GNUmakefile b/src/GNUmakefile index 9d11a38..0c151a5 100644 --- a/src/GNUmakefile +++ b/src/GNUmakefile @@ -10,6 +10,7 @@ PORT_OBJS = \ port/string.o \ port/unistd.o \ port/stdio.o \ + port/stdlib.o \ port/time.o \ port/gettext.o diff --git a/src/Makefile.W32 b/src/Makefile.W32 index bbf7abb..92cda58 100644 --- a/src/Makefile.W32 +++ b/src/Makefile.W32 @@ -15,6 +15,7 @@ LIBRARIES = \ PORT_OBJS = \ port\string.obj \ port\stdio.obj \ + port\stdlib.obj \ port\time.obj LOG_OBJS = \ diff --git a/src/log/log.c b/src/log/log.c index edbc00d..cb487a6 100644 --- a/src/log/log.c +++ b/src/log/log.c @@ -20,7 +20,8 @@ #include "log/messages.h" /* for i18n */ #include "port/stdio.h" /* for vsnprintf, snprintf */ -#include "port/string.h" /* for strcmp, strerror_r, strlen */ +#include "port/string.h" /* for strcmp, strerror_r, strlen, + strlcat */ #include "port/time.h" /* for localtime_r, strftime, time * time_t, struct tm */ #include "port/unused.h" /* for WOLF_UNUSED */ @@ -794,6 +795,8 @@ void wolf_log_win32_ap( wolf_log_level_t level, int category_id, int message_id, LPVOID buf; DWORD buf_size; DWORD res; + char new_format[1024]; + char int_buf[10]; res = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | @@ -805,15 +808,17 @@ void wolf_log_win32_ap( wolf_log_level_t level, int category_id, int message_id, 0, /* minimum allocation size */ NULL ); /* no arguments */ - if( res == 0 ) { - /* FormatMessage failed, so log the error just with the - * GetLastError() number - */ - char new_format[1024]; - - - wolf_log_ap( level, category_id, message_id, new_format, ap ); + strlcpy( new_format, format, 1024 ); + strlcat( new_format, ": ", 1024 ); + if( res != 0 ) { + strlcat( new_format, buf, 1024 ); } + + strlcat( new_format, "( ", 1024 ); + strlcat( new_format, itoa( last_error, int_buf, 10 ), 1024 ); + strlcat( new_format, ")", 1024 ); + + wolf_log_ap( level, category_id, message_id, new_format, ap ); } #endif /* defined _WIN32 */ diff --git a/src/port/stdlib.c b/src/port/stdlib.c new file mode 100644 index 0000000..5cfaa8a --- /dev/null +++ b/src/port/stdlib.c @@ -0,0 +1,76 @@ +/* + Copyright (C) 2008 Andreas Baumann <abaumann@yahoo.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "port/stdlib.h" + +#if !defined HAVE_ITOA || defined TEST_HAVE_ITOA + +#include "port/string.h" /* for memset */ +#include "port/unistd.h" /* for getpid */ + +#include <errno.h> /* for errno */ + +char *wolf_port_itoa( int value, char *string, int radix ); + +int wolf_port_lockf( int fd, int cmd, off_t len ) { + struct flock fl; + + memset( (char *)&fl, 0, sizeof( fl ) ); + /* lockf is always relative to the current file position. */ + fl.l_whence = SEEK_CUR; + fl.l_start = 0; + fl.l_len = len; + + errno = 0; + + switch( cmd ) { + case F_TEST: + fl.l_type = F_RDLCK; + if( fcntl( fd, F_GETLK, &fl ) < 0 ) { + return -1; + } + if( fl.l_type == F_UNLCK || + fl.l_pid == getpid( ) ) { + return 0; + } + errno = EACCES; + return -1; + + case F_ULOCK: + fl.l_type = F_UNLCK; + cmd = F_SETLK; + break; + + case F_LOCK: + fl.l_type = F_WRLCK; + cmd = F_SETLKW; + break; + + case F_TLOCK: + fl.l_type = F_WRLCK; + cmd = F_SETLK; + break; + + default: + errno = EINVAL; + return -1; + } + + return fcntl( fd, cmd, &fl ); +} + +#endif /* !defined HAVE_LOCKF || defined TEST_HAVE_LOCKF */ |