diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | hal_internal.h | 12 | ||||
-rw-r--r-- | logging.c | 82 |
3 files changed, 95 insertions, 1 deletions
@@ -97,7 +97,7 @@ endif # just "building this is harmless even if we don't use it." OBJ += errorstrings.o hash.o asn1.o ecdsa.o rsa.o xdr.o slip.o -OBJ += rpc_api.o rpc_hash.o uuid.o rpc_pkcs1.o crc32.o locks.o +OBJ += rpc_api.o rpc_hash.o uuid.o rpc_pkcs1.o crc32.o locks.o logging.o # Object files to build when we're on a platform with direct access # to our hardware (Verilog) cores. diff --git a/hal_internal.h b/hal_internal.h index 1822781..f17179c 100644 --- a/hal_internal.h +++ b/hal_internal.h @@ -99,6 +99,18 @@ extern void hal_ks_lock(void); extern void hal_ks_unlock(void); /* + * Logging. + */ + + +typedef enum { + HAL_LOG_DEBUG, HAL_LOG_INFO, HAL_LOG_WARN, HAL_LOG_ERROR, HAL_LOG_SILENT +} hal_log_level_t; + +extern void hal_log_set_level(const hal_log_level_t level); +extern void hal_log(const hal_log_level_t level, const char *format, ...); + +/* * Dispatch structures for RPC implementation. * * The breakdown of which functions go into which dispatch vectors is diff --git a/logging.c b/logging.c new file mode 100644 index 0000000..06ee371 --- /dev/null +++ b/logging.c @@ -0,0 +1,82 @@ +/* + * logging.c + * --------- + * Default (stdio-based) logging code for libhal. + * + * Copyright (c) 2017, NORDUnet A/S All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the NORDUnet nor the names of its contributors may + * be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <stdio.h> +#include <stdarg.h> + +#include "hal.h" +#include "hal_internal.h" + +/* + * Default stdio-based logging code. Specific environments may supply + * something more appropriate (eg, on the Alpha, we want to log to the + * management port). + * + * See lock.c for comments on GNU weak functions. + */ + +#ifndef ENABLE_WEAK_FUNCTIONS +#define ENABLE_WEAK_FUNCTIONS 0 +#endif + +#if ENABLE_WEAK_FUNCTIONS +#define WEAK_FUNCTION __attribute__((weak)) +#else +#define WEAK_FUNCTION +#endif + +static hal_log_level_t current_level; + +WEAK_FUNCTION void hal_log_set_level(const hal_log_level_t level) +{ + current_level = level; +} + +WEAK_FUNCTION void hal_log(const hal_log_level_t level, const char *format, ...) +{ + if (level < current_level) + return; + + va_list ap; + va_start(ap, format); + vfnprintf(stderr, format, ap); + va_end(ap); + fprintf(stderr, "\n"); +} + +/* + * Local variables: + * indent-tabs-mode: nil + * End: + */ |