blob: d1e3ca33ca0ffba79d9ddc7c428221d7cd419b6d [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Config &mdash; Apache Mynewt latest documentation</title>
<link rel="shortcut icon" href="../../../_static/mynewt-logo-only-newt32x32.png"/>
<link rel="stylesheet" href="../../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/css/sphinx_theme.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/css/bootstrap-3.0.3.min.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/css/v2.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/css/custom.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/css/restructuredtext.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/css/overrides.css" type="text/css" />
<link rel="index" title="Index"
href="../../../genindex.html"/>
<link rel="search" title="Search" href="../../../search.html"/>
<link rel="top" title="Apache Mynewt latest documentation" href="../../../index.html"/>
<link rel="up" title="System Modules" href="../system_modules.html"/>
<link rel="next" title="Logging" href="../logs/logs.html"/>
<link rel="prev" title="System Modules" href="../system_modules.html"/>
<script src="../../../_static/js/modernizr.min.js"></script>
<script>
(function(i, s, o, g, r, a, m) {
i["GoogleAnalyticsObject"] = r;
(i[r] =
i[r] ||
function() {
(i[r].q = i[r].q || []).push(arguments);
}),
(i[r].l = 1 * new Date());
(a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]);
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m);
})(window, document, "script", "//www.google-analytics.com/analytics.js", "ga");
ga("create", "UA-72162311-1", "auto");
ga("send", "pageview");
</script>
</head>
<body class="not-front page-documentation" role="document" >
<div id="wrapper">
<div class="container">
<div id="banner" class="row v2-main-banner">
<a class="logo-cell" href="/">
<img class="logo" src="../../../_static/img/logo.png">
</a>
<div class="tagline-cell">
<h4 class="tagline">An OS to build, deploy and securely manage billions of devices</h4>
</div>
<div class="news-cell">
<div class="well">
<h4>Latest News:</h4> <a href="/download">Apache Mynewt 1.12.0, Apache NimBLE 1.7.0 </a> released April 4, 2024)
</div>
</div>
</div>
</div>
<header>
<nav id="navbar" class="navbar navbar-inverse" role="navigation">
<div class="container">
<!-- Collapsed navigation -->
<div class="navbar-header">
<!-- Expander button -->
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<!-- Expanded navigation -->
<div class="navbar-collapse collapse">
<!-- Main navigation -->
<ul class="nav navbar-nav navbar-right">
<li>
<a href="/"><i class="fa fa-home" style="font-size: larger;"></i></a>
</li>
<li class="important">
<a href="/quick-start/">Quick Start</a>
</li>
<li>
<a href="/about/">About</a>
</li>
<li>
<a href="/talks/">Talks</a>
</li>
<li class="active">
<a href="/documentation/">Documentation</a>
</li>
<li>
<a href="/download/">Download</a>
</li>
<li>
<a href="/community/">Community</a>
</li>
<li>
<a href="/events/">Events</a>
</li>
</ul>
<!-- Search, Navigation and Repo links -->
<ul class="nav navbar-nav navbar-right">
</ul>
</div>
</div>
</nav>
</header>
<!-- STARTS MAIN CONTENT -->
<div id="main-content">
<div id="breadcrumb">
<div class="container">
<a href="/documentation/">Docs</a> /
<a href="../../os_user_guide.html">OS User Guide</a> /
<a href="../system_modules.html">System Modules</a> /
Config
<div class="sourcelink">
<a href="https://github.com/apache/mynewt-core/edit/master/docs/os/modules/config/config.rst" class="icon icon-github"
rel="nofollow"> Edit on GitHub</a>
</div>
</div>
</div>
<!-- STARTS CONTAINER -->
<div class="container">
<!-- STARTS .content -->
<div id="content" class="row">
<!-- STARTS .container-sidebar -->
<div class="container-sidebar col-xs-12 col-sm-3">
<div id="docSidebar" class="sticky-container">
<div role="search" class="sphinx-search">
<form id="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
<input type="text" name="q" placeholder="Search documentation" class="search-documentation" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
<!-- Note: only works when deployed -->
<select class="form-control" onchange="if (this.value) window.location.href=this.value">
<option value="/latest" selected>
Version: latest
</option>
<option value="/v1_12_0" >
Version: 1.12.0
</option>
<option value="/v1_11_0" >
Version: 1.11.0
</option>
<option value="/v1_10_0" >
Version: 1.10.0
</option>
<option value="/v1_9_0" >
Version: 1.9.0
</option>
<option value="/v1_8_0" >
Version: 1.8.0
</option>
<option value="/v1_7_0" >
Version: 1.7.0
</option>
<option value="/v1_6_0" >
Version: 1.6.0
</option>
<option value="/v1_5_0" >
Version: 1.5.0
</option>
<option value="/v1_4_0" >
Version: 1.4.0
</option>
<option value="/v1_3_0/os/introduction" >
Version: 1.3.0
</option>
<option value="/v1_2_0/os/introduction" >
Version: 1.2.0
</option>
<option value="/v1_1_0/os/introduction" >
Version: 1.1.0
</option>
<option value="/v1_0_0/os/introduction" >
Version: 1.0.0
</option>
<option value="/v0_9_0/os/introduction" >
Version: 0.9.0
</option>
</select>
<div class="region region-sidebar">
<div class="docs-menu">
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../../index.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../get_started/index.html">Setup &amp; Get Started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../concepts.html">Concepts</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../tutorials/tutorials.html">Tutorials</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../external_links.html">Third-party Resources</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../../os_user_guide.html">OS User Guide</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../../core_os/mynewt_os.html">Kernel</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="../system_modules.html">System</a><ul class="current">
<li class="toctree-l3 current"><a class="current reference internal" href="#">Config</a></li>
<li class="toctree-l3"><a class="reference internal" href="../logs/logs.html">Logs</a></li>
<li class="toctree-l3"><a class="reference internal" href="../stats/stats.html">Statistics</a></li>
<li class="toctree-l3"><a class="reference internal" href="../console/console.html">Console</a></li>
<li class="toctree-l3"><a class="reference internal" href="../shell/shell.html">Shell</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../hal/hal.html">Hardware Abstraction</a></li>
<li class="toctree-l2"><a class="reference internal" href="../bootloader/bootloader.html">Secure Bootloader</a></li>
<li class="toctree-l2"><a class="reference internal" href="../split/split.html">Split Images</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../core_os/porting/port_os.html">Porting Guide</a></li>
<li class="toctree-l2"><a class="reference internal" href="../baselibc.html">Baselibc</a></li>
<li class="toctree-l2"><a class="reference internal" href="../drivers/driver.html">Drivers</a></li>
<li class="toctree-l2"><a class="reference internal" href="../devmgmt/newtmgr.html">Device Management with Newt Manager</a></li>
<li class="toctree-l2"><a class="reference internal" href="../mcumgr/mcumgr.html">Device Management with MCUmgr</a></li>
<li class="toctree-l2"><a class="reference internal" href="../imgmgr/imgmgr.html">Image Manager</a></li>
<li class="toctree-l2"><a class="reference internal" href="../sysinitconfig/sysinitconfig.html">Compile-Time Configuration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../sysinitdown/sysinitdown.html">System Initialization and Shutdown</a></li>
<li class="toctree-l2"><a class="reference internal" href="../extcmd/extcmd.html">Build-Time Hooks</a></li>
<li class="toctree-l2"><a class="reference internal" href="../fs/fs.html">File System</a></li>
<li class="toctree-l2"><a class="reference internal" href="../fcb/fcb.html">Flash Circular Buffer</a></li>
<li class="toctree-l2"><a class="reference internal" href="../sensor_framework/sensor_framework.html">Sensor Framework</a></li>
<li class="toctree-l2"><a class="reference internal" href="../testutil/testutil.html">Test Utilities</a></li>
<li class="toctree-l2"><a class="reference internal" href="../json/json.html">JSON</a></li>
<li class="toctree-l2"><a class="reference internal" href="../mfg/mfg.html">Manufacturing support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../bsp/index.html">Board support</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../../network/index.html">BLE User Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../newt/index.html">Newt Tool Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../newtmgr/index.html">Newt Manager Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../mynewt_faq/index.html">Mynewt FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../misc/index.html">Appendix</a></li>
</ul>
</div>
</div>
</div>
<!-- ENDS STICKY CONTAINER -->
</div>
<!-- ENDS .container-sidebar -->
<div class="col-xs-12 col-sm-9">
<div class="">
<div class="rst-content">
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="config">
<h1>Config<a class="headerlink" href="#config" title="Permalink to this headline"></a></h1>
<p>Config subsystem is meant for persisting per-device configuration
and runtime state for packages.</p>
<p>Configuration items are stored as key-value pairs, where both the key and
the value are expected to be strings. Keys are divided into component
elements, where packages register their subtree using the first element.
E.g key <code class="docutils literal notranslate"><span class="pre">id/serial</span></code> consists of 2 components, <code class="docutils literal notranslate"><span class="pre">id</span></code> and <code class="docutils literal notranslate"><span class="pre">serial</span></code>.
Package sys/id registered it’s subtree of configuration elements to be
under <code class="docutils literal notranslate"><span class="pre">id</span></code>.</p>
<p>There are convenience routines for converting value back and forth
from string.</p>
<div class="section" id="handlers">
<h2>Handlers<a class="headerlink" href="#handlers" title="Permalink to this headline"></a></h2>
<p>Config handlers for subtree implement a set of handler functions.
These are registered using a call to <code class="docutils literal notranslate"><span class="pre">conf_register()</span></code>.</p>
<ul class="simple">
<li><dl class="simple">
<dt>ch_get</dt><dd><p>This gets called when somebody asks for a config element value
by it’s name using <code class="docutils literal notranslate"><span class="pre">conf_get_value()</span></code>.</p>
</dd>
</dl>
</li>
<li><dl class="simple">
<dt>ch_set</dt><dd><p>This is called when value is being set using <code class="docutils literal notranslate"><span class="pre">conf_set_value()</span></code>, and
also when configuration is loaded from persisted storage with
<code class="docutils literal notranslate"><span class="pre">conf_load()</span></code>.</p>
</dd>
</dl>
</li>
<li><dl class="simple">
<dt>ch_commit</dt><dd><p>This gets called after configuration has been loaded in full.
Sometimes you don’t want individual configuration value to take
effect right away, for example if there are multiple settings
which are interdependent.</p>
</dd>
</dl>
</li>
<li><dl class="simple">
<dt>ch_export</dt><dd><p>This gets called to dump all current configuration. This happens
when <code class="docutils literal notranslate"><span class="pre">conf_save()</span></code> tries to save the settings, or when CLI is
dumping current system configuration to console.</p>
</dd>
</dl>
</li>
</ul>
</div>
<div class="section" id="persistence">
<h2>Persistence<a class="headerlink" href="#persistence" title="Permalink to this headline"></a></h2>
<p>Backend storage for the config can be either FCB, a file in filesystem,
or both.</p>
<p>You can declare multiple sources for configuration; settings from
all of these are restored when <code class="docutils literal notranslate"><span class="pre">conf_load()</span></code> is called.</p>
<p>There can be only one target for writing configuration; this is where
data is stored when you call <code class="docutils literal notranslate"><span class="pre">conf_save()</span></code>, or conf_save_one().</p>
<p>FCB read target is registered using <code class="docutils literal notranslate"><span class="pre">conf_fcb_src()</span></code>, and write target
using <code class="docutils literal notranslate"><span class="pre">conf_fcb_dst()</span></code>. <code class="docutils literal notranslate"><span class="pre">conf_fcb_src()</span></code> as side-effect initializes the
FCB area, so it must be called when calling <code class="docutils literal notranslate"><span class="pre">conf_fcb_dst()</span></code>.
File read target is registered using <code class="docutils literal notranslate"><span class="pre">conf_file_src()</span></code>, and write target
<code class="docutils literal notranslate"><span class="pre">conf_file_dst()</span></code>.</p>
<p>Convenience initialization of one config area can be enabled by
setting either syscfg variable CONFIG_FCB or CONFIG_NFFS. These
use other syscfg variables to figure which flash_map entry of BSP
defines flash area, or which file to use. Check the syscfg.yml in
sys/config package for more detailed description.</p>
</div>
<div class="section" id="cli">
<h2>CLI<a class="headerlink" href="#cli" title="Permalink to this headline"></a></h2>
<p>This can be enabled when shell package is enabled by setting syscfg
variable CONFIG_CLI to 1.</p>
<p>Here you can set config variables, inspect their values and print
both saved configuration as well as running configuration.</p>
<ul class="simple">
<li><dl class="simple">
<dt>config dump</dt><dd><p>Dump the current running configuration</p>
</dd>
</dl>
</li>
<li><dl class="simple">
<dt>config dump saved</dt><dd><p>Dump the saved configuration. The values are printed in the ordered
they’re restored.</p>
</dd>
</dl>
</li>
<li><dl class="simple">
<dt>config &lt;key&gt;</dt><dd><p>Print the value of config variable identified by &lt;key&gt;</p>
</dd>
</dl>
</li>
<li><dl class="simple">
<dt>config &lt;key&gt; &lt;value&gt;</dt><dd><p>Set the value of config variable &lt;key&gt; to be &lt;value&gt;</p>
</dd>
</dl>
</li>
</ul>
</div>
<div class="section" id="example-device-configuration">
<h2>Example: Device Configuration<a class="headerlink" href="#example-device-configuration" title="Permalink to this headline"></a></h2>
<p>This is a simple example, config handler only implements <code class="docutils literal notranslate"><span class="pre">ch_set</span></code> and
<code class="docutils literal notranslate"><span class="pre">ch_export</span></code>. <code class="docutils literal notranslate"><span class="pre">ch_set</span></code> is called when value is restored from storage (or
when set initially), and <code class="docutils literal notranslate"><span class="pre">ch_export</span></code> is used to write the value to
storage (or dump to console).</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">static</span><span class="w"> </span><span class="n">int8</span><span class="w"> </span><span class="n">foo_val</span><span class="p">;</span>
<span class="k">struct</span><span class="w"> </span><span class="nc">conf_handler</span><span class="w"> </span><span class="n">my_conf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="p">.</span><span class="n">ch_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;foo&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="p">.</span><span class="n">ch_set</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">foo_conf_set</span><span class="p">,</span>
<span class="w"> </span><span class="p">.</span><span class="n">ch_export</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">foo_conf_export</span>
<span class="p">}</span>
<span class="k">static</span><span class="w"> </span><span class="kt">int</span>
<span class="n">foo_conf_set</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">argc</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">**</span><span class="n">argv</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">val</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">argc</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">strcmp</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="s">&quot;bar&quot;</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">CONF_VALUE_SET</span><span class="p">(</span><span class="n">val</span><span class="p">,</span><span class="w"> </span><span class="n">CONF_INT8</span><span class="p">,</span><span class="w"> </span><span class="n">foo_val</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">OS_ENOENT</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">static</span><span class="w"> </span><span class="kt">int</span>
<span class="n">foo_conf_export</span><span class="p">(</span><span class="kt">void</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">func</span><span class="p">)(</span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">name</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">val</span><span class="p">),</span><span class="w"> </span><span class="k">enum</span><span class="w"> </span><span class="n">conf_export_tgt</span><span class="w"> </span><span class="n">tgt</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="n">buf</span><span class="p">[</span><span class="mi">4</span><span class="p">];</span>
<span class="w"> </span><span class="n">conf_str_from_value</span><span class="p">(</span><span class="n">CONF_INT8</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">foo_val</span><span class="p">,</span><span class="w"> </span><span class="n">buf</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">buf</span><span class="p">));</span>
<span class="w"> </span><span class="n">func</span><span class="p">(</span><span class="s">&quot;foo/bar&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">buf</span><span class="p">)</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
<div class="section" id="example-persist-runtime-state">
<h2>Example: Persist Runtime State<a class="headerlink" href="#example-persist-runtime-state" title="Permalink to this headline"></a></h2>
<p>This is a simple example showing how to persist runtime state. Here
there is only <code class="docutils literal notranslate"><span class="pre">ch_set</span></code> defined, which is used when restoring value from
persisted storage.</p>
<p>There’s a os_callout function which increments foo_val, and then
persists the latest number. When system restarts, and calls <code class="docutils literal notranslate"><span class="pre">conf_load()</span></code>,
foo_val will continue counting up from where it was before restart.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">static</span><span class="w"> </span><span class="n">int8</span><span class="w"> </span><span class="n">foo_val</span><span class="p">;</span>
<span class="k">struct</span><span class="w"> </span><span class="nc">conf_handler</span><span class="w"> </span><span class="n">my_conf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="p">.</span><span class="n">ch_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;foo&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="p">.</span><span class="n">ch_set</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">foo_conf_set</span>
<span class="p">}</span>
<span class="k">static</span><span class="w"> </span><span class="kt">int</span>
<span class="n">foo_conf_set</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">argc</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">**</span><span class="n">argv</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">val</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">argc</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">strcmp</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="s">&quot;bar&quot;</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">CONF_VALUE_SET</span><span class="p">(</span><span class="n">val</span><span class="p">,</span><span class="w"> </span><span class="n">CONF_INT8</span><span class="p">,</span><span class="w"> </span><span class="n">foo_val</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">OS_ENOENT</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">static</span><span class="w"> </span><span class="kt">void</span>
<span class="n">foo_callout</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">os_event</span><span class="w"> </span><span class="o">*</span><span class="n">ev</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">os_callout</span><span class="w"> </span><span class="o">*</span><span class="n">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">os_callout</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="n">ev</span><span class="p">;</span>
<span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="n">buf</span><span class="p">[</span><span class="mi">4</span><span class="p">];</span>
<span class="w"> </span><span class="n">foo_val</span><span class="o">++</span><span class="p">;</span>
<span class="w"> </span><span class="n">conf_str_from_value</span><span class="p">(</span><span class="n">CONF_INT8</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">foo_val</span><span class="p">,</span><span class="w"> </span><span class="n">buf</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">buf</span><span class="p">));</span>
<span class="w"> </span><span class="n">conf_save_one</span><span class="p">(</span><span class="s">&quot;foo/bar&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">bar</span><span class="p">);</span>
<span class="w"> </span><span class="n">callout_reset</span><span class="p">(</span><span class="n">c</span><span class="p">,</span><span class="w"> </span><span class="n">OS_TICKS_PER_SEC</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">120</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</div>
<div class="section" id="api">
<h3>API<a class="headerlink" href="#api" title="Permalink to this headline"></a></h3>
<dl class="c enum">
<dt id="c.conf_type">
<span class="target" id="group___sys_config_1gadaa57f7be62fb82725711436838525fb"></span><em class="property"><span class="pre">enum</span> </em><code class="sig-name descname"><span class="pre">conf_type</span></code><a class="headerlink" href="#c.conf_type" title="Permalink to this definition"></a><br /></dt>
<dd><p>Type of configuration value. </p>
<p><em>Values:</em></p>
</dd></dl>
<dl class="c enum">
<dt id="c.conf_export_tgt">
<span class="target" id="group___sys_config_1ga15704e06649f43f84b77a132135b06b4"></span><em class="property"><span class="pre">enum</span> </em><code class="sig-name descname"><span class="pre">conf_export_tgt</span></code><a class="headerlink" href="#c.conf_export_tgt" title="Permalink to this definition"></a><br /></dt>
<dd><p>Parameter to commit handler describing where data is going to. </p>
<p><em>Values:</em></p>
<dl class="c enumerator">
<dt id="c.conf_export_tgt.CONF_EXPORT_PERSIST">
<span class="target" id="group___sys_config_1gga15704e06649f43f84b77a132135b06b4a072d4d507c5eedded69e65fcb7e15e29"></span><em class="property"><span class="pre">enumerator</span> </em><code class="sig-name descname"><span class="pre">CONF_EXPORT_PERSIST</span></code><a class="headerlink" href="#c.conf_export_tgt.CONF_EXPORT_PERSIST" title="Permalink to this definition"></a><br /></dt>
<dd><p>Value is to be persisted. </p>
</dd></dl>
<dl class="c enumerator">
<dt id="c.conf_export_tgt.CONF_EXPORT_SHOW">
<span class="target" id="group___sys_config_1gga15704e06649f43f84b77a132135b06b4a9de243286fbb6af8898b33c46f60aef3"></span><em class="property"><span class="pre">enumerator</span> </em><code class="sig-name descname"><span class="pre">CONF_EXPORT_SHOW</span></code><a class="headerlink" href="#c.conf_export_tgt.CONF_EXPORT_SHOW" title="Permalink to this definition"></a><br /></dt>
<dd><p>Value is to be display. </p>
</dd></dl>
</dd></dl>
<dl class="c type">
<dt id="c.conf_export_tgt_t">
<span class="target" id="group___sys_config_1ga3139953d688ce6e67e5bf294254a717e"></span><em class="property"><span class="pre">typedef</span> </em><em class="property"><span class="pre">enum</span></em> <a class="reference internal" href="#c.conf_export_tgt" title="conf_export_tgt"><span class="pre">conf_export_tgt</span></a> <code class="sig-name descname"><span class="pre">conf_export_tgt_t</span></code><a class="headerlink" href="#c.conf_export_tgt_t" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c type">
<dt id="c.conf_get_handler_t">
<span class="target" id="group___sys_config_1ga7972bd63f95c6bed4e8fea7bc491883d"></span><em class="property"><span class="pre">typedef</span> </em><span class="pre">char</span> <span class="pre">*</span><span class="pre">(</span><span class="pre">*</span><code class="sig-name descname"><span class="pre">conf_get_handler_t</span></code><span class="pre">)</span><span class="sig-paren">(</span><span class="pre">int</span> <span class="pre">argc</span>, <span class="pre">char</span> <span class="pre">*</span><span class="pre">*</span><span class="pre">argv</span>, <span class="pre">char</span> <span class="pre">*</span><span class="pre">val</span>, <span class="pre">int</span> <span class="pre">val_len_max</span><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_get_handler_t" title="Permalink to this definition"></a><br /></dt>
<dd><p>Handler for getting configuration items, this handler is called per-configuration section. </p>
<p>Configuration sections are delimited by ‘/’, for example:</p>
<p><ul class="simple">
<li><p>section/name/value</p></li>
</ul>
</p>
<p>Would be passed as:</p>
<p><ul class="simple">
<li><p>argc = 3</p></li>
<li><p>argv[0] = section</p></li>
<li><p>argv[1] = name</p></li>
<li><p>argv[2] = value</p></li>
</ul>
</p>
<p>The handler returns the value into val, null terminated, up to val_len_max.</p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>A pointer to val or NULL if error. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">argc</span></code>: The number of sections in the configuration variable </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">argv</span></code>: The array of configuration sections </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">val</span></code>: A pointer to the buffer to return the configuration value into. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">val_len_max</span></code>: The maximum length of the val buffer to copy into.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c type">
<dt id="c.conf_get_handler_ext_t">
<span class="target" id="group___sys_config_1ga65bfc5b8a0356c9ce64f00ceeacfb488"></span><em class="property"><span class="pre">typedef</span> </em><span class="pre">char</span> <span class="pre">*</span><span class="pre">(</span><span class="pre">*</span><code class="sig-name descname"><span class="pre">conf_get_handler_ext_t</span></code><span class="pre">)</span><span class="sig-paren">(</span><span class="pre">int</span> <span class="pre">argc</span>, <span class="pre">char</span> <span class="pre">*</span><span class="pre">*</span><span class="pre">argv</span>, <span class="pre">char</span> <span class="pre">*</span><span class="pre">val</span>, <span class="pre">int</span> <span class="pre">val_len_max</span>, <span class="pre">void</span> <span class="pre">*</span><span class="pre">arg</span><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_get_handler_ext_t" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c type">
<dt id="c.conf_set_handler_t">
<span class="target" id="group___sys_config_1ga17c92dca2b6152bc1fdb72352b6a39d6"></span><em class="property"><span class="pre">typedef</span> </em><span class="pre">int</span> <span class="pre">(</span><span class="pre">*</span><code class="sig-name descname"><span class="pre">conf_set_handler_t</span></code><span class="pre">)</span><span class="sig-paren">(</span><span class="pre">int</span> <span class="pre">argc</span>, <span class="pre">char</span> <span class="pre">*</span><span class="pre">*</span><span class="pre">argv</span>, <span class="pre">char</span> <span class="pre">*</span><span class="pre">val</span><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_set_handler_t" title="Permalink to this definition"></a><br /></dt>
<dd><p>Set the configuration variable pointed to by argc and argv. </p>
<p>See description of ch_get_handler_t for format of these variables. This sets the configuration variable to the shadow value, but does not apply the configuration change. In order to apply the change, call the ch_commit() handler.</p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success, non-zero error code on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">argc</span></code>: The number of sections in the configuration variable. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">argv</span></code>: The array of configuration sections </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">val</span></code>: The value to configure that variable to</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c type">
<dt id="c.conf_set_handler_ext_t">
<span class="target" id="group___sys_config_1ga28f4e2c355d23818613387306670828c"></span><em class="property"><span class="pre">typedef</span> </em><span class="pre">int</span> <span class="pre">(</span><span class="pre">*</span><code class="sig-name descname"><span class="pre">conf_set_handler_ext_t</span></code><span class="pre">)</span><span class="sig-paren">(</span><span class="pre">int</span> <span class="pre">argc</span>, <span class="pre">char</span> <span class="pre">*</span><span class="pre">*</span><span class="pre">argv</span>, <span class="pre">char</span> <span class="pre">*</span><span class="pre">val</span>, <span class="pre">void</span> <span class="pre">*</span><span class="pre">arg</span><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_set_handler_ext_t" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c type">
<dt id="c.conf_commit_handler_t">
<span class="target" id="group___sys_config_1ga1f131dd7f98b14eca5645021c5495d1c"></span><em class="property"><span class="pre">typedef</span> </em><span class="pre">int</span> <span class="pre">(</span><span class="pre">*</span><code class="sig-name descname"><span class="pre">conf_commit_handler_t</span></code><span class="pre">)</span><span class="sig-paren">(</span><span class="pre">void</span><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_commit_handler_t" title="Permalink to this definition"></a><br /></dt>
<dd><p>Commit shadow configuration state to the active configuration. </p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success, non-zero error code on failure. </p>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c type">
<dt id="c.conf_commit_handler_ext_t">
<span class="target" id="group___sys_config_1gae6b1d1084ce4abfa0e9e547b5505e93b"></span><em class="property"><span class="pre">typedef</span> </em><span class="pre">int</span> <span class="pre">(</span><span class="pre">*</span><code class="sig-name descname"><span class="pre">conf_commit_handler_ext_t</span></code><span class="pre">)</span><span class="sig-paren">(</span><span class="pre">void</span> <span class="pre">*</span><span class="pre">arg</span><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_commit_handler_ext_t" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c type">
<dt id="c.conf_export_func_t">
<span class="target" id="group___sys_config_1ga865b6196a4967a677093acab1c30cd9c"></span><em class="property"><span class="pre">typedef</span> </em><span class="pre">void</span> <span class="pre">(</span><span class="pre">*</span><code class="sig-name descname"><span class="pre">conf_export_func_t</span></code><span class="pre">)</span><span class="sig-paren">(</span><span class="pre">char</span> <span class="pre">*</span><span class="pre">name</span>, <span class="pre">char</span> <span class="pre">*</span><span class="pre">val</span><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_export_func_t" title="Permalink to this definition"></a><br /></dt>
<dd><p>Called per-configuration variable being exported. </p>
<p><dl class="simple">
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">name</span></code>: The name of the variable to export </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">val</span></code>: The value of the variable to export </p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c type">
<dt id="c.conf_export_handler_t">
<span class="target" id="group___sys_config_1ga1f4844e6263870c3ba17fc505928907a"></span><em class="property"><span class="pre">typedef</span> </em><span class="pre">int</span> <span class="pre">(</span><span class="pre">*</span><code class="sig-name descname"><span class="pre">conf_export_handler_t</span></code><span class="pre">)</span><span class="sig-paren">(</span><a class="reference internal" href="#c.conf_export_func_t" title="conf_export_func_t"><span class="pre">conf_export_func_t</span></a> <span class="pre">export_func</span>, <a class="reference internal" href="#c.conf_export_tgt_t" title="conf_export_tgt_t"><span class="pre">conf_export_tgt_t</span></a> <span class="pre">tgt</span><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_export_handler_t" title="Permalink to this definition"></a><br /></dt>
<dd><p>Export all of the configuration variables, calling the export_func per variable being exported. </p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success, non-zero error code on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">export_func</span></code>: The export function to call. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">tgt</span></code>: The target of the export, either for persistence or display.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c type">
<dt id="c.conf_export_handler_ext_t">
<span class="target" id="group___sys_config_1gafdd07789cf8b5686ec447179d731ea80"></span><em class="property"><span class="pre">typedef</span> </em><span class="pre">int</span> <span class="pre">(</span><span class="pre">*</span><code class="sig-name descname"><span class="pre">conf_export_handler_ext_t</span></code><span class="pre">)</span><span class="sig-paren">(</span><a class="reference internal" href="#c.conf_export_func_t" title="conf_export_func_t"><span class="pre">conf_export_func_t</span></a> <span class="pre">export_func</span>, <a class="reference internal" href="#c.conf_export_tgt_t" title="conf_export_tgt_t"><span class="pre">conf_export_tgt_t</span></a> <span class="pre">tgt</span>, <span class="pre">void</span> <span class="pre">*</span><span class="pre">arg</span><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_export_handler_ext_t" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c type">
<dt id="c.conf_store_load_cb">
<span class="target" id="group___sys_config_1gad4deb6f6d582e89c74f3c5acb72656b3"></span><em class="property"><span class="pre">typedef</span> </em><span class="pre">void</span> <span class="pre">(</span><span class="pre">*</span><code class="sig-name descname"><span class="pre">conf_store_load_cb</span></code><span class="pre">)</span><span class="sig-paren">(</span><span class="pre">char</span> <span class="pre">*</span><span class="pre">name</span>, <span class="pre">char</span> <span class="pre">*</span><span class="pre">val</span>, <span class="pre">void</span> <span class="pre">*</span><span class="pre">cb_arg</span><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_store_load_cb" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.conf_init">
<span class="target" id="group___sys_config_1ga52d24de486941818e4a754fcdf0caf89"></span><span class="pre">void</span> <code class="sig-name descname"><span class="pre">conf_init</span></code><span class="sig-paren">(</span><span class="pre">void</span><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_init" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.conf_store_init">
<span class="target" id="group___sys_config_1gaf1daa987dacc4151f4e23ed0a026a840"></span><span class="pre">void</span> <code class="sig-name descname"><span class="pre">conf_store_init</span></code><span class="sig-paren">(</span><span class="pre">void</span><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_store_init" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.conf_register">
<span class="target" id="group___sys_config_1ga466993e72af044cf7bc40385c89e871b"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">conf_register</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.conf_handler" title="conf_handler"><span class="pre">conf_handler</span></a> <span class="pre">*</span><em><span class="pre">cf</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_register" title="Permalink to this definition"></a><br /></dt>
<dd><p>Register a handler for configurations items. </p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success, non-zero on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">cf</span></code>: Structure containing registration info.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.conf_load">
<span class="target" id="group___sys_config_1gacf73e033ff513cc8097d4cb43612997f"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">conf_load</span></code><span class="sig-paren">(</span><span class="pre">void</span><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_load" title="Permalink to this definition"></a><br /></dt>
<dd><p>Load configuration from registered persistence sources. </p>
<p>Handlers for configuration subtrees registered earlier will be called for encountered values.</p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success, non-zero on failure. </p>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.conf_load_one">
<span class="target" id="group___sys_config_1ga950145c930b2d43a40d374970322abe3"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">conf_load_one</span></code><span class="sig-paren">(</span><span class="pre">char</span> <span class="pre">*</span><em><span class="pre">name</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_load_one" title="Permalink to this definition"></a><br /></dt>
<dd><p>Load configuration from a specific registered persistence source. </p>
<p>Handlers will be called for configuration subtree for encountered values.</p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success, non-zero on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">name</span></code>: of the configuration subtree. </p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.conf_ensure_loaded">
<span class="target" id="group___sys_config_1ga93ced8f3e2027102b6779748cc83fe27"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">conf_ensure_loaded</span></code><span class="sig-paren">(</span><span class="pre">void</span><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_ensure_loaded" title="Permalink to this definition"></a><br /></dt>
<dd><p>Loads the configuration if it hasn’t been loaded since reboot. </p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success, non-zero on failure. </p>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.conf_set_from_storage">
<span class="target" id="group___sys_config_1gaa1850e76a42811c56663d5879880073d"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">conf_set_from_storage</span></code><span class="sig-paren">(</span><span class="pre">void</span><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_set_from_storage" title="Permalink to this definition"></a><br /></dt>
<dd><p>Config setting comes as a result of <a class="reference internal" href="#group___sys_config_1gacf73e033ff513cc8097d4cb43612997f"><span class="std std-ref">conf_load()</span></a>. </p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>1 if yes, 0 if not. </p>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.conf_save">
<span class="target" id="group___sys_config_1gaea200fb1a87284e617f19dd07693fc02"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">conf_save</span></code><span class="sig-paren">(</span><span class="pre">void</span><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_save" title="Permalink to this definition"></a><br /></dt>
<dd><p>Save currently running configuration. </p>
<p>All configuration which is different from currently persisted values will be saved.</p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success, non-zero on failure. </p>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.conf_save_tree">
<span class="target" id="group___sys_config_1gaca7e9b95fc76cd55f9ed725de2bd6b32"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">conf_save_tree</span></code><span class="sig-paren">(</span><span class="pre">char</span> <span class="pre">*</span><em><span class="pre">name</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_save_tree" title="Permalink to this definition"></a><br /></dt>
<dd><p>Save currently running configuration for configuration subtree. </p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success, non-zero on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">name</span></code>: Name of the configuration subtree.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.conf_save_one">
<span class="target" id="group___sys_config_1ga83e07b7401ab7d18bb53f5c949e54520"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">conf_save_one</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">const</span></em> <span class="pre">char</span> <span class="pre">*</span><em><span class="pre">name</span></em>, <span class="pre">char</span> <span class="pre">*</span><em><span class="pre">var</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_save_one" title="Permalink to this definition"></a><br /></dt>
<dd><p>Write a single configuration value to persisted storage (if it has changed value). </p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success, non-zero on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">name</span></code>: Name/key of the configuration item. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">var</span></code>: Value of the configuration item.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.conf_set_value">
<span class="target" id="group___sys_config_1ga19bea2a80aae229bdcf329d06220546d"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">conf_set_value</span></code><span class="sig-paren">(</span><span class="pre">char</span> <span class="pre">*</span><em><span class="pre">name</span></em>, <span class="pre">char</span> <span class="pre">*</span><em><span class="pre">val_str</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_set_value" title="Permalink to this definition"></a><br /></dt>
<dd><p>Set configuration item identified by <code class="docutils literal notranslate"><span class="pre">name</span></code> to be value <code class="docutils literal notranslate"><span class="pre">val_str</span></code>. </p>
<p>This finds the configuration handler for this subtree and calls it’s set handler.</p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success, non-zero on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">name</span></code>: Name/key of the configuration item. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">val_str</span></code>: Value of the configuration item.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.conf_get_value">
<span class="target" id="group___sys_config_1ga328b57ed20a40480601aae1133118825"></span><span class="pre">char</span> <span class="pre">*</span><code class="sig-name descname"><span class="pre">conf_get_value</span></code><span class="sig-paren">(</span><span class="pre">char</span> <span class="pre">*</span><em><span class="pre">name</span></em>, <span class="pre">char</span> <span class="pre">*</span><em><span class="pre">buf</span></em>, <span class="pre">int</span> <em><span class="pre">buf_len</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_get_value" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get value of configuration item identified by <code class="docutils literal notranslate"><span class="pre">name</span></code>. </p>
<p>This calls the configuration handler ch_get for the subtree.</p>
<p>Configuration handler can copy the string to <code class="docutils literal notranslate"><span class="pre">buf</span></code>, the maximum number of bytes it will copy is limited by <code class="docutils literal notranslate"><span class="pre">buf_len</span></code>.</p>
<p>Return value will be pointer to beginning of the value. Note that this might, or might not be the same as buf.</p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>pointer to value on success, NULL on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">name</span></code>: Name/key of the configuration item. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">val_str</span></code>: Value of the configuration item.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.conf_get_stored_value">
<span class="target" id="group___sys_config_1ga65dd1133ba67a2856c286db731d1aae6"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">conf_get_stored_value</span></code><span class="sig-paren">(</span><span class="pre">char</span> <span class="pre">*</span><em><span class="pre">name</span></em>, <span class="pre">char</span> <span class="pre">*</span><em><span class="pre">buf</span></em>, <span class="pre">int</span> <em><span class="pre">buf_len</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_get_stored_value" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get stored value of configuration item identified by <code class="docutils literal notranslate"><span class="pre">name</span></code>. </p>
<p>This traverses the configuration area(s), and copies the value of the latest value.</p>
<p>Value is copied to <code class="docutils literal notranslate"><span class="pre">buf</span></code>, the maximum number of bytes it will copy is limited by <code class="docutils literal notranslate"><span class="pre">buf_len</span></code>.</p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success, non-zero on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">name</span></code>: Name/key of the configuration item. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">val_str</span></code>: Value of the configuration item.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.conf_commit">
<span class="target" id="group___sys_config_1ga18261aaac34e82bed8abab36720c5106"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">conf_commit</span></code><span class="sig-paren">(</span><span class="pre">char</span> <span class="pre">*</span><em><span class="pre">name</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_commit" title="Permalink to this definition"></a><br /></dt>
<dd><p>Call commit for all configuration handler. </p>
<p>This should apply all configuration which has been set, but not applied yet.</p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success, non-zero on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">name</span></code>: Name of the configuration subtree, or NULL to commit everything.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.conf_value_from_str">
<span class="target" id="group___sys_config_1ga44b534581b99102aa3c71ec0c074be74"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">conf_value_from_str</span></code><span class="sig-paren">(</span><span class="pre">char</span> <span class="pre">*</span><em><span class="pre">val_str</span></em>, <em class="property"><span class="pre">enum</span></em> <a class="reference internal" href="#c.conf_type" title="conf_type"><span class="pre">conf_type</span></a> <em><span class="pre">type</span></em>, <span class="pre">void</span> <span class="pre">*</span><em><span class="pre">vp</span></em>, <span class="pre">int</span> <em><span class="pre">maxlen</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_value_from_str" title="Permalink to this definition"></a><br /></dt>
<dd><p>Convenience routine for converting value passed as a string to native data type. </p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success, non-zero on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">val_str</span></code>: Value of the configuration item as string. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">type</span></code>: Type of the value to convert to. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">vp</span></code>: Pointer to variable to fill with the decoded value. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">vp</span></code>: Size of that variable.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.conf_bytes_from_str">
<span class="target" id="group___sys_config_1ga59c8f9f2729a65ec60dbeabc82cc1d83"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">conf_bytes_from_str</span></code><span class="sig-paren">(</span><span class="pre">char</span> <span class="pre">*</span><em><span class="pre">val_str</span></em>, <span class="pre">void</span> <span class="pre">*</span><em><span class="pre">vp</span></em>, <span class="pre">int</span> <span class="pre">*</span><em><span class="pre">len</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_bytes_from_str" title="Permalink to this definition"></a><br /></dt>
<dd><p>Convenience routine for converting byte array passed as a base64 encoded string. </p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success, non-zero on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">val_str</span></code>: Value of the configuration item as string. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">vp</span></code>: Pointer to variable to fill with the decoded value. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">len</span></code>: Size of that variable. On return the number of bytes in the array.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.conf_str_from_value">
<span class="target" id="group___sys_config_1gaae067816c43888ce983d56c06857288c"></span><span class="pre">char</span> <span class="pre">*</span><code class="sig-name descname"><span class="pre">conf_str_from_value</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">enum</span></em> <a class="reference internal" href="#c.conf_type" title="conf_type"><span class="pre">conf_type</span></a> <em><span class="pre">type</span></em>, <span class="pre">void</span> <span class="pre">*</span><em><span class="pre">vp</span></em>, <span class="pre">char</span> <span class="pre">*</span><em><span class="pre">buf</span></em>, <span class="pre">int</span> <em><span class="pre">buf_len</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_str_from_value" title="Permalink to this definition"></a><br /></dt>
<dd><p>Convenience routine for converting native data type to a string. </p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success, non-zero on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">type</span></code>: Type of the value to convert from. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">vp</span></code>: Pointer to variable to convert. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">buf</span></code>: Buffer where string value will be stored. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">buf_len</span></code>: Size of the buffer.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.conf_str_from_bytes">
<span class="target" id="group___sys_config_1gac587d4020d3441d91acd0319bc3cc7df"></span><span class="pre">char</span> <span class="pre">*</span><code class="sig-name descname"><span class="pre">conf_str_from_bytes</span></code><span class="sig-paren">(</span><span class="pre">void</span> <span class="pre">*</span><em><span class="pre">vp</span></em>, <span class="pre">int</span> <em><span class="pre">vp_len</span></em>, <span class="pre">char</span> <span class="pre">*</span><em><span class="pre">buf</span></em>, <span class="pre">int</span> <em><span class="pre">buf_len</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_str_from_bytes" title="Permalink to this definition"></a><br /></dt>
<dd><p>Convenience routine for converting byte array into a base64 encoded string. </p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success, non-zero on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">vp</span></code>: Pointer to variable to convert. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">vp_len</span></code>: Number of bytes to convert. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">buf</span></code>: Buffer where string value will be stored. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">buf_len</span></code>: Size of the buffer.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.conf_lock">
<span class="target" id="group___sys_config_1gae7cb9d8c796ec2add536238109c5f4c7"></span><span class="pre">void</span> <code class="sig-name descname"><span class="pre">conf_lock</span></code><span class="sig-paren">(</span><span class="pre">void</span><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_lock" title="Permalink to this definition"></a><br /></dt>
<dd><p>Locks the config package. </p>
<p>If another task tries to read or write a setting while the config package is locked, the operation will block until the package is unlocked. The locking task is permitted to read and write settings as usual. A call to <code class="docutils literal notranslate"><a class="reference internal" href="#group___sys_config_1gae7cb9d8c796ec2add536238109c5f4c7"><span class="std std-ref"><span class="pre">conf_lock()</span></span></a></code> should always be followed by <code class="docutils literal notranslate"><a class="reference internal" href="#group___sys_config_1gac439a0f1d5f28cc9ecc8271909941d1d"><span class="std std-ref"><span class="pre">conf_unlock()</span></span></a></code>.</p>
<p>Typical usage of the config API does not require manual locking. This function is only needed for unusual use cases such as temporarily changing the destination medium for an isolated series of writes. </p>
</dd></dl>
<dl class="c function">
<dt id="c.conf_unlock">
<span class="target" id="group___sys_config_1gac439a0f1d5f28cc9ecc8271909941d1d"></span><span class="pre">void</span> <code class="sig-name descname"><span class="pre">conf_unlock</span></code><span class="sig-paren">(</span><span class="pre">void</span><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_unlock" title="Permalink to this definition"></a><br /></dt>
<dd><p>Unlocks the config package. </p>
<p>This function reverts the effects of the <code class="docutils literal notranslate"><a class="reference internal" href="#group___sys_config_1gae7cb9d8c796ec2add536238109c5f4c7"><span class="std std-ref"><span class="pre">conf_lock()</span></span></a></code> function. Typical usage of the config API does not require manual locking. </p>
</dd></dl>
<dl class="c function">
<dt id="c.conf_src_register">
<span class="target" id="group___sys_config_1ga54590c33750ade1d1769693f083d06db"></span><span class="pre">void</span> <code class="sig-name descname"><span class="pre">conf_src_register</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.conf_store" title="conf_store"><span class="pre">conf_store</span></a> <span class="pre">*</span><em><span class="pre">cs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_src_register" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.conf_dst_register">
<span class="target" id="group___sys_config_1ga0afa0c695e46aed92328ba9eb64621df"></span><span class="pre">void</span> <code class="sig-name descname"><span class="pre">conf_dst_register</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.conf_store" title="conf_store"><span class="pre">conf_store</span></a> <span class="pre">*</span><em><span class="pre">cs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.conf_dst_register" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.CONF_STR_FROM_BYTES_LEN">
<span class="target" id="group___sys_config_1ga461179cab6050d584dbbcc17b750ce19"></span><code class="sig-name descname"><span class="pre">CONF_STR_FROM_BYTES_LEN</span></code><span class="sig-paren">(</span><em><span class="pre">len</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.CONF_STR_FROM_BYTES_LEN" title="Permalink to this definition"></a><br /></dt>
<dd><p>Return the length of a configuration string from buffer length. </p>
</dd></dl>
<dl class="c macro">
<dt id="c.CONF_VALUE_SET">
<span class="target" id="group___sys_config_1gabb0645b39f5af9ded6e29d57419f8b81"></span><code class="sig-name descname"><span class="pre">CONF_VALUE_SET</span></code><span class="sig-paren">(</span><em><span class="pre">str</span></em>, <em><span class="pre">type</span></em>, <em><span class="pre">val</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.CONF_VALUE_SET" title="Permalink to this definition"></a><br /></dt>
<dd><p>Convert a string into a value of type. </p>
</dd></dl>
<dl class="c struct">
<dt id="c.conf_handler">
<span class="target" id="structconf__handler"></span><em class="property"><span class="pre">struct</span> </em><code class="sig-name descname"><span class="pre">conf_handler</span></code><a class="headerlink" href="#c.conf_handler" title="Permalink to this definition"></a><br /></dt>
<dd><em>#include &lt;config.h&gt;</em><p>Configuration handler, used to register a config item/subtree. </p>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric" id="breathe-section-title-public-members">Public Members</p>
<dl class="c var">
<dt id="c.conf_handler.ch_name">
<span class="target" id="structconf__handler_1a35034e3b248fd18443874d14628172c3"></span><span class="pre">char</span> <span class="pre">*</span><code class="sig-name descname"><span class="pre">ch_name</span></code><a class="headerlink" href="#c.conf_handler.ch_name" title="Permalink to this definition"></a><br /></dt>
<dd><p>The name of the conifguration item/subtree. </p>
</dd></dl>
<dl class="c var">
<dt id="c.conf_handler.ch_ext">
<span class="target" id="structconf__handler_1a38c8592b4f9186e676c01ab9c68ae319"></span><span class="pre">bool</span> <code class="sig-name descname"><span class="pre">ch_ext</span></code><a class="headerlink" href="#c.conf_handler.ch_ext" title="Permalink to this definition"></a><br /></dt>
<dd><p>Whether to use the extended callbacks. </p>
<p>false: standard true: extended </p>
</dd></dl>
<dl class="c var">
<dt id="c.conf_handler.&#64;3">
<span class="target" id="structconf__handler_1a737734cef94915a706c906a2c8fac7e9"></span><em class="property"><span class="pre">union</span></em> <a class="reference internal" href="#c.conf_handler" title="conf_handler"><span class="pre">conf_handler</span></a><span class="pre">.</span><strong><span class="pre">[anonymous]</span></strong> <strong><span class="pre">[anonymous]</span></strong><a class="headerlink" href="#c.conf_handler.@3" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get configuration value. </p>
</dd></dl>
<dl class="c var">
<dt id="c.conf_handler.&#64;5">
<span class="target" id="structconf__handler_1a214c1c1eb1abf29b6e2653068d99b1c1"></span><em class="property"><span class="pre">union</span></em> <a class="reference internal" href="#c.conf_handler" title="conf_handler"><span class="pre">conf_handler</span></a><span class="pre">.</span><strong><span class="pre">[anonymous]</span></strong> <strong><span class="pre">[anonymous]</span></strong><a class="headerlink" href="#c.conf_handler.@5" title="Permalink to this definition"></a><br /></dt>
<dd><p>Set configuration value. </p>
</dd></dl>
<dl class="c var">
<dt id="c.conf_handler.&#64;7">
<span class="target" id="structconf__handler_1ae1ca297ae4a66712d9b092a400425ad8"></span><em class="property"><span class="pre">union</span></em> <a class="reference internal" href="#c.conf_handler" title="conf_handler"><span class="pre">conf_handler</span></a><span class="pre">.</span><strong><span class="pre">[anonymous]</span></strong> <strong><span class="pre">[anonymous]</span></strong><a class="headerlink" href="#c.conf_handler.@7" title="Permalink to this definition"></a><br /></dt>
<dd><p>Commit configuration value. </p>
</dd></dl>
<dl class="c var">
<dt id="c.conf_handler.&#64;9">
<span class="target" id="structconf__handler_1a1153f82d4e7b89d68d59209223fe909e"></span><em class="property"><span class="pre">union</span></em> <a class="reference internal" href="#c.conf_handler" title="conf_handler"><span class="pre">conf_handler</span></a><span class="pre">.</span><strong><span class="pre">[anonymous]</span></strong> <strong><span class="pre">[anonymous]</span></strong><a class="headerlink" href="#c.conf_handler.@9" title="Permalink to this definition"></a><br /></dt>
<dd><p>Export configuration value. </p>
</dd></dl>
<dl class="c var">
<dt id="c.conf_handler.ch_arg">
<span class="target" id="structconf__handler_1ade184964cb051f98839dda87e4f120b3"></span><span class="pre">void</span> <span class="pre">*</span><code class="sig-name descname"><span class="pre">ch_arg</span></code><a class="headerlink" href="#c.conf_handler.ch_arg" title="Permalink to this definition"></a><br /></dt>
<dd><p>Custom argument that gets passed to the extended callbacks. </p>
</dd></dl>
</div>
</dd></dl>
<dl class="c struct">
<dt id="c.conf_store_itf">
<span class="target" id="structconf__store__itf"></span><em class="property"><span class="pre">struct</span> </em><code class="sig-name descname"><span class="pre">conf_store_itf</span></code><a class="headerlink" href="#c.conf_store_itf" title="Permalink to this definition"></a><br /></dt>
<dd><em>#include &lt;config_store.h&gt;</em></dd></dl>
<dl class="c struct">
<dt id="c.conf_store">
<span class="target" id="structconf__store"></span><em class="property"><span class="pre">struct</span> </em><code class="sig-name descname"><span class="pre">conf_store</span></code><a class="headerlink" href="#c.conf_store" title="Permalink to this definition"></a><br /></dt>
<dd><em>#include &lt;config_store.h&gt;</em></dd></dl>
</div>
</div>
</div>
</div>
</div>
<div class="rst-footer-buttons row" role="navigation" aria-label="footer navigation">
<a href="../logs/logs.html" class="btn btn-neutral float-right" title="Logging" accesskey="n">Next: Logging <span class="fa fa-arrow-circle-right"></span></a>
<a href="../system_modules.html" class="btn btn-neutral" title="System Modules" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous: System Modules</a>
</div>
</div>
</div>
</div>
<!-- ENDS CONTENT SECTION -->
</div>
<!-- ENDS .content -->
</div>
</div>
<footer>
<div class="container">
<div class="row">
<div class="col-xs-12">
<p class="copyright">Apache Mynewt is available under Apache License, version 2.0.</p>
</div>
<div class="col-xs-12">
<div class="logos">
<img src="../../../_static/img/asf_logo_wide_small.png" alt="Apache" title="Apache">
<small class="footnote">
Apache Mynewt, Mynewt, Apache, the Apache feather logo, and the Apache Mynewt project logo are either
registered trademarks or trademarks of the Apache Software Foundation in the United States and other countries.
</small>
<a href="">
<img src="../../../_static/img/add_to_slack.png" alt="Slack Icon" title="Join our Slack Community" />
</a>
</div>
</div>
</div>
</div>
</footer>
</div>
<!-- ENDS #wrapper -->
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT:'../../../',
VERSION:'latest',
COLLAPSE_INDEX:false,
FILE_SUFFIX:'.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt',
LINK_SUFFIX: '.html'
};
</script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
<script type="text/javascript" src="../../../_static/js/bootstrap-3.0.3.min.js"></script>
<script type="text/javascript" src="../../../_static/js/affix.js"></script>
<script type="text/javascript" src="../../../_static/js/main.js"></script>
</body>
</html>