From 71004021851e99a7a431423915b751c02bd10929 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Mon, 12 Jan 2009 15:44:13 +0100 Subject: fixes for Cygwin (snprintf), started cleaning up namespace prefixes --- GNUmakefile | 3 + configure | 5 +- include/wolf/daemon/daemon.h | 4 +- include/wolf/daemon/signals.h | 20 +++---- include/wolf/errors.h | 23 ++++---- include/wolf/port/sys.h | 29 +++++++++- makefiles/dist.mk | 38 +++++++++++++ makefiles/guess_env | 9 +++ makefiles/platform.mk | 3 +- makefiles/top.mk | 2 + src/daemon/daemon.c | 129 ++++++++++++++++++++++-------------------- src/daemon/pidfile.c | 48 ++++++++-------- src/daemon/pidfile.h | 8 +-- src/daemon/signals.c | 78 ++++++++++++------------- src/port/snprintf.c | 2 + src/port/snprintf.h | 15 +++++ src/port/stdint.h | 30 +++++++--- tests/daemon/testd.c | 8 +-- 18 files changed, 285 insertions(+), 169 deletions(-) create mode 100644 makefiles/dist.mk diff --git a/GNUmakefile b/GNUmakefile index 9e5cd85..ca6b9c1 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -2,4 +2,7 @@ TOPDIR = . SUBDIRS = src include tests docs +PACKAGE_NAME = WolfBones +PACKAGE_VERSION = 0.0.1 + -include $(TOPDIR)/makefiles/top.mk diff --git a/configure b/configure index a721db0..0a64dcb 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #!/bin/sh -cat >$$ <error = -1; + d->state = TERMINATE_ERROR; + d->error = WOLF_ERR_INTERNAL; d->params = params; if( params.daemon_name == NULL ) { - *error = ERR_INVALID_VALUE; + *error = WOLF_ERR_INVALID_VALUE; return NULL; } @@ -58,7 +64,7 @@ daemon_p daemon_new( daemon_params_t params, pidfile_set_from_filename( &d->pidfile, params.pid_filename ); } - *error = OK; + *error = WOLF_OK; return d; } @@ -67,7 +73,7 @@ void daemon_free( daemon_p d ) { d = NULL; } -static error_t close_fd( int fd ) { +static wolf_error_t close_fd( int fd ) { if( close( fd ) < 0 ) { switch( errno ) { case EBADF: @@ -77,34 +83,34 @@ static error_t close_fd( int fd ) { default: LOG( log_EMERG, "Error while closing file descriptor %d: %s (%d)", fd, strerror( errno ), errno ); - return ERR_INTERNAL; + return WOLF_ERR_INTERNAL; } } - return OK; + return WOLF_OK; } -static error_t daemon_close_standard_fds( void ) { - error_t error; +static wolf_error_t daemon_close_standard_fds( void ) { + wolf_error_t error; - if( ( error = close_fd( STDIN_FILENO ) ) != OK ) return error; - if( ( error = close_fd( STDOUT_FILENO ) ) != OK ) return error; - if( ( error = close_fd( STDERR_FILENO ) ) != OK ) return error; + if( ( error = close_fd( STDIN_FILENO ) ) != WOLF_OK ) return error; + if( ( error = close_fd( STDOUT_FILENO ) ) != WOLF_OK ) return error; + if( ( error = close_fd( STDERR_FILENO ) ) != WOLF_OK ) return error; - return OK; + return WOLF_OK; } -static error_t daemon_close_all_fds( void ) { +static wolf_error_t daemon_close_all_fds( void ) { long nof_files; int i; - error_t error; + wolf_error_t error; nof_files = sysconf( _SC_OPEN_MAX ); if( nof_files < 0 ) { LOG( log_EMERG, "Unable to retrieve maximal number of files: %s (%d)", strerror( errno ), errno ); - return ERR_INTERNAL; + return WOLF_ERR_INTERNAL; } LOG( log_DEBUG, "Closing all filedescriptors up to %ld", nof_files ); @@ -120,28 +126,28 @@ static error_t daemon_close_all_fds( void ) { ( i == exit_code_pipe[1] ) ) { continue; } - if( ( error = close_fd( i ) ) != OK ) return error; + if( ( error = close_fd( i ) ) != WOLF_OK ) return error; } - return OK; + return WOLF_OK; } -static error_t open_null_fd( int must_fd, int flags ) { +static wolf_error_t open_null_fd( int must_fd, int flags ) { int fd; fd = open( "/dev/null", flags ); if( fd < 0 ) { LOG( log_EMERG, "Unable to open fd %d as /dev/null: %s (%d)", must_fd, strerror( errno ), errno ); - return ERR_INTERNAL; + return WOLF_ERR_INTERNAL; } if( fd != must_fd ) { LOG( log_EMERG, "Something is wrong with the file descriptors (expecting %d,got %d)!", must_fd, fd ); - return ERR_PROGRAMMING; + return WOLF_ERR_PROGRAMMING; } - return OK; + return WOLF_OK; } static void atomar_write( int fd, void *data, size_t data_len ) { @@ -174,10 +180,10 @@ atomar_read_again: } } -error_t daemon_start( daemon_p d ) { +wolf_error_t daemon_start( daemon_p d ) { pid_t pid; mode_t mode; - error_t error; + wolf_error_t error; int exit_code; /* Our parent is already the init process (which has pid 1 by @@ -186,7 +192,7 @@ error_t daemon_start( daemon_p d ) { */ if( getppid( ) == 1 ) { LOG( log_EMERG, "Already running as daemon!" ); - return( d->error = ERR_PROGRAMMING ); + return( d->error = WOLF_ERR_PROGRAMMING ); } /* Are we starting as root? If not, bail out, we need root @@ -197,7 +203,7 @@ error_t daemon_start( daemon_p d ) { */ if( geteuid( ) != 0 ) { LOG( log_EMERG, "Unable to start daemon as not root user!" ); - return( d->error = ERR_INVALID_STATE ); + return( d->error = WOLF_ERR_INVALID_STATE ); } /* We fork so SIGCHLD signals get to the parent and grandfather. @@ -223,7 +229,7 @@ error_t daemon_start( daemon_p d ) { if( pipe( exit_code_pipe ) < 0 ) { LOG( log_EMERG, "Unable to create exit code pipe: %s (%d)", strerror( errno ), errno ); - return ( d->error = ERR_INTERNAL ); + return ( d->error = WOLF_ERR_INTERNAL ); } LOG( log_DEBUG, "Created exit code pipe (%d,%d)", exit_code_pipe[0], exit_code_pipe[1] ); @@ -234,7 +240,7 @@ error_t daemon_start( daemon_p d ) { case -1: /* error */ LOG( log_EMERG, "Unable to fork the first time: %s", strerror( errno ) ); - return ( d->error = ERR_INTERNAL ); + return ( d->error = WOLF_ERR_INTERNAL ); case 0: /* the child becomes the daemon */ @@ -249,7 +255,7 @@ error_t daemon_start( daemon_p d ) { * code from the error pipe */ LOG( log_DEBUG, "Parent after first fork: child is %d", pid ); - return ( d->error = TERMINATE_EXIT_CODE ); + return ( d->state = TERMINATE_EXIT_CODE ); } /* second pipe communicates from the daemon back to its parent @@ -258,7 +264,7 @@ error_t daemon_start( daemon_p d ) { if( pipe( daemon_parent_pipe ) < 0 ) { LOG( log_EMERG, "Unable to create parent pipe: %s (%d)", strerror( errno ), errno ); - return ( d->error = ERR_INTERNAL ); + return ( d->error = WOLF_ERR_INTERNAL ); } LOG( log_DEBUG, "Created parent pipe (%d,%d)", daemon_parent_pipe[0], daemon_parent_pipe[1] ); @@ -269,7 +275,7 @@ error_t daemon_start( daemon_p d ) { if( setsid( ) < 0 ) { /* should actually never fail */ LOG( log_EMERG, "Starting new process group session for the parent of the daemon failed: %s", strerror( errno ) ); - return ERR_INTERNAL; + return WOLF_ERR_INTERNAL; } /* We fork so SIGCHLD signals get to the parent and grandfather. @@ -296,7 +302,7 @@ error_t daemon_start( daemon_p d ) { case -1: /* error */ LOG( log_EMERG, "Unable to fork the second time: %s", strerror( errno ) ); - return ( d->error = ERR_INTERNAL ); + return ( d->error = WOLF_ERR_INTERNAL ); case 0: /* the child becomes the daemon */ @@ -306,13 +312,13 @@ error_t daemon_start( daemon_p d ) { default: (void)signal_install_handlers_parent( ); LOG( log_DEBUG, "Parent after second fork: child (and daemon) is %d", pid ); - return ( d->error = TERMINATE_PARENT ); + return ( d->state = TERMINATE_PARENT ); } /* Now install signal handlers */ - if( ( error = signal_initialize( ) ) != OK ) + if( ( error = signal_initialize( ) ) != WOLF_OK ) return ( d->error = error ); - if( ( error = signal_install_handlers_daemon( ) ) != OK ) + if( ( error = signal_install_handlers_daemon( ) ) != WOLF_OK ) return ( d->error = error ); /* Put the daemon in it's own process group and finally detach it @@ -322,7 +328,7 @@ error_t daemon_start( daemon_p d ) { if( setsid( ) < 0 ) { /* should actually never fail */ LOG( log_EMERG, "Starting new process group for daemon session failed: %s", strerror( errno ) ); - return ERR_INTERNAL; + return WOLF_ERR_INTERNAL; } /* Change to the root directory for several reasons: @@ -335,7 +341,7 @@ error_t daemon_start( daemon_p d ) { */ if( chdir( "/" ) < 0 ) { LOG( log_EMERG, "Changing to root diretory failed: %s", strerror( errno ) ); - return ERR_INTERNAL; + return WOLF_ERR_INTERNAL; } LOG( log_DEBUG, "Changed to root directory /" ); @@ -348,11 +354,11 @@ error_t daemon_start( daemon_p d ) { LOG( log_DEBUG, "Switched umask from %04o to %04o", mode, 0133 ); /* check if another daemon is already running, if yes, bail out */ - if( is_daemon_running( &d->pidfile, &pid, &error ) || ( error != OK ) ) { - if( error == OK ) { + if( is_daemon_running( &d->pidfile, &pid, &error ) || ( error != WOLF_OK ) ) { + if( error == WOLF_OK ) { LOG( log_EMERG, "Another daemon is already running with pid '%d', can't start!", pid ); } - return ERR_INTERNAL; + return WOLF_ERR_INTERNAL; } /* we loose logfile and syslog file descriptors anyway, so close @@ -362,16 +368,16 @@ error_t daemon_start( daemon_p d ) { closelogtostderr( ); /* close all filedescriptors */ - if( daemon_close_all_fds( ) != OK ) - return ERR_INTERNAL; + if( daemon_close_all_fds( ) != WOLF_OK ) + return WOLF_ERR_INTERNAL; /* reopen the logs to the logfile and syslog (not stderr) */ reopenlogtosyslog( ); reopenlogtofile( ); /* create and lock the pidfile now, write pid of daemon into it */ - if( pidfile_create( &d->pidfile ) != OK ) { - return ERR_INTERNAL; + if( pidfile_create( &d->pidfile ) != WOLF_OK ) { + return WOLF_ERR_INTERNAL; } /* Install the final permissions for new files. The reason is @@ -399,7 +405,7 @@ error_t daemon_start( daemon_p d ) { LOG( log_EMERG, "Unable to retrieve group information for group '%s': %s (%d)", d->params.group_name, strerror( errno ), errno ); } - return ERR_INTERNAL; + return WOLF_ERR_INTERNAL; } errno = 0; @@ -411,19 +417,19 @@ error_t daemon_start( daemon_p d ) { LOG( log_EMERG, "Unable to retrieve user information for user '%s': %s (%d)", d->params.user_name, strerror( errno ), errno ); } - return ERR_INTERNAL; + return WOLF_ERR_INTERNAL; } if( setgid( d->userent->pw_gid ) < 0 ) { LOG( log_EMERG, "Setting unprivileged group failed: %s (%d)", strerror( errno ), errno ); - return ERR_INTERNAL; + return WOLF_ERR_INTERNAL; } if( setuid( d->userent->pw_uid ) < 0 ) { LOG( log_EMERG, "Setting unprivileged user failed: %s (%d)", strerror( errno ), errno ); - return ERR_INTERNAL; + return WOLF_ERR_INTERNAL; } /* TODO: setsid and setting all groups of the user */ @@ -440,10 +446,10 @@ error_t daemon_start( daemon_p d ) { * starting the daemon by hand still gets error messages * on stderr. */ - if( ( error = daemon_close_standard_fds( ) ) != OK ) return error; - if( ( error = open_null_fd( STDIN_FILENO, O_RDONLY ) ) != OK ) return error; - if( ( error = open_null_fd( STDOUT_FILENO, O_WRONLY ) ) != OK ) return error; - if( ( error = open_null_fd( STDERR_FILENO, O_WRONLY ) ) != OK ) return error; + if( ( error = daemon_close_standard_fds( ) ) != WOLF_OK ) return error; + if( ( error = open_null_fd( STDIN_FILENO, O_RDONLY ) ) != WOLF_OK ) return error; + if( ( error = open_null_fd( STDOUT_FILENO, O_WRONLY ) ) != WOLF_OK ) return error; + if( ( error = open_null_fd( STDERR_FILENO, O_WRONLY ) ) != WOLF_OK ) return error; /* signal the grand-parent process, that he can return 0 to * the calling shell/script @@ -451,7 +457,8 @@ error_t daemon_start( daemon_p d ) { exit_code = EXIT_SUCCESS; atomar_write( exit_code_pipe[1], &exit_code, sizeof( int ) ); - return ( d->error = OK ); + d->state = TERMINATE_OK; + return ( d->error = WOLF_OK ); } NORETURN void daemon_exit( daemon_p d ) { @@ -460,7 +467,7 @@ NORETURN void daemon_exit( daemon_p d ) { LOG( log_DEBUG, "daemon_exit called with error %d", d->error ); - switch( d->error ) { + switch( d->state ) { case TERMINATE_EXIT_CODE: /* wait here for exit code in exit_code_pipe * so we can return the correct exit code to @@ -504,7 +511,7 @@ NORETURN void daemon_exit( daemon_p d ) { /* exit code is irrelevant here.. */ exit( EXIT_SUCCESS ); - case OK: + case TERMINATE_OK: /* close and unlock the pidfile here */ (void)pidfile_release( &d->pidfile ); @@ -519,8 +526,8 @@ NORETURN void daemon_exit( daemon_p d ) { /* exit code is irrelevant here */ _exit( EXIT_SUCCESS ); - - default: + + case TERMINATE_ERROR: /* no exit_code_pipe exists yet, we are before the * first fork, so terminate with proper exit code */ diff --git a/src/daemon/pidfile.c b/src/daemon/pidfile.c index 53f81c9..0456425 100644 --- a/src/daemon/pidfile.c +++ b/src/daemon/pidfile.c @@ -39,7 +39,7 @@ void pidfile_set_from_filename( struct pidfile_t *pidfile, const char *filename snprintf( pidfile->filename, PATH_MAX, "%s", filename ); } -bool is_daemon_running( struct pidfile_t *pidfile, pid_t *pid, error_t *error ) { +bool is_daemon_running( struct pidfile_t *pidfile, pid_t *pid, wolf_error_t *error ) { int res; ssize_t bytes_read; char buf[256]; @@ -55,11 +55,11 @@ bool is_daemon_running( struct pidfile_t *pidfile, pid_t *pid, error_t *error ) /* this is good, pid file doesn't exist at all */ LOG( log_DEBUG, "No pidfile '%s' found, daemon is not running", pidfile->filename ); (void)close( pidfile->fd ); - *error = OK; + *error = WOLF_OK; return pidfile->running; } else { LOG( log_EMERG, "Unable to open pidfile '%s' for reading: %s", pidfile->filename, strerror( errno ) ); - *error = ERR_INTERNAL; + *error = WOLF_ERR_INTERNAL; return pidfile->running; } } @@ -70,13 +70,13 @@ bool is_daemon_running( struct pidfile_t *pidfile, pid_t *pid, error_t *error ) if( errno == EAGAIN ) { /* another process locks the file already */ LOG( log_DEBUG, "Another process locks the pidfile, daemon already running" ); - *error = OK; + *error = WOLF_OK; pidfile->locked = true; pidfile->running = true; } else { LOG( log_EMERG, "Unable to lock pidfile '%s': %s", pidfile->filename, strerror( errno ) ); (void)close( pidfile->fd ); - *error = ERR_INTERNAL; + *error = WOLF_ERR_INTERNAL; pidfile->running = false; return pidfile->running; } @@ -89,7 +89,7 @@ bool is_daemon_running( struct pidfile_t *pidfile, pid_t *pid, error_t *error ) if( bytes_read < 0 ) { LOG( log_EMERG, "Unable to read pid from pidfile '%s': %s", pidfile->filename, strerror( errno ) ); (void)close( pidfile->fd ); - *error = ERR_INTERNAL; + *error = WOLF_ERR_INTERNAL; return pidfile->running; } @@ -105,7 +105,7 @@ bool is_daemon_running( struct pidfile_t *pidfile, pid_t *pid, error_t *error ) ( *pid < 2 ) /* too small value */ ) { LOG( log_EMERG, "pidfile '%s' contains invalid data, can't read PID from it!", pidfile->filename ); (void)close( pidfile->fd ); - *error = ERR_INTERNAL; + *error = WOLF_ERR_INTERNAL; return pidfile->running; } LOG( log_DEBUG, "Found PID '%lu' in pidfile", *pid ); @@ -119,12 +119,12 @@ bool is_daemon_running( struct pidfile_t *pidfile, pid_t *pid, error_t *error ) /* this is fine, process doesn't exist with this PID */ LOG( log_EMERG, "Found PID '%lu' in pidfile '%s', but no such process is running. Check and manually delete the pidfile!", *pid, pidfile->filename ); (void)close( pidfile->fd ); - *error = ERR_INTERNAL; + *error = WOLF_ERR_INTERNAL; return pidfile->running; } else { LOG( log_EMERG, "Can't check if processor with PID '%lu' is alive: %s", *pid, strerror( errno ) ); (void)close( pidfile->fd ); - *error = ERR_INTERNAL; + *error = WOLF_ERR_INTERNAL; return pidfile->running; } } @@ -134,11 +134,11 @@ bool is_daemon_running( struct pidfile_t *pidfile, pid_t *pid, error_t *error ) * (worst case, we assume, it's the daemon) */ (void)close( pidfile->fd ); - *error = OK; + *error = WOLF_OK; return pidfile->running; } -error_t pidfile_create( struct pidfile_t *pidfile ) { +wolf_error_t pidfile_create( struct pidfile_t *pidfile ) { int res; char pid_string[20]; ssize_t bytes_writen; @@ -147,7 +147,7 @@ error_t pidfile_create( struct pidfile_t *pidfile ) { pidfile->fd = open( pidfile->filename, O_CREAT | O_WRONLY | O_EXCL, 0644 ); if( pidfile->fd < 0 ) { LOG( log_EMERG, "Unable to open pidfile '%s' for writing: %s", pidfile->filename, strerror( errno ) ); - return ERR_INTERNAL; + return WOLF_ERR_INTERNAL; } /* Try to lock the pid file (non-blocking) */ @@ -160,12 +160,12 @@ error_t pidfile_create( struct pidfile_t *pidfile ) { LOG( log_EMERG, "Unable to lock pidfile '%s' after creation, daemon started in parallel?", pidfile->filename ); (void)close( pidfile->fd ); (void)unlink( pidfile->filename ); - return ERR_INVALID_STATE; + return WOLF_ERR_INVALID_STATE; } else { LOG( log_EMERG, "Unable to lock pidfile '%s' after creation: %s", pidfile->filename, strerror( errno ) ); (void)close( pidfile->fd ); (void)unlink( pidfile->filename ); - return ERR_INTERNAL; + return WOLF_ERR_INTERNAL; } } @@ -176,7 +176,7 @@ error_t pidfile_create( struct pidfile_t *pidfile ) { LOG( log_EMERG, "Unable to truncate the pidfile '%s' before writing to it", pidfile->filename, strerror( errno ) ); (void)close( pidfile->fd ); (void)unlink( pidfile->filename ); - return ERR_INTERNAL; + return WOLF_ERR_INTERNAL; } /* We remember the pid in the file for init scripts which rely on the pid @@ -188,7 +188,7 @@ error_t pidfile_create( struct pidfile_t *pidfile ) { LOG( log_EMERG, "Unable to write PID into the pidfile '%s': %s", pidfile->filename, strerror( errno ) ); (void)close( pidfile->fd ); (void)unlink( pidfile->filename ); - return ERR_INTERNAL; + return WOLF_ERR_INTERNAL; } else if( bytes_writen != (ssize_t)strlen( pid_string ) ) { /* non-atomic write on files with so little data, strange, should never happen! */ LOG( log_EMERG, "Non-atomic write failed when storing the PID into the pidfile '%s'", pidfile->filename ); @@ -197,11 +197,11 @@ error_t pidfile_create( struct pidfile_t *pidfile ) { pidfile->locked = true; - return OK; + return WOLF_OK; } -error_t pidfile_release( struct pidfile_t *pidfile ) { - error_t error = OK; +wolf_error_t pidfile_release( struct pidfile_t *pidfile ) { + wolf_error_t error = WOLF_OK; LOG( log_DEBUG, "Releasing (unlocking/closing) pidfile '%s' (fd: %d, locked: %d)", pidfile->filename, pidfile->fd, pidfile->locked ); @@ -210,7 +210,7 @@ error_t pidfile_release( struct pidfile_t *pidfile ) { if( lockf( pidfile->fd, F_ULOCK, (off_t)0 ) < 0 ) { LOG( log_ALERT, "Unable to unlock the pidfile '%s': %s (%d)", pidfile->filename, strerror( errno ), errno ); - error = ERR_INTERNAL; + error = WOLF_ERR_INTERNAL; } } @@ -218,7 +218,7 @@ error_t pidfile_release( struct pidfile_t *pidfile ) { if( close( pidfile->fd ) < 0 ) { LOG( log_ALERT, "Unable to close the pidfile '%s': %s (%d)", pidfile->filename, strerror( errno ), errno ); - error = ERR_INTERNAL; + error = WOLF_ERR_INTERNAL; } pidfile->fd = -1; } @@ -226,8 +226,8 @@ error_t pidfile_release( struct pidfile_t *pidfile ) { return error; } -error_t pidfile_remove( struct pidfile_t *pidfile ) { - error_t error = OK; +wolf_error_t pidfile_remove( struct pidfile_t *pidfile ) { + wolf_error_t error = WOLF_OK; LOG( log_DEBUG, "Removing pidfile '%s' (fd: %d, locked: %d, running: %d)", pidfile->filename, pidfile->fd, pidfile->locked, pidfile->running ); @@ -237,7 +237,7 @@ error_t pidfile_remove( struct pidfile_t *pidfile ) { if( unlink( pidfile->filename ) < 0 ) { LOG( log_ALERT, "Unable to remove the pidfile '%s': %s (%d)", pidfile->filename, strerror( errno ), errno ); - error = ERR_INTERNAL; + error = WOLF_ERR_INTERNAL; } return error; diff --git a/src/daemon/pidfile.h b/src/daemon/pidfile.h index 25ddd48..8b1c40e 100644 --- a/src/daemon/pidfile.h +++ b/src/daemon/pidfile.h @@ -21,12 +21,12 @@ void pidfile_set_from_daemon_name( struct pidfile_t *pidfile, const char *daemon void pidfile_set_from_filename( struct pidfile_t *pidfile, const char *filename ); -bool is_daemon_running( struct pidfile_t *pidfile, pid_t *pid, error_t *error ); +bool is_daemon_running( struct pidfile_t *pidfile, pid_t *pid, wolf_error_t *error ); -error_t pidfile_create( struct pidfile_t *pidfile ); +wolf_error_t pidfile_create( struct pidfile_t *pidfile ); -error_t pidfile_release( struct pidfile_t *pidfile ); +wolf_error_t pidfile_release( struct pidfile_t *pidfile ); -error_t pidfile_remove( struct pidfile_t *pidfile ); +wolf_error_t pidfile_remove( struct pidfile_t *pidfile ); #endif /* ifndef __PIDFILE_H */ diff --git a/src/daemon/signals.c b/src/daemon/signals.c index b455838..c5b4563 100644 --- a/src/daemon/signals.c +++ b/src/daemon/signals.c @@ -150,7 +150,7 @@ const char *signal_get_long_name( int sig ) { } } -static error_t vsignal_install_ignore( int sig, va_list ap ) { +static wolf_error_t vsignal_install_ignore( int sig, va_list ap ) { struct sigaction sa; char errbuf[1024]; @@ -166,7 +166,7 @@ install_ignore_again: sig, errbuf, errno ); - return ERR_PROGRAMMING; + return WOLF_ERR_PROGRAMMING; } LOG( log_DEBUG, "Ignoring signal handler for signal '%s' (%s)", signal_get_long_name( sig ), @@ -174,7 +174,7 @@ install_ignore_again: sig = va_arg( ap, int ); if( sig > 0 ) goto install_ignore_again; - return OK; + return WOLF_OK; } /* some signals we should not ignore, like SIGPIPE or SIGC(H)LD, because @@ -185,7 +185,7 @@ static void empty_handler( int sig ) { UNUSED( sig ); } -static error_t vsignal_install_empty( int sig, va_list ap ) { +static wolf_error_t vsignal_install_empty( int sig, va_list ap ) { struct sigaction sa; char errbuf[1024]; @@ -201,7 +201,7 @@ install_empty_again: sig, errbuf, errno ); - return ERR_PROGRAMMING; + return WOLF_ERR_PROGRAMMING; } LOG( log_DEBUG, "Installed empty signal handler for signal '%s' (%s)", signal_get_long_name( sig ), @@ -209,7 +209,7 @@ install_empty_again: sig = va_arg( ap, int ); if( sig > 0 ) goto install_empty_again; - return OK; + return WOLF_OK; } static void fatal_handler( int sig ) { @@ -232,7 +232,7 @@ static void fatal_handler( int sig ) { kill( getpid( ), sig ); } -static error_t vsignal_install_func( signal_func_t func, int sig, va_list ap ) { +static wolf_error_t vsignal_install_func( signal_func_t func, int sig, va_list ap ) { struct sigaction sa; char errbuf[1024]; @@ -249,7 +249,7 @@ install_func_again: sig, errbuf, errno ); - return ERR_PROGRAMMING; + return WOLF_ERR_PROGRAMMING; } LOG( log_DEBUG, "Installed signal handler for signal '%s' (%s)", signal_get_long_name( sig ), @@ -257,12 +257,12 @@ install_func_again: sig = va_arg( ap, int ); if( sig > 0 ) goto install_func_again; - return OK; + return WOLF_OK; } -error_t signal_install_func( signal_func_t func, int sig, ... ) { +wolf_error_t signal_install_func( signal_func_t func, int sig, ... ) { va_list ap; - error_t error; + wolf_error_t error; va_start( ap, sig ); error = vsignal_install_func( func, sig, ap ); va_end( ap ); @@ -270,9 +270,9 @@ error_t signal_install_func( signal_func_t func, int sig, ... ) { } #define INSTALL_SIGNAL( MODE ) \ -error_t signal_install_##MODE( int sig, ... ) { \ +wolf_error_t signal_install_##MODE( int sig, ... ) { \ va_list ap; \ - error_t error; \ + wolf_error_t error; \ va_start( ap, sig ); \ error = vsignal_install_##MODE( sig, ap ); \ va_end( ap ); \ @@ -283,9 +283,9 @@ INSTALL_SIGNAL( ignore ) INSTALL_SIGNAL( empty ) #define INSTALL_SIGNAL_FUNC( MODE, FUNC ) \ -error_t signal_install_##MODE( int sig, ... ) { \ +wolf_error_t signal_install_##MODE( int sig, ... ) { \ va_list ap; \ - error_t error; \ + wolf_error_t error; \ va_start( ap, sig ); \ error = vsignal_install_func( FUNC, sig, ap ); \ va_end( ap ); \ @@ -309,13 +309,13 @@ static void notify_handler( int sig ) { INSTALL_SIGNAL_FUNC( notify, notify_handler ) INSTALL_SIGNAL_FUNC( notify_parent, notify_parent_handler ) -error_t signal_initialize( void ) { +wolf_error_t signal_initialize( void ) { int res; char errbuf[1024]; if( daemon_signal_pipe[0] != -1 || daemon_signal_pipe[1] != -1 ) { - return ERR_INVALID_STATE; + return WOLF_ERR_INVALID_STATE; } res = pipe( daemon_signal_pipe ); @@ -323,11 +323,11 @@ error_t signal_initialize( void ) { (void)strerror_r( errno, errbuf, 1024 ); LOG( log_EMERG, "Unable to create signal pipe: %s (%d)", errbuf, errno ); - return ERR_INTERNAL; + return WOLF_ERR_INTERNAL; } LOG( log_DEBUG, "Created signal pipe (%d,%d)", daemon_signal_pipe[0], daemon_signal_pipe[1] ); - return OK; + return WOLF_OK; } void signal_terminate( void ) { @@ -335,7 +335,7 @@ void signal_terminate( void ) { (void)close( daemon_signal_pipe[1] ); } -int signal_suspend( int timeout, error_t *error ) { +int signal_suspend( int timeout, wolf_error_t *error ) { struct timeval tv; fd_set fds; ssize_t res; @@ -343,7 +343,7 @@ int signal_suspend( int timeout, error_t *error ) { char errbuf[1024]; if( daemon_signal_pipe[0] == -1 ) { - *error = ERR_INVALID_STATE; + *error = WOLF_ERR_INVALID_STATE; return -1; } @@ -360,7 +360,7 @@ signal_select_again: break; case 0: /* timeout */ - *error = ERR_TIMEOUT; + *error = WOLF_ERR_TIMEOUT; return 0; case -1: /* error */ @@ -370,7 +370,7 @@ signal_select_again: (void)strerror_r( errno, errbuf, 1024 ); LOG( log_EMERG, "Error in select when waiting for signal from pipe: %s (%d)", errbuf, errno ); - *error = ERR_INTERNAL; + *error = WOLF_ERR_INTERNAL; return -1; } @@ -383,21 +383,21 @@ signal_select_again: (void)strerror_r( errno, errbuf, 1024 ); LOG( log_EMERG, "Error while reading a signal from the pipe: %s (%d)", errbuf, errno ); - *error = ERR_INTERNAL; + *error = WOLF_ERR_INTERNAL; return -1; default: /* unexpected result on atomic read */ LOG( log_EMERG, "Unexpected error in read: result is %d", res ); - *error = ERR_PROGRAMMING; + *error = WOLF_ERR_PROGRAMMING; return -1; } - *error = OK; + *error = WOLF_OK; return sig; } -error_t signal_install_handlers_parent( void ) { - error_t error; +wolf_error_t signal_install_handlers_parent( void ) { + wolf_error_t error; /* signals to ignore */ if( ( error = signal_install_ignore( @@ -429,7 +429,7 @@ error_t signal_install_handlers_parent( void ) { SIGHUP, SIGUSR1, SIGUSR2, - 0 ) ) != OK ) return error; + 0 ) ) != WOLF_OK ) return error; /* signals for empty handlers */ if( ( error = signal_install_empty( @@ -445,7 +445,7 @@ error_t signal_install_handlers_parent( void ) { #endif #endif #endif - 0 ) ) != OK ) return error; + 0 ) ) != WOLF_OK ) return error; /* fatal signal handlers, make sure the parent can read the * signal and clean up @@ -469,14 +469,14 @@ error_t signal_install_handlers_parent( void ) { SIGSYS, #endif SIGALRM, /* we don't use it, but maybe a plugin */ - 0 ) ) != OK ) return error; + 0 ) ) != WOLF_OK ) return error; - return OK; + return WOLF_OK; } -error_t signal_install_handlers_daemon( void ) { - error_t error; +wolf_error_t signal_install_handlers_daemon( void ) { + wolf_error_t error; /* signals to ignore */ if( ( error = signal_install_ignore( @@ -503,7 +503,7 @@ error_t signal_install_handlers_daemon( void ) { #if defined( SIGPWR ) SIGPWR, #endif - 0 ) ) != OK ) return error; + 0 ) ) != WOLF_OK ) return error; /* signals for empty handlers */ if( ( error = signal_install_empty( @@ -519,7 +519,7 @@ error_t signal_install_handlers_daemon( void ) { #endif #endif #endif - 0 ) ) != OK ) return error; + 0 ) ) != WOLF_OK ) return error; /* fatal signal handlers, log the exception and continue with * default behaviour of the system @@ -543,7 +543,7 @@ error_t signal_install_handlers_daemon( void ) { SIGSYS, #endif SIGALRM, /* we don't use it, but maybe a plugin */ - 0 ) ) != OK ) return error; + 0 ) ) != WOLF_OK ) return error; /* notify the following signals to the main loop */ if( ( error = signal_install_notify( @@ -552,8 +552,8 @@ error_t signal_install_handlers_daemon( void ) { SIGHUP, SIGUSR1, SIGUSR2, - 0 ) ) != OK ) return error; + 0 ) ) != WOLF_OK ) return error; - return OK; + return WOLF_OK; } diff --git a/src/port/snprintf.c b/src/port/snprintf.c index 65d9602..6062154 100644 --- a/src/port/snprintf.c +++ b/src/port/snprintf.c @@ -532,7 +532,9 @@ static UINTMAX_T cast(LDOUBLE); static UINTMAX_T myround(LDOUBLE); static LDOUBLE mypow10(int); +/* not really good! extern int errno; +*/ int rpl_vsnprintf(char *str, size_t size, const char *format, va_list args) diff --git a/src/port/snprintf.h b/src/port/snprintf.h index c374a15..4e06c8b 100644 --- a/src/port/snprintf.h +++ b/src/port/snprintf.h @@ -3,13 +3,28 @@ #include "port/sys.h" +/* impose some defaults, if we need snprintf and friends on the platform + * given, we define the proper values in include/port/sys.h + */ +#ifndef HAVE_CONFIG_H #define HAVE_CONFIG_H 0 +#endif #define TEST_SNPRINTF 0 +#ifndef HAVE_STDARG_H #define HAVE_STDARG_H 1 +#endif +#ifndef HAVE_STDDEF_H #define HAVE_STDDEF_H 1 +#endif +#ifndef HAVE_SYS_TYPES_H #define HAVE_SYS_TYPES_H 1 +#endif +#ifndef HAVE_STDLIB_H #define HAVE_STDLIB_H 1 +#endif +#ifndef HAVE_VA_COPY #define HAVE_VA_COPY 1 +#endif #if HAVE_STDARG_H #include /* for va_list */ diff --git a/src/port/stdint.h b/src/port/stdint.h index 345ec7e..ec4f0ce 100644 --- a/src/port/stdint.h +++ b/src/port/stdint.h @@ -3,13 +3,29 @@ #include "port/sys.h" -#if defined HAVE_STDINT_H -#include -#endif /* defined HAVE_STDINT_H */ +/* for uintptr_t and snprintf placeholder PRIdPTR (FIXME: + * needs a lot of improvement!) + */ +#if defined SUNOS + +#if OS_MAJOR_VERSION == 5 -/* Solaris 8 weirdness */ -#if defined HAVE_LINK_H -#include -#endif /* defined HAVE_LINK_H */ +#if OS_MINOR_VERSION == 8 +#include +/* FIXME: this may depend on 32/64-bit version of Solaris 8! */ +#define PRIdPTR "d" +typedef unsigned long long uint64_t; +#else +#include +#include +#endif /* OS_MINOR_VERSION == 8 */ +#else +#include +#include +#endif /* OS_MAJOR_VERSION == 5 */ +#else +#include +#include +#endif /* defined SUNOS */ #endif /* ifndef __STDINT_H */ diff --git a/tests/daemon/testd.c b/tests/daemon/testd.c index 4b380ef..92dfc35 100644 --- a/tests/daemon/testd.c +++ b/tests/daemon/testd.c @@ -46,7 +46,7 @@ static int read_config( const char *filename, struct gengetopt_args_info *args_i int main( int argc, char *argv[] ) { struct gengetopt_args_info args_info; - error_t error; + wolf_error_t error; daemon_params_t daemon_params; daemon_p demon = NULL; int sig = 0; @@ -94,16 +94,16 @@ int main( int argc, char *argv[] ) { exit( EXIT_FAILURE ); } - if( ( error = daemon_start( demon ) ) != OK ) { + if( ( error = daemon_start( demon ) ) != WOLF_OK ) { cmdline_parser_free( &args_info ); daemon_exit( demon ); } } else { - if( ( error = signal_initialize( ) ) != OK ) { + if( ( error = signal_initialize( ) ) != WOLF_OK ) { cmdline_parser_free( &args_info ); exit( EXIT_FAILURE ); } - if( ( error = signal_install_handlers_daemon( ) ) != OK ) { + if( ( error = signal_install_handlers_daemon( ) ) != WOLF_OK ) { signal_terminate( ); cmdline_parser_free( &args_info ); exit( EXIT_FAILURE ); -- cgit v1.2.3-54-g00ecf