This is an automated email from the ASF dual-hosted git repository.

sjanc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git

commit efd89f86186c688a6215d07a33256e0883de21aa
Author: Szymon Janc <[email protected]>
AuthorDate: Tue Oct 6 19:11:35 2026 +0200

    mgmt/mcumgr/log_mgmt: Remove OS abstraction layer
    
    mcumgr is now part of Mynewt core and there is no need for OS
    abstraction layer. Mynewt implementation is merged into log_mgmt.c and
    log_mgmt_impl_* functions are made static (log_mgmt_impl_clear is
    renamed to log_mgmt_flush_log as log_mgmt_clear is already used by
    command handler). log_mgmt_config.h is removed and syscfg values are
    used directly. Weak stubs and Mynewt port package are removed.
    
    Settings and package init are moved from port package to log_mgmt
    package.
    
    No functional changes.
    
    Assisted-by: Claude:claude-opus-5-5
---
 .../cmd/log_mgmt/include/log_mgmt/log_mgmt.h       |   7 +-
 .../log_mgmt/include/log_mgmt/log_mgmt_config.h    |  50 ----
 .../cmd/log_mgmt/include/log_mgmt/log_mgmt_impl.h  | 131 ---------
 mgmt/mcumgr/cmd/log_mgmt/pkg.yml                   |   4 +-
 mgmt/mcumgr/cmd/log_mgmt/port/mynewt/pkg.yml       |  31 ---
 .../cmd/log_mgmt/port/mynewt/src/mynewt_log_mgmt.c | 295 --------------------
 mgmt/mcumgr/cmd/log_mgmt/src/log_mgmt.c            | 305 +++++++++++++++++++--
 mgmt/mcumgr/cmd/log_mgmt/src/stubs.c               |  71 -----
 .../cmd/log_mgmt/{port/mynewt => }/syscfg.yml      |   0
 9 files changed, 295 insertions(+), 599 deletions(-)

diff --git a/mgmt/mcumgr/cmd/log_mgmt/include/log_mgmt/log_mgmt.h 
b/mgmt/mcumgr/cmd/log_mgmt/include/log_mgmt/log_mgmt.h
index 1494e6426..b4eef3eda 100644
--- a/mgmt/mcumgr/cmd/log_mgmt/include/log_mgmt/log_mgmt.h
+++ b/mgmt/mcumgr/cmd/log_mgmt/include/log_mgmt/log_mgmt.h
@@ -24,7 +24,7 @@
 extern "C" {
 #endif
 
-#include "log_mgmt_config.h"
+#include "syscfg/syscfg.h"
 
 /**
  * LOG MGMT specific error codes, 0 -> 6, 8 are same as mcumgr,
@@ -69,11 +69,14 @@ extern "C" {
 #define LOG_MGMT_ETYPE_CBOR     1
 #define LOG_MGMT_ETYPE_BINARY   2
 
+/* Length of image hash included in log entries */
+#define LOG_MGMT_IMG_HASHLEN    4
+
 /** @brief Generic descriptor for an OS-specific log. */
 struct log_mgmt_log {
     const char *name;
     int type;
-#if !LOG_MGMT_GLOBAL_IDX
+#if !MYNEWT_VAL(LOG_GLOBAL_IDX)
     uint32_t index;
 #endif
 };
diff --git a/mgmt/mcumgr/cmd/log_mgmt/include/log_mgmt/log_mgmt_config.h 
b/mgmt/mcumgr/cmd/log_mgmt/include/log_mgmt/log_mgmt_config.h
deleted file mode 100644
index 37d02f9ae..000000000
--- a/mgmt/mcumgr/cmd/log_mgmt/include/log_mgmt/log_mgmt_config.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#ifndef H_LOG_MGMT_CONFIG_
-#define H_LOG_MGMT_CONFIG_
-
-#if defined MYNEWT
-
-#include "syscfg/syscfg.h"
-
-#define LOG_MGMT_CHUNK_LEN MYNEWT_VAL(LOG_MGMT_CHUNK_LEN)
-#define LOG_MGMT_NAME_LEN   MYNEWT_VAL(LOG_MGMT_NAME_LEN)
-#define LOG_MGMT_MAX_RSP_LEN   MYNEWT_VAL(LOG_MGMT_MAX_RSP_LEN)
-#define LOG_MGMT_READ_WATERMARK_UPDATE MYNEWT_VAL(LOG_READ_WATERMARK_UPDATE)
-#define LOG_MGMT_GLOBAL_IDX MYNEWT_VAL(LOG_GLOBAL_IDX)
-#define LOG_MGMT_IMG_HASHLEN 4
-
-#elif defined __ZEPHYR__
-
-#define LOG_MGMT_CHUNK_LEN CONFIG_LOG_MGMT_CHUNK_LEN
-#define LOG_MGMT_NAME_LEN   CONFIG_LOG_MGMT_NAME_LEN
-#define LOG_MGMT_MAX_RSP_LEN   CONFIG_LOG_MGMT_MAX_RSP_LEN
-#define LOG_MGMT_READ_WATERMARK_UPDATE CONFIG_LOG_READ_WATERMARK_UPDATE
-#define LOG_MGMT_GLOBAL_IDX CONFIG_LOG_GLOBAL_IDX
-
-#else
-
-/* No direct support for this OS.  The application needs to define the above
- * settings itself.
- */
-
-#endif
-
-#endif
diff --git a/mgmt/mcumgr/cmd/log_mgmt/include/log_mgmt/log_mgmt_impl.h 
b/mgmt/mcumgr/cmd/log_mgmt/include/log_mgmt/log_mgmt_impl.h
deleted file mode 100644
index 81b65d343..000000000
--- a/mgmt/mcumgr/cmd/log_mgmt/include/log_mgmt/log_mgmt_impl.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/**
- * @file
- * @brief Declares implementation-specific functions required by log
- *        management.  The default stubs can be overridden with functions that
- *        are compatible with the host OS.
- */
-
-#ifndef H_LOG_MGMT_IMPL_
-#define H_LOG_MGMT_IMPL_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct log_mgmt_filter;
-struct log_mgmt_entry;
-struct log_mgmt_log;
-
-typedef int log_mgmt_foreach_entry_fn(struct log_mgmt_entry *entry,
-                                      void *arg);
-
-/**
- * @brief Retrieves the log at the specified index.
- *
- * @param idx                   The index of the log to retrieve.
- * @param out_name              On success, the requested log gets written
- *                                   here.
- *
- * @return                      0 on success;
- *                              MGMT_ERR_ENOENT if no log with the specified
- *                                  index exists;
- *                              Other MGMT_ERR_[...] code on failure.
- */
-int log_mgmt_impl_get_log(int idx, struct log_mgmt_log *out_log);
-
-/**
- * @brief Retrieves the name of log module at the specified index.
- *
- * @param idx                   The index of the log module to retrieve.
- * @param out_name              On success, the requested module's name gets
- *                                  written here.
- *
- * @return                      0 on success;
- *                              MGMT_ERR_ENOENT if no log module with the
- *                                  specified index exists;
- *                              Other MGMT_ERR_[...] code on failure.
- */
-int log_mgmt_impl_get_module(int idx, const char **out_module_name);
-
-/**
- * @brief Retrieves the name of log level at the specified index.
- *
- * @param idx                   The index of the log level to retrieve.
- * @param out_name              On success, the requested level's name gets
- *                                  written here.
- *
- * @return                      0 on success;
- *                              MGMT_ERR_ENOENT if no log level with the
- *                                  specified index exists;
- *                              Other MGMT_ERR_[...] code on failure.
- */
-int log_mgmt_impl_get_level(int idx, const char **out_level_name);
-
-/**
- * @brief Retrieves the index that the next log entry will use.
- *
- * @param out_idx               On success, the next index gets written here.
- *
- * @return                      0 on success; MGMT_ERR_[...] code on failure.
- */
-int log_mgmt_impl_get_next_idx(uint32_t *out_idx);
-
-/**
- * @brief Applies a function to every matching entry in the specified log.
- *
- * @param log_name              The name of the log to operate on.
- * @param filter                Specifies which log entries to operate on.
- * @param cb                    The callback to apply to each log entry.
- * @param arg                   An optional argument to pass to the callback.
- *
- * @return                      0 on success; MGMT_ERR_[...] code on failure.
- */
-int log_mgmt_impl_foreach_entry(const char *log_name,
-                                const struct log_mgmt_filter *filter,
-                                log_mgmt_foreach_entry_fn *cb,
-                                void *arg);
-
-/**
- * @brief Clear the log with the specified name.
- *
- * @param log_name              The name of the log to clear.
- *
- * @return                      0 on success; MGMT_ERR_[...] code on failure.
- */
-int log_mgmt_impl_clear(const char *log_name);
-
-/**
- * @brief set watermark for specified log index
- *
- * @param log                   Log pointer
- * @param index                 Log ndex
- *
- * @return                      0 on success, non-zero on failure
- */
-int
-log_mgmt_impl_set_watermark(const struct log_mgmt_log *log, int index);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/mgmt/mcumgr/cmd/log_mgmt/pkg.yml b/mgmt/mcumgr/cmd/log_mgmt/pkg.yml
index 71943ce24..2d0d357d0 100644
--- a/mgmt/mcumgr/cmd/log_mgmt/pkg.yml
+++ b/mgmt/mcumgr/cmd/log_mgmt/pkg.yml
@@ -26,5 +26,7 @@ pkg.keywords:
 pkg.deps:
     - '@apache-mynewt-core/kernel/os'
     - '@apache-mynewt-core/sys/log/full'
-    - '@apache-mynewt-core/mgmt/mcumgr/cmd/log_mgmt/port/mynewt'
     - '@apache-mynewt-core/mgmt/mcumgr/mgmt'
+
+pkg.init:
+    log_mgmt_module_init: 'MYNEWT_VAL(LOG_MGMT_SYSINIT_STAGE)'
diff --git a/mgmt/mcumgr/cmd/log_mgmt/port/mynewt/pkg.yml 
b/mgmt/mcumgr/cmd/log_mgmt/port/mynewt/pkg.yml
deleted file mode 100644
index 27912e8d4..000000000
--- a/mgmt/mcumgr/cmd/log_mgmt/port/mynewt/pkg.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-# 
-#  http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-pkg.name: mgmt/mcumgr/cmd/log_mgmt/port/mynewt
-pkg.description: 'Log management command handlers for mcumgr.'
-pkg.author: "Apache Mynewt <[email protected]>"
-pkg.homepage: "http://mynewt.apache.org/";
-pkg.keywords:
-
-pkg.deps:
-    - '@apache-mynewt-core/mgmt/mcumgr/cmd/log_mgmt'
-    - '@apache-mynewt-core/mgmt/mcumgr/mgmt'
-
-pkg.init:
-    log_mgmt_module_init: 'MYNEWT_VAL(LOG_MGMT_SYSINIT_STAGE)'
diff --git a/mgmt/mcumgr/cmd/log_mgmt/port/mynewt/src/mynewt_log_mgmt.c 
b/mgmt/mcumgr/cmd/log_mgmt/port/mynewt/src/mynewt_log_mgmt.c
deleted file mode 100644
index 587e9c36f..000000000
--- a/mgmt/mcumgr/cmd/log_mgmt/port/mynewt/src/mynewt_log_mgmt.c
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include "log/log.h"
-#include "mgmt/mgmt.h"
-#include "log_mgmt/log_mgmt.h"
-#include "log_mgmt/log_mgmt_impl.h"
-#include "log_mgmt/log_mgmt_config.h"
-
-struct mynewt_log_mgmt_walk_arg {
-    log_mgmt_foreach_entry_fn *cb;
-    uint8_t chunk[LOG_MGMT_CHUNK_LEN];
-    void *arg;
-};
-
-static struct log *
-mynewt_log_mgmt_find_log(const char *log_name)
-{
-    struct log *log;
-
-    log = NULL;
-    while (1) {
-        log = log_list_get_next(log);
-        if (log == NULL) {
-            return NULL;
-        }
-
-        if (strcmp(log->l_name, log_name) == 0) {
-            return log;
-        }
-    }
-}
-
-__attribute__((__unused__)) static int
-log_mgmt_mynewt_err_map(int mynewt_os_err)
-{
-    switch (mynewt_os_err) {
-        case OS_ENOENT:
-            /* no break */
-        case SYS_ENOENT:
-            return LOG_MGMT_ERR_ENOENT;
-        case OS_ENOMEM:
-            /* no break */
-        case SYS_ENOMEM:
-            return LOG_MGMT_ERR_ENOMEM;
-        case OS_OK:
-            return LOG_MGMT_ERR_EOK;
-        case OS_EINVAL:
-            /* no break */
-        case OS_INVALID_PARM:
-            /* no break */
-        case SYS_EINVAL:
-            return LOG_MGMT_ERR_EINVAL;
-        case SYS_ENOTSUP:
-            return LOG_MGMT_ERR_ENOTSUP;
-        default:
-            return LOG_MGMT_ERR_EUNKNOWN;
-    }
-}
-
-int
-log_mgmt_impl_set_watermark(const struct log_mgmt_log *log, int index)
-{
-#if MYNEWT_VAL(LOG_STORAGE_WATERMARK)
-    struct log *tmplog;
-
-    tmplog = mynewt_log_mgmt_find_log(log->name);
-    if (tmplog) {
-        return log_mgmt_mynewt_err_map(log_set_watermark(tmplog, index));
-    } else {
-        return LOG_MGMT_ERR_ENOENT;
-    }
-#else
-    return LOG_MGMT_ERR_ENOTSUP;
-#endif
-}
-
-int
-log_mgmt_impl_get_log(int idx, struct log_mgmt_log *out_log)
-{
-    struct log *log;
-    int i;
-
-    log = NULL;
-    for (i = 0; i <= idx; i++) {
-        log = log_list_get_next(log);
-        if (log == NULL) {
-            return LOG_MGMT_ERR_ENOENT;
-        }
-    }
-
-    out_log->name = log->l_name;
-    out_log->type = log->l_log->log_type;
-#if !MYNEWT_VAL(LOG_GLOBAL_IDX)
-    out_log->index = log->l_idx;
-#endif
-    return 0;
-}
-
-int
-log_mgmt_impl_get_module(int idx, const char **out_module_name)
-{
-    const char *name;
-
-    name = LOG_MODULE_STR(idx);
-    if (name == NULL) {
-        return LOG_MGMT_ERR_ENOENT;
-    } else {
-        *out_module_name = name;
-        return 0;
-    }
-}
-
-int
-log_mgmt_impl_get_level(int idx, const char **out_level_name)
-{
-    const char *name;
-
-    if (idx >= LOG_LEVEL_MAX) {
-        return LOG_MGMT_ERR_ENOENT;
-    }
-
-    name = LOG_LEVEL_STR(idx);
-    if (!strcmp(name, "UNKNOWN")) {
-        return LOG_MGMT_ERR_ENOENT;
-    } else {
-        *out_level_name = name;
-        return 0;
-    }
-}
-
-#if MYNEWT_VAL(LOG_GLOBAL_IDX)
-int
-log_mgmt_impl_get_next_idx(uint32_t *out_idx)
-{
-    *out_idx = g_log_info.li_next_index;
-    return 0;
-}
-#endif
-
-static int
-mynewt_log_mgmt_walk_cb(struct log *log, struct log_offset *log_offset,
-                        const struct log_entry_hdr *leh,
-                        const void *dptr, uint16_t len)
-{
-    struct mynewt_log_mgmt_walk_arg *mynewt_log_mgmt_walk_arg;
-    struct log_mgmt_entry entry;
-    uint16_t trailer_len = 0;
-    int read_len;
-    int offset;
-    int rc;
-
-    rc = 0;
-    mynewt_log_mgmt_walk_arg = log_offset->lo_arg;
-
-    (void)trailer_len;
-
-    /* If specified timestamp is nonzero, it is the primary criterion, and the
-     * specified index is the secondary criterion.  If specified timetsamp is
-     * zero, specified index is the only criterion.
-     *
-     * If specified timestamp == 0: encode entries whose index >=
-     *     specified index.
-     * Else: encode entries whose timestamp >= specified timestamp and whose
-     *      index >= specified index
-     */
-    if (log_offset->lo_ts == 0) {
-        if (log_offset->lo_index > leh->ue_index) {
-            return 0;
-        }
-    } else if (leh->ue_ts < log_offset->lo_ts   ||
-               (leh->ue_ts == log_offset->lo_ts &&
-                leh->ue_index < log_offset->lo_index)) {
-        return 0;
-    }
-
-#if MYNEWT_VAL(LOG_FLAGS_TRAILER)
-    trailer_len = log_read_trailer_len(log, dptr);
-    if (trailer_len) {
-        /* If trailer is present, so is the length of the trailer */
-        trailer_len += LOG_TRAILER_LEN_SIZE;
-    }
-
-    len -= trailer_len;
-#endif
-
-    entry.ts = leh->ue_ts;
-    entry.index = leh->ue_index;
-    entry.module = leh->ue_module;
-    entry.level = leh->ue_level;
-
-    entry.type = leh->ue_etype;
-    entry.flags = leh->ue_flags;
-    entry.imghash = (leh->ue_flags & LOG_FLAGS_IMG_HASH) ?
-        leh->ue_imghash : NULL;
-    entry.len = len;
-    entry.data = mynewt_log_mgmt_walk_arg->chunk;
-
-    for (offset = 0; offset < len; offset += LOG_MGMT_CHUNK_LEN) {
-        if (len - offset < LOG_MGMT_CHUNK_LEN) {
-            read_len = len - offset;
-        } else {
-            read_len = LOG_MGMT_CHUNK_LEN;
-        }
-        entry.offset = offset;
-        entry.chunklen = read_len;
-
-        rc = log_read_body(log, dptr, mynewt_log_mgmt_walk_arg->chunk, offset,
-                           read_len);
-        if (rc < 0) {
-            return LOG_MGMT_ERR_EUNKNOWN;
-        }
-        rc = mynewt_log_mgmt_walk_arg->cb(&entry, 
mynewt_log_mgmt_walk_arg->arg);
-        if (rc) {
-            break;
-        }
-    }
-
-    return rc;
-}
-
-int
-log_mgmt_impl_foreach_entry(const char *log_name,
-                            const struct log_mgmt_filter *filter,
-                            log_mgmt_foreach_entry_fn *cb, void *arg)
-{
-    struct mynewt_log_mgmt_walk_arg walk_arg;
-    struct log_offset offset = {};
-    struct log *log;
-
-    walk_arg = (struct mynewt_log_mgmt_walk_arg) {
-        .cb = cb,
-        .arg = arg,
-    };
-
-    log = mynewt_log_mgmt_find_log(log_name);
-    if (log == NULL) {
-        return LOG_MGMT_ERR_ENOENT;
-    }
-
-    if (strcmp(log->l_name, log_name) == 0) {
-        offset.lo_arg = &walk_arg;
-        offset.lo_ts = filter->min_timestamp;
-        offset.lo_index = filter->min_index;
-        offset.lo_data_len = 0;
-
-        return log_walk_body(log, mynewt_log_mgmt_walk_cb, &offset);
-    }
-
-    return LOG_MGMT_ERR_ENOENT;
-}
-
-int
-log_mgmt_impl_clear(const char *log_name)
-{
-    struct log *log;
-    int rc;
-
-    log = mynewt_log_mgmt_find_log(log_name);
-    if (log == NULL) {
-        return LOG_MGMT_ERR_ENOENT;
-    }
-
-    rc = log_flush(log);
-    if (rc != 0) {
-        return LOG_MGMT_ERR_EUNKNOWN;
-    }
-
-    return 0;
-}
-
-void
-log_mgmt_module_init(void)
-{
-    /* Ensure this function only gets called by sysinit. */
-    SYSINIT_ASSERT_ACTIVE();
-
-    log_mgmt_register_group();
-}
diff --git a/mgmt/mcumgr/cmd/log_mgmt/src/log_mgmt.c 
b/mgmt/mcumgr/cmd/log_mgmt/src/log_mgmt.c
index 4adcc4173..1850d3858 100644
--- a/mgmt/mcumgr/cmd/log_mgmt/src/log_mgmt.c
+++ b/mgmt/mcumgr/cmd/log_mgmt/src/log_mgmt.c
@@ -20,12 +20,11 @@
 #include <string.h>
 #include <stdio.h>
 
+#include "os/mynewt.h"
 #include "mgmt/mgmt.h"
 #include "cborattr/cborattr.h"
 #include "tinycbor/cbor_cnt_writer.h"
 #include "log_mgmt/log_mgmt.h"
-#include "log_mgmt/log_mgmt_impl.h"
-#include "log_mgmt/log_mgmt_config.h"
 #include "log/log.h"
 
 /* Log mgmt encoder context used for multiple calls of the
@@ -52,6 +51,267 @@ struct log_walk_ctxt {
     struct log_mgmt_enc_ctxt lmec;
 };
 
+typedef int log_mgmt_foreach_entry_fn(struct log_mgmt_entry *entry, void *arg);
+
+struct log_mgmt_walk_arg {
+    log_mgmt_foreach_entry_fn *cb;
+    uint8_t chunk[MYNEWT_VAL(LOG_MGMT_CHUNK_LEN)];
+    void *arg;
+};
+
+static struct log *
+log_mgmt_find_log(const char *log_name)
+{
+    struct log *log;
+
+    log = NULL;
+    while (1) {
+        log = log_list_get_next(log);
+        if (log == NULL) {
+            return NULL;
+        }
+
+        if (strcmp(log->l_name, log_name) == 0) {
+            return log;
+        }
+    }
+}
+
+__attribute__((__unused__)) static int
+log_mgmt_err_map(int mynewt_os_err)
+{
+    switch (mynewt_os_err) {
+    case OS_ENOENT:
+        /* no break */
+    case SYS_ENOENT:
+        return LOG_MGMT_ERR_ENOENT;
+    case OS_ENOMEM:
+        /* no break */
+    case SYS_ENOMEM:
+        return LOG_MGMT_ERR_ENOMEM;
+    case OS_OK:
+        return LOG_MGMT_ERR_EOK;
+    case OS_EINVAL:
+        /* no break */
+    case OS_INVALID_PARM:
+        /* no break */
+    case SYS_EINVAL:
+        return LOG_MGMT_ERR_EINVAL;
+    case SYS_ENOTSUP:
+        return LOG_MGMT_ERR_ENOTSUP;
+    default:
+        return LOG_MGMT_ERR_EUNKNOWN;
+    }
+}
+
+#if MYNEWT_VAL(LOG_READ_WATERMARK_UPDATE)
+static int
+log_mgmt_set_watermark(const struct log_mgmt_log *log, int index)
+{
+#if MYNEWT_VAL(LOG_STORAGE_WATERMARK)
+    struct log *tmplog;
+
+    tmplog = log_mgmt_find_log(log->name);
+    if (tmplog) {
+        return log_mgmt_err_map(log_set_watermark(tmplog, index));
+    } else {
+        return LOG_MGMT_ERR_ENOENT;
+    }
+#else
+    return LOG_MGMT_ERR_ENOTSUP;
+#endif
+}
+#endif
+
+static int
+log_mgmt_get_log(int idx, struct log_mgmt_log *out_log)
+{
+    struct log *log;
+    int i;
+
+    log = NULL;
+    for (i = 0; i <= idx; i++) {
+        log = log_list_get_next(log);
+        if (log == NULL) {
+            return LOG_MGMT_ERR_ENOENT;
+        }
+    }
+
+    out_log->name = log->l_name;
+    out_log->type = log->l_log->log_type;
+#if !MYNEWT_VAL(LOG_GLOBAL_IDX)
+    out_log->index = log->l_idx;
+#endif
+    return 0;
+}
+
+static int
+log_mgmt_get_module(int idx, const char **out_module_name)
+{
+    const char *name;
+
+    name = LOG_MODULE_STR(idx);
+    if (name == NULL) {
+        return LOG_MGMT_ERR_ENOENT;
+    } else {
+        *out_module_name = name;
+        return 0;
+    }
+}
+
+static int
+log_mgmt_get_level(int idx, const char **out_level_name)
+{
+    const char *name;
+
+    if (idx >= LOG_LEVEL_MAX) {
+        return LOG_MGMT_ERR_ENOENT;
+    }
+
+    name = LOG_LEVEL_STR(idx);
+    if (!strcmp(name, "UNKNOWN")) {
+        return LOG_MGMT_ERR_ENOENT;
+    } else {
+        *out_level_name = name;
+        return 0;
+    }
+}
+
+#if MYNEWT_VAL(LOG_GLOBAL_IDX)
+static int
+log_mgmt_get_next_idx(uint32_t *out_idx)
+{
+    *out_idx = g_log_info.li_next_index;
+    return 0;
+}
+#endif
+
+static int
+log_mgmt_walk_cb(struct log *log, struct log_offset *log_offset,
+                 const struct log_entry_hdr *leh, const void *dptr, uint16_t 
len)
+{
+    struct log_mgmt_walk_arg *log_mgmt_walk_arg;
+    struct log_mgmt_entry entry;
+    uint16_t trailer_len = 0;
+    int read_len;
+    int offset;
+    int rc;
+
+    rc = 0;
+    log_mgmt_walk_arg = log_offset->lo_arg;
+
+    (void)trailer_len;
+
+    /* If specified timestamp is nonzero, it is the primary criterion, and the
+     * specified index is the secondary criterion.  If specified timetsamp is
+     * zero, specified index is the only criterion.
+     *
+     * If specified timestamp == 0: encode entries whose index >=
+     *     specified index.
+     * Else: encode entries whose timestamp >= specified timestamp and whose
+     *      index >= specified index
+     */
+    if (log_offset->lo_ts == 0) {
+        if (log_offset->lo_index > leh->ue_index) {
+            return 0;
+        }
+    } else if (leh->ue_ts < log_offset->lo_ts ||
+               (leh->ue_ts == log_offset->lo_ts && leh->ue_index < 
log_offset->lo_index)) {
+        return 0;
+    }
+
+#if MYNEWT_VAL(LOG_FLAGS_TRAILER)
+    trailer_len = log_read_trailer_len(log, dptr);
+    if (trailer_len) {
+        /* If trailer is present, so is the length of the trailer */
+        trailer_len += LOG_TRAILER_LEN_SIZE;
+    }
+
+    len -= trailer_len;
+#endif
+
+    entry.ts = leh->ue_ts;
+    entry.index = leh->ue_index;
+    entry.module = leh->ue_module;
+    entry.level = leh->ue_level;
+
+    entry.type = leh->ue_etype;
+    entry.flags = leh->ue_flags;
+    entry.imghash = (leh->ue_flags & LOG_FLAGS_IMG_HASH) ? leh->ue_imghash : 
NULL;
+    entry.len = len;
+    entry.data = log_mgmt_walk_arg->chunk;
+
+    for (offset = 0; offset < len; offset += MYNEWT_VAL(LOG_MGMT_CHUNK_LEN)) {
+        if (len - offset < MYNEWT_VAL(LOG_MGMT_CHUNK_LEN)) {
+            read_len = len - offset;
+        } else {
+            read_len = MYNEWT_VAL(LOG_MGMT_CHUNK_LEN);
+        }
+        entry.offset = offset;
+        entry.chunklen = read_len;
+
+        rc = log_read_body(log, dptr, log_mgmt_walk_arg->chunk, offset, 
read_len);
+        if (rc < 0) {
+            return LOG_MGMT_ERR_EUNKNOWN;
+        }
+        rc = log_mgmt_walk_arg->cb(&entry, log_mgmt_walk_arg->arg);
+        if (rc) {
+            break;
+        }
+    }
+
+    return rc;
+}
+
+static int
+log_mgmt_foreach_entry(const char *log_name, const struct log_mgmt_filter 
*filter,
+                       log_mgmt_foreach_entry_fn *cb, void *arg)
+{
+    struct log_mgmt_walk_arg walk_arg;
+    struct log_offset offset = {};
+    struct log *log;
+
+    walk_arg = (struct log_mgmt_walk_arg){
+        .cb = cb,
+        .arg = arg,
+    };
+
+    log = log_mgmt_find_log(log_name);
+    if (log == NULL) {
+        return LOG_MGMT_ERR_ENOENT;
+    }
+
+    if (strcmp(log->l_name, log_name) == 0) {
+        offset.lo_arg = &walk_arg;
+        offset.lo_ts = filter->min_timestamp;
+        offset.lo_index = filter->min_index;
+        offset.lo_data_len = 0;
+
+        return log_walk_body(log, log_mgmt_walk_cb, &offset);
+    }
+
+    return LOG_MGMT_ERR_ENOENT;
+}
+
+static int
+log_mgmt_flush_log(const char *log_name)
+{
+    struct log *log;
+    int rc;
+
+    log = log_mgmt_find_log(log_name);
+    if (log == NULL) {
+        return LOG_MGMT_ERR_ENOENT;
+    }
+
+    rc = log_flush(log);
+    if (rc != 0) {
+        return LOG_MGMT_ERR_EUNKNOWN;
+    }
+
+    return 0;
+}
+
 static mgmt_handler_fn log_mgmt_show;
 static mgmt_handler_fn log_mgmt_clear;
 static mgmt_handler_fn log_mgmt_module_list;
@@ -217,14 +477,14 @@ log_mgmt_cb_encode(struct log_mgmt_entry *entry, void 
*arg)
          * is just a single entry we add the generic too long message text.
          */
         /* `+ 1` to account for the CBOR array terminator. */
-        if (ctxt->rsp_len + entry_len + 1 > LOG_MGMT_MAX_RSP_LEN) {
+        if (ctxt->rsp_len + entry_len + 1 > MYNEWT_VAL(LOG_MGMT_MAX_RSP_LEN)) {
             /*
              * Is this just a single entry? If so, encode the generic error
              * message in the "msg" field of the response
              */
             if (ctxt->counter == 0) {
                 entry->type = LOG_ETYPE_STRING;
-                snprintf((char *)entry->data, LOG_MGMT_CHUNK_LEN,
+                snprintf((char *)entry->data, MYNEWT_VAL(LOG_MGMT_CHUNK_LEN),
                          "error: entry too large (%zu bytes)", entry_len);
             }
 
@@ -269,7 +529,7 @@ log_encode_entries(const struct log_mgmt_log *log, 
CborEncoder *enc,
     err |= cbor_encoder_create_array(&cnt_encoder, &entries, 
CborIndefiniteLength);
     err |= cbor_encoder_close_container(&cnt_encoder, &entries);
     rsp_len = cbor_encode_bytes_written(enc) + 
cbor_encode_bytes_written(&cnt_encoder);
-    if (rsp_len > LOG_MGMT_MAX_RSP_LEN) {
+    if (rsp_len > MYNEWT_VAL(LOG_MGMT_MAX_RSP_LEN)) {
         /* No entries were processed, don't update watermark */
         return LOG_MGMT_ERR_EUNKNOWN;
     }
@@ -286,7 +546,7 @@ log_encode_entries(const struct log_mgmt_log *log, 
CborEncoder *enc,
         .rsp_len = cbor_encode_bytes_written(enc),
     };
 
-    rc = log_mgmt_impl_foreach_entry(log->name, &filter, log_mgmt_cb_encode, 
&ctxt);
+    rc = log_mgmt_foreach_entry(log->name, &filter, log_mgmt_cb_encode, &ctxt);
     if (rc < 0) {
         /*
          * If we receive negative error code from the walk function,
@@ -301,9 +561,9 @@ log_encode_entries(const struct log_mgmt_log *log, 
CborEncoder *enc,
         return LOG_MGMT_ERR_ENOMEM;
     }
 
-#if LOG_MGMT_READ_WATERMARK_UPDATE
+#if MYNEWT_VAL(LOG_READ_WATERMARK_UPDATE)
     if (!rc || rc == LOG_MGMT_ERR_EUNKNOWN) {
-        log_mgmt_impl_set_watermark(log, ctxt.last_enc_index);
+        log_mgmt_set_watermark(log, ctxt.last_enc_index);
     }
 #endif
     return rc;
@@ -345,7 +605,7 @@ log_encode(const struct log_mgmt_log *log, CborEncoder 
*ctxt,
 static int
 log_mgmt_show(struct mgmt_ctxt *ctxt)
 {
-    char name[LOG_MGMT_NAME_LEN];
+    char name[MYNEWT_VAL(LOG_MGMT_NAME_LEN)];
     struct log_mgmt_log log;
     CborEncoder logs;
     CborError err;
@@ -386,9 +646,9 @@ log_mgmt_show(struct mgmt_ctxt *ctxt)
     name_len = strlen(name);
 
     err = 0;
-#if LOG_MGMT_GLOBAL_IDX
+#if MYNEWT_VAL(LOG_GLOBAL_IDX)
     /* Determine the index that the next log entry would use. */
-    rc = log_mgmt_impl_get_next_idx(&next_idx);
+    rc = log_mgmt_get_next_idx(&next_idx);
     if (rc != 0) {
         return LOG_MGMT_ERR_EUNKNOWN;
     }
@@ -405,7 +665,7 @@ log_mgmt_show(struct mgmt_ctxt *ctxt)
 
     /* Iterate list of logs, encoding each that matches the client request. */
     for (log_idx = 0;; log_idx++) {
-        rc = log_mgmt_impl_get_log(log_idx, &log);
+        rc = log_mgmt_get_log(log_idx, &log);
         if (rc == LOG_MGMT_ERR_ENOENT) {
             /* Log list fully iterated. */
             if (name_len != 0) {
@@ -468,7 +728,7 @@ log_mgmt_module_list(struct mgmt_ctxt *ctxt)
     err |= cbor_encoder_create_map(&ctxt->encoder, &modules, 
CborIndefiniteLength);
 
     for (module = 0;; module++) {
-        rc = log_mgmt_impl_get_module(module, &module_name);
+        rc = log_mgmt_get_module(module, &module_name);
         if (rc == LOG_MGMT_ERR_ENOENT) {
             break;
         }
@@ -511,7 +771,7 @@ log_mgmt_logs_list(struct mgmt_ctxt *ctxt)
     err |= cbor_encoder_create_array(&ctxt->encoder, &log_list, 
CborIndefiniteLength);
 
     for (log_idx = 0;; log_idx++) {
-        rc = log_mgmt_impl_get_log(log_idx, &log);
+        rc = log_mgmt_get_log(log_idx, &log);
         if (rc == LOG_MGMT_ERR_ENOENT) {
             break;
         }
@@ -553,7 +813,7 @@ log_mgmt_level_list(struct mgmt_ctxt *ctxt)
     err |= cbor_encoder_create_map(&ctxt->encoder, &level_map, 
CborIndefiniteLength);
 
     for (level = 0;; level++) {
-        rc = log_mgmt_impl_get_level(level, &level_name);
+        rc = log_mgmt_get_level(level, &level_name);
         if (rc == LOG_MGMT_ERR_ENOENT) {
             break;
         }
@@ -584,7 +844,7 @@ static int
 log_mgmt_clear(struct mgmt_ctxt *ctxt)
 {
     struct log_mgmt_log log;
-    char name[LOG_MGMT_NAME_LEN] = { 0 };
+    char name[MYNEWT_VAL(LOG_MGMT_NAME_LEN)] = { 0 };
     int name_len;
     int log_idx;
     int rc;
@@ -605,7 +865,7 @@ log_mgmt_clear(struct mgmt_ctxt *ctxt)
     name_len = strlen(name);
 
     for (log_idx = 0;; log_idx++) {
-        rc = log_mgmt_impl_get_log(log_idx, &log);
+        rc = log_mgmt_get_log(log_idx, &log);
         if (rc == LOG_MGMT_ERR_ENOENT) {
             return 0;
         }
@@ -615,7 +875,7 @@ log_mgmt_clear(struct mgmt_ctxt *ctxt)
 
         if (log.type != LOG_MGMT_TYPE_STREAM) {
             if (name_len == 0 || strcmp(log.name, name) == 0) {
-                rc = log_mgmt_impl_clear(log.name);
+                rc = log_mgmt_flush_log(log.name);
                 if (rc != 0) {
                     return rc;
                 }
@@ -639,3 +899,12 @@ log_mgmt_register_group(void)
 {
     mgmt_register_group(&log_mgmt_group);
 }
+
+void
+log_mgmt_module_init(void)
+{
+    /* Ensure this function only gets called by sysinit. */
+    SYSINIT_ASSERT_ACTIVE();
+
+    log_mgmt_register_group();
+}
diff --git a/mgmt/mcumgr/cmd/log_mgmt/src/stubs.c 
b/mgmt/mcumgr/cmd/log_mgmt/src/stubs.c
deleted file mode 100644
index db1b5b7d9..000000000
--- a/mgmt/mcumgr/cmd/log_mgmt/src/stubs.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/**
- * These stubs get linked in when there is no equivalent OS-specific
- * implementation.
- */
-
-#include "mgmt/mgmt.h"
-#include "log_mgmt/log_mgmt_impl.h"
-
-int __attribute__((weak))
-log_mgmt_impl_get_log(int idx, struct log_mgmt_log *out_log)
-{
-    return MGMT_ERR_ENOTSUP;
-}
-
-int __attribute__((weak))
-log_mgmt_impl_get_module(int idx, const char **out_module_name)
-{
-    return MGMT_ERR_ENOTSUP;
-}
-
-int __attribute__((weak))
-log_mgmt_impl_get_level(int idx, const char **out_level_name)
-{
-    return MGMT_ERR_ENOTSUP;
-}
-
-int __attribute__((weak))
-log_mgmt_impl_get_next_idx(uint32_t *out_idx)
-{
-    return MGMT_ERR_ENOTSUP;
-}
-
-int __attribute__((weak))
-log_mgmt_impl_foreach_entry(const char *log_name,
-                            const struct log_mgmt_filter *filter,
-                            log_mgmt_foreach_entry_fn *cb,
-                            void *arg)
-{
-    return MGMT_ERR_ENOTSUP;
-}
-
-int __attribute__((weak))
-log_mgmt_impl_clear(const char *log_name)
-{
-    return MGMT_ERR_ENOTSUP;
-}
-
-int __attribute__((weak))
-log_mgmt_impl_set_watermark(const struct log_mgmt_log *log, int index)
-{
-    return MGMT_ERR_ENOTSUP;
-}
diff --git a/mgmt/mcumgr/cmd/log_mgmt/port/mynewt/syscfg.yml 
b/mgmt/mcumgr/cmd/log_mgmt/syscfg.yml
similarity index 100%
rename from mgmt/mcumgr/cmd/log_mgmt/port/mynewt/syscfg.yml
rename to mgmt/mcumgr/cmd/log_mgmt/syscfg.yml

Reply via email to