Max has uploaded this change for review. ( https://gerrit.osmocom.org/12093


Change subject: Log: add stdout target
......................................................................

Log: add stdout target

This is useful for code testing internal library functions which allows
to automatically fail tests due to output mismatch.

As a side-effect this also simplifies #if-#else logic due to both
_stdout() and _stderr() now being simple wrappers around static
function.

No user-visible changes are introduced because stdout is ignored by vty
code to avoid messing up vty output.

Change-Id: Ia786361f5f687e43b27d87a45b4630bca58bcfe8
---
M include/osmocom/core/logging.h
M src/logging.c
M src/vty/logging_vty.c
3 files changed, 37 insertions(+), 7 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/93/12093/1

diff --git a/include/osmocom/core/logging.h b/include/osmocom/core/logging.h
index 295e5a8..4a835ff 100644
--- a/include/osmocom/core/logging.h
+++ b/include/osmocom/core/logging.h
@@ -218,6 +218,7 @@
        LOG_TGT_TYPE_SYSLOG,    /*!< syslog based logging */
        LOG_TGT_TYPE_FILE,      /*!< text file logging */
        LOG_TGT_TYPE_STDERR,    /*!< stderr logging */
+       LOG_TGT_TYPE_STDOUT,    /*!< stdout logging */
        LOG_TGT_TYPE_STRRB,     /*!< osmo_strrb-backed logging */
        LOG_TGT_TYPE_GSMTAP,    /*!< GSMTAP network logging */
 };
@@ -361,6 +362,7 @@
 struct log_target *log_target_create(void);
 void log_target_destroy(struct log_target *target);
 struct log_target *log_target_create_stderr(void);
+struct log_target *log_target_create_stdout(void);
 struct log_target *log_target_create_file(const char *fname);
 struct log_target *log_target_create_syslog(const char *ident, int option,
                                            int facility);
diff --git a/src/logging.c b/src/logging.c
index 908ba54..31345d1 100644
--- a/src/logging.c
+++ b/src/logging.c
@@ -810,24 +810,45 @@
        return target;
 }

-/*! Create the STDERR log target
- *  \returns dynamically-allocated \ref log_target for STDERR */
-struct log_target *log_target_create_stderr(void)
+static struct log_target *_log_target_create_std(FILE *out, enum 
log_target_type lt)
 {
-/* since C89/C99 says stderr is a macro, we can safely do this! */
-#if !EMBEDDED && defined(stderr)
+#if !EMBEDDED
        struct log_target *target;

        target = log_target_create();
        if (!target)
                return NULL;

-       target->type = LOG_TGT_TYPE_STDERR;
-       target->tgt_file.out = stderr;
+       target->type = lt;
+       target->tgt_file.out = out;
        target->output = _file_output;
        return target;
 #else
        return NULL;
+#endif
+}
+
+/*! Create the STDOUT log target
+ *  \returns dynamically-allocated \ref log_target for STDOUT */
+struct log_target *log_target_create_stdout(void)
+{
+/* since C89/C99 says stdout is a macro, we can safely do this! */
+#if defined(stdout)
+       return _log_target_create_std(stdout, LOG_TGT_TYPE_STDOUT);
+#else
+       return NULL;
+#endif /* stdout */
+}
+
+/*! Create the STDERR log target
+ *  \returns dynamically-allocated \ref log_target for STDERR */
+struct log_target *log_target_create_stderr(void)
+{
+/* since C89/C99 says stderr is a macro, we can safely do this! */
+#if defined(stderr)
+       return _log_target_create_std(stderr, LOG_TGT_TYPE_STDERR);
+#else
+       return NULL;
 #endif /* stderr */
 }

@@ -900,6 +921,10 @@
                /* don't close stderr */
                if (target->tgt_file.out != stderr)
 #endif
+#ifdef stdout
+               /* don't close stdout */
+               if (target->tgt_file.out != stdout)
+#endif
                {
                        fclose(target->tgt_file.out);
                        target->tgt_file.out = NULL;
diff --git a/src/vty/logging_vty.c b/src/vty/logging_vty.c
index f3e1419..e2d2b57 100644
--- a/src/vty/logging_vty.c
+++ b/src/vty/logging_vty.c
@@ -877,6 +877,9 @@
        case LOG_TGT_TYPE_STDERR:
                vty_out(vty, "log stderr%s", VTY_NEWLINE);
                break;
+       case LOG_TGT_TYPE_STDOUT:
+               /* we don't support vty logging to stdout to avoid messing up 
vty prompt and user input */
+               break;
        case LOG_TGT_TYPE_SYSLOG:
 #ifdef HAVE_SYSLOG_H
                vty_out(vty, "log syslog %s%s",

--
To view, visit https://gerrit.osmocom.org/12093
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia786361f5f687e43b27d87a45b4630bca58bcfe8
Gerrit-Change-Number: 12093
Gerrit-PatchSet: 1
Gerrit-Owner: Max <msur...@sysmocom.de>

Reply via email to