blob: 907e2e175b2ddd121434c71e269e6b7e354b6e99 [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>File System Abstraction &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="OS User Guide" href="../../os_user_guide.html"/>
<link rel="next" title="Newtron Flash Filesystem (nffs)" href="nffs.html"/>
<link rel="prev" title="Validation and Error Messages" href="../sysinitconfig/sysconfig_error.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.11.0, Apache NimBLE 1.6.0 </a> released September 7, 2023)
</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> /
File System Abstraction
<div class="sourcelink">
<a href="https://github.com/apache/mynewt-core/edit/master/docs/os/modules/fs/fs.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_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" selected="selected" >
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"><a class="reference internal" href="../system_modules.html">System</a></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 current"><a class="current reference internal" href="#">File System</a><ul>
<li class="toctree-l3"><a class="reference internal" href="nffs.html">Newtron Flash Filesystem (nffs)</a></li>
<li class="toctree-l3"><a class="reference internal" href="fatfs.html">The FAT File System</a></li>
<li class="toctree-l3"><a class="reference internal" href="otherfs.html">Other File Systems</a></li>
<li class="toctree-l3"><a class="reference internal" href="fs_add.html">Adding a new file system</a></li>
</ul>
</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>
</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="alert alert-warning">
<p>
Version 1.6.0 is not the most recent version of the
Apache Mynewt documentation. Click <a href="/latest">here</a> to
read the latest version.
</p>
</div>
<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="file-system-abstraction">
<h1>File System Abstraction<a class="headerlink" href="#file-system-abstraction" title="Permalink to this headline"></a></h1>
<div class="toctree-wrapper compound">
</div>
<p>Mynewt provides a file system abstraction layer (<code class="docutils literal notranslate"><span class="pre">fs/fs</span></code>) to allow
client code to be file system agnostic. By accessing the file system via
the <code class="docutils literal notranslate"><span class="pre">fs/fs</span></code> API, client code can perform file system operations
without being tied to a particular implementation. When possible,
library code should use the <code class="docutils literal notranslate"><span class="pre">fs/fs</span></code> API rather than accessing the
underlying file system directly.</p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><p><a class="reference internal" href="#description" id="id1">Description</a></p></li>
<li><p><a class="reference internal" href="#support-for-multiple-filesystems" id="id2">Support for multiple filesystems</a></p>
<ul>
<li><p><a class="reference internal" href="#struct-disk-ops" id="id3">struct disk_ops</a></p></li>
</ul>
</li>
<li><p><a class="reference internal" href="#thread-safety" id="id4">Thread Safety</a></p></li>
<li><p><a class="reference internal" href="#header-files" id="id5">Header Files</a></p></li>
<li><p><a class="reference internal" href="#data-structures" id="id6">Data Structures</a></p></li>
<li><p><a class="reference internal" href="#examples" id="id7">Examples</a></p></li>
<li><p><a class="reference internal" href="#api" id="id8">API</a></p></li>
</ul>
</div>
<div class="section" id="description">
<h2><a class="toc-backref" href="#id1">Description</a><a class="headerlink" href="#description" title="Permalink to this headline"></a></h2>
<p>Applications should aim to minimize the amount of code which depends on
a particular file system implementation. When possible, only depend on
the <code class="docutils literal notranslate"><span class="pre">fs/fs</span></code> package. In terms of the Mynewt hierarchy, an <strong>app</strong>
package must depend on a specific file system package, while <strong>library</strong>
packages should only depend on <code class="docutils literal notranslate"><span class="pre">fs/fs</span></code>.</p>
<p>Applications wanting to access a filesystem are required to include the
necessary packages in their applications pkg.yml file. In the following
example, the <a class="reference internal" href="nffs.html"><span class="doc">Newtron Flash File System</span></a> is
used.</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp"># </span>repos/apache-mynewt-core/apps/slinky/pkg.yml
<span class="go">pkg.name: repos/apache-mynewt-core/apps/slinky</span>
<span class="go">pkg.deps:</span>
<span class="go"> - &quot;@apache-mynewt-core/fs/fs&quot; # include the file operations interfaces</span>
<span class="go"> - &quot;@apache-mynewt-core/fs/nffs&quot; # include the NFFS filesystem implementation</span>
</pre></div>
</div>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span># repos/apache-mynewt-core/apps/slinky/syscfg.yml
# [...]
# Package: apps/&lt;example app&gt;
# [...]
CONFIG_NFFS: 1 # initialize and configure NFFS into the system
# NFFS_DETECT_FAIL: 1 # Ignore NFFS detection issues
# NFFS_DETECT_FAIL: 2 # Format a new NFFS file system on failure to detect
# [...]
</pre></div>
</div>
<p>Consult the <code class="docutils literal notranslate"><span class="pre">nffs</span></code> <a class="reference internal" href="nffs.html"><span class="doc">documentation</span></a> for a more
detailed explanation of NFFS_DETECT_FAIL</p>
<p>Code which uses the file system after the system has been initialized
need only depend on <code class="docutils literal notranslate"><span class="pre">fs/fs</span></code>. For example, the <code class="docutils literal notranslate"><span class="pre">libs/imgmgr</span></code> package
is a library which provides firmware upload and download functionality
via the use of a file system. This library is only used after the system
has been initialized, and therefore only depends on the <code class="docutils literal notranslate"><span class="pre">fs/fs</span></code>
package.</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp"># </span>repos/apache-mynewt-core/libs/imgmgr/pkg.yml
<span class="go">pkg.name: libs/imgmgr</span>
<span class="go">pkg.deps:</span>
<span class="go"> - &quot;@apache-mynewt-core/fs/fs&quot;</span>
<span class="gp"># </span><span class="o">[</span>...<span class="o">]</span>
</pre></div>
</div>
<p>The <code class="docutils literal notranslate"><span class="pre">libs/imgmgr</span></code> package uses the <code class="docutils literal notranslate"><span class="pre">fs/fs</span></code> API for all file system
operations.</p>
</div>
<div class="section" id="support-for-multiple-filesystems">
<h2><a class="toc-backref" href="#id2">Support for multiple filesystems</a><a class="headerlink" href="#support-for-multiple-filesystems" title="Permalink to this headline"></a></h2>
<p>When using a single filesystem/disk, it is valid to provide paths in the
standard unix way, eg, <code class="docutils literal notranslate"><span class="pre">/&lt;dir-name&gt;/&lt;file-name&gt;</span></code>. When trying to run
more than one filesystem or a single filesystem in multiple devices
simultaneosly, an extra name has to be given to the disk that is being
used. The abstraction for that was added as the <code class="docutils literal notranslate"><span class="pre">fs/disk</span></code> package
which is a dependency of <code class="docutils literal notranslate"><span class="pre">fs/fs</span></code>. It adds the following extra user
function:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="n">disk_register</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">disk_name</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">fs_name</span><span class="p">,</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">disk_ops</span><span class="w"> </span><span class="o">*</span><span class="n">dops</span><span class="p">)</span>
</pre></div>
</div>
<p>As an example os usage:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="n">disk_register</span><span class="p">(</span><span class="s">&quot;mmc0&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;fatfs&quot;</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">mmc_ops</span><span class="p">);</span>
<span class="n">disk_register</span><span class="p">(</span><span class="s">&quot;flash0&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;nffs&quot;</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span>
</pre></div>
</div>
<p>This registers the name <code class="docutils literal notranslate"><span class="pre">mmc0</span></code> to use <code class="docutils literal notranslate"><span class="pre">fatfs</span></code> as the filesystem and
<code class="docutils literal notranslate"><span class="pre">mmc_ops</span></code> for the low-level disk driver and also registers <code class="docutils literal notranslate"><span class="pre">flash0</span></code>
to use <code class="docutils literal notranslate"><span class="pre">nffs</span></code>. <code class="docutils literal notranslate"><span class="pre">nffs</span></code> is currently strongly bound to the
<code class="docutils literal notranslate"><span class="pre">hal_flash</span></code> interface, ignoring any other possible <code class="docutils literal notranslate"><span class="pre">disk_ops</span></code> given.</p>
<div class="section" id="struct-disk-ops">
<h3><a class="toc-backref" href="#id3">struct disk_ops</a><a class="headerlink" href="#struct-disk-ops" title="Permalink to this headline"></a></h3>
<p>To support a new low-level disk interface, the <code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">disk_ops</span></code>
interface must be implemented by the low-level driver. Currently only
<code class="docutils literal notranslate"><span class="pre">read</span></code> and <code class="docutils literal notranslate"><span class="pre">write</span></code> are effectively used (by <code class="docutils literal notranslate"><span class="pre">fatfs</span></code>).</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">struct</span><span class="w"> </span><span class="nc">disk_ops</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">read</span><span class="p">)(</span><span class="kt">uint8_t</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="p">,</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="p">);</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">write</span><span class="p">)(</span><span class="kt">uint8_t</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="p">);</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">ioctl</span><span class="p">)(</span><span class="kt">uint8_t</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="p">,</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="p">);</span>
<span class="w"> </span><span class="n">SLIST_ENTRY</span><span class="p">(</span><span class="n">disk_ops</span><span class="p">)</span><span class="w"> </span><span class="n">sc_next</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="thread-safety">
<h2><a class="toc-backref" href="#id4">Thread Safety</a><a class="headerlink" href="#thread-safety" title="Permalink to this headline"></a></h2>
<p>All <code class="docutils literal notranslate"><span class="pre">fs/fs</span></code> functions are thread safe.</p>
</div>
<div class="section" id="header-files">
<h2><a class="toc-backref" href="#id5">Header Files</a><a class="headerlink" href="#header-files" title="Permalink to this headline"></a></h2>
<p>All code which uses the <code class="docutils literal notranslate"><span class="pre">fs/fs</span></code> package needs to include the following
header:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&quot;fs/fs.h&quot;</span>
</pre></div>
</div>
</div>
<div class="section" id="data-structures">
<h2><a class="toc-backref" href="#id6">Data Structures</a><a class="headerlink" href="#data-structures" title="Permalink to this headline"></a></h2>
<p>All <code class="docutils literal notranslate"><span class="pre">fs/fs</span></code> data structures are opaque to client code.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">struct</span><span class="w"> </span><span class="nc">fs_file</span><span class="p">;</span>
<span class="k">struct</span><span class="w"> </span><span class="nc">fs_dir</span><span class="p">;</span>
<span class="k">struct</span><span class="w"> </span><span class="nc">fs_dirent</span><span class="p">;</span>
</pre></div>
</div>
</div>
<div class="section" id="examples">
<h2><a class="toc-backref" href="#id7">Examples</a><a class="headerlink" href="#examples" title="Permalink to this headline"></a></h2>
<p>Example 1 below opens the file /settings/config.txt for reading, reads some data, and then closes the file.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span>
<span class="nf">read_config</span><span class="p">(</span><span class="kt">void</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">fs_file</span><span class="w"> </span><span class="o">*</span><span class="n">file</span><span class="p">;</span>
<span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">bytes_read</span><span class="p">;</span>
<span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">buf</span><span class="p">[</span><span class="mi">16</span><span class="p">];</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">rc</span><span class="p">;</span>
<span class="w"> </span><span class="cm">/* Open the file for reading. */</span>
<span class="w"> </span><span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fs_open</span><span class="p">(</span><span class="s">&quot;/settings/config.txt&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">FS_ACCESS_READ</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">file</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">rc</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">0</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="mi">-1</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="cm">/* Read up to 16 bytes from the file. */</span>
<span class="w"> </span><span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fs_read</span><span class="p">(</span><span class="n">file</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="w"> </span><span class="n">buf</span><span class="p">,</span><span class="w"> </span><span class="n">buf</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">bytes_read</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">rc</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="cm">/* buf now contains up to 16 bytes of file data. */</span>
<span class="w"> </span><span class="n">console_printf</span><span class="p">(</span><span class="s">&quot;read %u bytes</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">bytes_read</span><span class="p">)</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="cm">/* Close the file. */</span>
<span class="w"> </span><span class="n">fs_close</span><span class="p">(</span><span class="n">file</span><span class="p">);</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">rc</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</div>
<p>Example 2 below iterates through the contents of a directory, printing the name of each child node. When the traversal is complete, the code closes the directory handle.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span>
<span class="nf">traverse_dir</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">dirname</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">fs_dirent</span><span class="w"> </span><span class="o">*</span><span class="n">dirent</span><span class="p">;</span>
<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">fs_dir</span><span class="w"> </span><span class="o">*</span><span class="n">dir</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">64</span><span class="p">];</span>
<span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">name_len</span><span class="p">;</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">rc</span><span class="p">;</span>
<span class="w"> </span><span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fs_opendir</span><span class="p">(</span><span class="n">dirname</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">dir</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">rc</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">0</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="mi">-1</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="cm">/* Iterate through the parent directory, printing the name of each child</span>
<span class="cm"> * entry. The loop only terminates via a function return.</span>
<span class="cm"> */</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="cm">/* Retrieve the next child node. */</span>
<span class="w"> </span><span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fs_readdir</span><span class="p">(</span><span class="n">dir</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">dirent</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">rc</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">FS_ENOENT</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="cm">/* Traversal complete. */</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="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">rc</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="cm">/* Unexpected error. */</span>
<span class="w"> </span><span class="k">return</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="cm">/* Read the child node&#39;s name from the file system. */</span>
<span class="w"> </span><span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fs_dirent_name</span><span class="p">(</span><span class="n">dirent</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="w"> </span><span class="n">buf</span><span class="p">,</span><span class="w"> </span><span class="n">buf</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">name_len</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">rc</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">0</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="mi">-1</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="cm">/* Print the child node&#39;s name to the console. */</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">fs_dirent_is_dir</span><span class="p">(</span><span class="n">dirent</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">console_printf</span><span class="p">(</span><span class="s">&quot; dir: &quot;</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">console_printf</span><span class="p">(</span><span class="s">&quot;file: &quot;</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">console_printf</span><span class="p">(</span><span class="s">&quot;%s</span><span class="se">\n</span><span class="s">&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="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<p>Example 3 below demonstrates creating a series of nested directories.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span>
<span class="nf">create_path</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">rc</span><span class="p">;</span>
<span class="w"> </span><span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fs_mkdir</span><span class="p">(</span><span class="s">&quot;/data&quot;</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">rc</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="k">goto</span><span class="w"> </span><span class="n">err</span><span class="p">;</span>
<span class="w"> </span><span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fs_mkdir</span><span class="p">(</span><span class="s">&quot;/data/logs&quot;</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">rc</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="k">goto</span><span class="w"> </span><span class="n">err</span><span class="p">;</span>
<span class="w"> </span><span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fs_mkdir</span><span class="p">(</span><span class="s">&quot;/data/logs/temperature&quot;</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">rc</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="k">goto</span><span class="w"> </span><span class="n">err</span><span class="p">;</span>
<span class="w"> </span><span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fs_mkdir</span><span class="p">(</span><span class="s">&quot;/data/logs/temperature/current&quot;</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">rc</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="k">goto</span><span class="w"> </span><span class="n">err</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="nl">err</span><span class="p">:</span>
<span class="w"> </span><span class="cm">/* Clean up the incomplete directory tree, if any. */</span>
<span class="w"> </span><span class="n">fs_unlink</span><span class="p">(</span><span class="s">&quot;/data&quot;</span><span class="p">);</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</div>
<p>Example 4 below demonstrates reading a small text file in its entirety and printing its contents to the console.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span>
<span class="nf">print_status</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">bytes_read</span><span class="p">;</span>
<span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">buf</span><span class="p">[</span><span class="mi">16</span><span class="p">];</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">rc</span><span class="p">;</span>
<span class="w"> </span><span class="cm">/* Read up to 15 bytes from the start of the file. */</span>
<span class="w"> </span><span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fsutil_read_file</span><span class="p">(</span><span class="s">&quot;/cfg/status.txt&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="w"> </span><span class="n">buf</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="n">buf</span><span class="p">,</span>
<span class="w"> </span><span class="o">&amp;</span><span class="n">bytes_read</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">rc</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<span class="w"> </span><span class="cm">/* Null-terminate the string just read. */</span>
<span class="w"> </span><span class="n">buf</span><span class="p">[</span><span class="n">bytes_read</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="sc">&#39;\0&#39;</span><span class="p">;</span>
<span class="w"> </span><span class="cm">/* Print the file contents to the console. */</span>
<span class="w"> </span><span class="n">console_printf</span><span class="p">(</span><span class="s">&quot;%s</span><span class="se">\n</span><span class="s">&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>
<p>Example 5 creates a 4-byte file.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span>
<span class="nf">write_id</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">rc</span><span class="p">;</span>
<span class="w"> </span><span class="cm">/* Create the parent directory. */</span>
<span class="w"> </span><span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fs_mkdir</span><span class="p">(</span><span class="s">&quot;/cfg&quot;</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">rc</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">rc</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">FS_EALREADY</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="mi">-1</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="cm">/* Create a file and write four bytes to it. */</span>
<span class="w"> </span><span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fsutil_write_file</span><span class="p">(</span><span class="s">&quot;/cfg/id.txt&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;1234&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">4</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">rc</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">0</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="mi">-1</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="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
<div class="section" id="api">
<h2><a class="toc-backref" href="#id8">API</a><a class="headerlink" href="#api" title="Permalink to this headline"></a></h2>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric" id="breathe-section-title-defines">Defines</p>
<dl class="c macro">
<dt id="c.FS_ACCESS_READ">
<span class="target" id="fs_8h_1aa0ef2753ef7fd106b7b811b6256ba276"></span><code class="sig-name descname"><span class="pre">FS_ACCESS_READ</span></code><a class="headerlink" href="#c.FS_ACCESS_READ" title="Permalink to this definition"></a><br /></dt>
<dd><p>File access flags. </p>
</dd></dl>
<dl class="c macro">
<dt id="c.FS_ACCESS_WRITE">
<span class="target" id="fs_8h_1a5e8333a15d39f0f24572bf04f466141d"></span><code class="sig-name descname"><span class="pre">FS_ACCESS_WRITE</span></code><a class="headerlink" href="#c.FS_ACCESS_WRITE" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.FS_ACCESS_APPEND">
<span class="target" id="fs_8h_1aca516acc31249a18456ae616cb50a589"></span><code class="sig-name descname"><span class="pre">FS_ACCESS_APPEND</span></code><a class="headerlink" href="#c.FS_ACCESS_APPEND" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.FS_ACCESS_TRUNCATE">
<span class="target" id="fs_8h_1a17f916b44803478edc7982e90a99eae3"></span><code class="sig-name descname"><span class="pre">FS_ACCESS_TRUNCATE</span></code><a class="headerlink" href="#c.FS_ACCESS_TRUNCATE" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.FS_EOK">
<span class="target" id="fs_8h_1adf14142875cc95bbca59aa2669f972fa"></span><code class="sig-name descname"><span class="pre">FS_EOK</span></code><a class="headerlink" href="#c.FS_EOK" title="Permalink to this definition"></a><br /></dt>
<dd><p>File access return codes. </p>
</dd></dl>
<dl class="c macro">
<dt id="c.FS_ECORRUPT">
<span class="target" id="fs_8h_1a853158b5354036fbce22765c61b0c8b8"></span><code class="sig-name descname"><span class="pre">FS_ECORRUPT</span></code><a class="headerlink" href="#c.FS_ECORRUPT" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.FS_EHW">
<span class="target" id="fs_8h_1af0dfc5cd2f1b3ec7f81f6c615a0fcaba"></span><code class="sig-name descname"><span class="pre">FS_EHW</span></code><a class="headerlink" href="#c.FS_EHW" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.FS_EOFFSET">
<span class="target" id="fs_8h_1a2558f655018028abaedf7c5eb041d323"></span><code class="sig-name descname"><span class="pre">FS_EOFFSET</span></code><a class="headerlink" href="#c.FS_EOFFSET" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.FS_EINVAL">
<span class="target" id="fs_8h_1ae6ceeac1001b72371e51bbff3b98a021"></span><code class="sig-name descname"><span class="pre">FS_EINVAL</span></code><a class="headerlink" href="#c.FS_EINVAL" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.FS_ENOMEM">
<span class="target" id="fs_8h_1ae8fe91cbdd62bb7143b7bb6db5895de9"></span><code class="sig-name descname"><span class="pre">FS_ENOMEM</span></code><a class="headerlink" href="#c.FS_ENOMEM" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.FS_ENOENT">
<span class="target" id="fs_8h_1a7f99c2a53a04583cf0e511ab6a1f9a4e"></span><code class="sig-name descname"><span class="pre">FS_ENOENT</span></code><a class="headerlink" href="#c.FS_ENOENT" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.FS_EEMPTY">
<span class="target" id="fs_8h_1ab754eeae4ae571ca5633928ddd2c47bf"></span><code class="sig-name descname"><span class="pre">FS_EEMPTY</span></code><a class="headerlink" href="#c.FS_EEMPTY" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.FS_EFULL">
<span class="target" id="fs_8h_1ae6b04ba45ab61e1e7833665fb75aebd8"></span><code class="sig-name descname"><span class="pre">FS_EFULL</span></code><a class="headerlink" href="#c.FS_EFULL" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.FS_EUNEXP">
<span class="target" id="fs_8h_1ae8f07f91f622f2f522feacacb3645abe"></span><code class="sig-name descname"><span class="pre">FS_EUNEXP</span></code><a class="headerlink" href="#c.FS_EUNEXP" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.FS_EOS">
<span class="target" id="fs_8h_1a0de0fab65c1565fddcf00c6a4e3b422f"></span><code class="sig-name descname"><span class="pre">FS_EOS</span></code><a class="headerlink" href="#c.FS_EOS" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.FS_EEXIST">
<span class="target" id="fs_8h_1a153b2a6a6097ba226ce55180a36d3113"></span><code class="sig-name descname"><span class="pre">FS_EEXIST</span></code><a class="headerlink" href="#c.FS_EEXIST" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.FS_EACCESS">
<span class="target" id="fs_8h_1a13b4cec77a264258baadc1b665f21c5d"></span><code class="sig-name descname"><span class="pre">FS_EACCESS</span></code><a class="headerlink" href="#c.FS_EACCESS" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.FS_EUNINIT">
<span class="target" id="fs_8h_1a8f8aa75fbc137ff11eb1bb0f06b105cb"></span><code class="sig-name descname"><span class="pre">FS_EUNINIT</span></code><a class="headerlink" href="#c.FS_EUNINIT" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.FS_NMGR_ID_FILE">
<span class="target" id="fs_8h_1a6251510effb9335f8caa9aa597b7868a"></span><code class="sig-name descname"><span class="pre">FS_NMGR_ID_FILE</span></code><a class="headerlink" href="#c.FS_NMGR_ID_FILE" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.FS_NMGR_MAX_NAME">
<span class="target" id="fs_8h_1a55303f58f0c64401c7c08b4eefa0bfe0"></span><code class="sig-name descname"><span class="pre">FS_NMGR_MAX_NAME</span></code><a class="headerlink" href="#c.FS_NMGR_MAX_NAME" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
</div>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric" id="breathe-section-title-functions">Functions</p>
<dl class="c function">
<dt id="c.fs_open">
<span class="target" id="fs_8h_1a226d00f1643fc1fa0d2cfd4d54672aa1"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">fs_open</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">filename</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">access_flags</span></em>, <em class="property"><span class="pre">struct</span></em> <span class="pre">fs_file</span><span class="pre">*</span><span class="pre">*</span><span class="sig-paren">)</span><a class="headerlink" href="#c.fs_open" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.fs_close">
<span class="target" id="fs_8h_1a7f236a8087d47838d04363ac35489823"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">fs_close</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <span class="pre">fs_file</span><span class="pre">*</span><span class="sig-paren">)</span><a class="headerlink" href="#c.fs_close" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.fs_read">
<span class="target" id="fs_8h_1a7c0f019a6ffd1c3e469963fa00b7903d"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">fs_read</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <span class="pre">fs_file</span><span class="pre">*</span>, <span class="pre">uint32_t</span> <em><span class="pre">len</span></em>, <span class="pre">void</span> <span class="pre">*</span><em><span class="pre">out_data</span></em>, <span class="pre">uint32_t</span> <span class="pre">*</span><em><span class="pre">out_len</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.fs_read" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.fs_write">
<span class="target" id="fs_8h_1ae092ec5d5dcd5444f9e7e30aa7ca3a0a"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">fs_write</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <span class="pre">fs_file</span><span class="pre">*</span>, <em class="property"><span class="pre">const</span></em> <span class="pre">void</span> <span class="pre">*</span><em><span class="pre">data</span></em>, <span class="pre">int</span> <em><span class="pre">len</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.fs_write" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.fs_seek">
<span class="target" id="fs_8h_1aa649b70e539c36cf447b0baaf5844ff5"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">fs_seek</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <span class="pre">fs_file</span><span class="pre">*</span>, <span class="pre">uint32_t</span> <em><span class="pre">offset</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.fs_seek" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.fs_getpos">
<span class="target" id="fs_8h_1a7cd85ae5b14e0747659f132644313476"></span><span class="pre">uint32_t</span> <code class="sig-name descname"><span class="pre">fs_getpos</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">const</span></em> <em class="property"><span class="pre">struct</span></em> <span class="pre">fs_file</span><span class="pre">*</span><span class="sig-paren">)</span><a class="headerlink" href="#c.fs_getpos" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.fs_filelen">
<span class="target" id="fs_8h_1ae15d3a717e341b81406e15908a2dff98"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">fs_filelen</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">const</span></em> <em class="property"><span class="pre">struct</span></em> <span class="pre">fs_file</span><span class="pre">*</span>, <span class="pre">uint32_t</span> <span class="pre">*</span><em><span class="pre">out_len</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.fs_filelen" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.fs_unlink">
<span class="target" id="fs_8h_1abe3d03c172f1df3be26facd42553476e"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">fs_unlink</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">filename</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.fs_unlink" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.fs_rename">
<span class="target" id="fs_8h_1a28bb828c6e59bf7e1f0e3edc56a15575"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">fs_rename</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">from</span></em>, <em class="property"><span class="pre">const</span></em> <span class="pre">char</span> <span class="pre">*</span><em><span class="pre">to</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.fs_rename" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.fs_mkdir">
<span class="target" id="fs_8h_1a235cef7d5c4df385a40a0f0293574b0c"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">fs_mkdir</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">path</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.fs_mkdir" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.fs_opendir">
<span class="target" id="fs_8h_1af9be1f4c99895c3c37caae481a2d1201"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">fs_opendir</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">path</span></em>, <em class="property"><span class="pre">struct</span></em> <span class="pre">fs_dir</span><span class="pre">*</span><span class="pre">*</span><span class="sig-paren">)</span><a class="headerlink" href="#c.fs_opendir" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.fs_readdir">
<span class="target" id="fs_8h_1a5b40ba190d300125bbe0747a95affdfb"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">fs_readdir</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <span class="pre">fs_dir</span><span class="pre">*</span>, <em class="property"><span class="pre">struct</span></em> <span class="pre">fs_dirent</span><span class="pre">*</span><span class="pre">*</span><span class="sig-paren">)</span><a class="headerlink" href="#c.fs_readdir" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.fs_closedir">
<span class="target" id="fs_8h_1af2f6af0e462b3f53ef9f296f7314049b"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">fs_closedir</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <span class="pre">fs_dir</span><span class="pre">*</span><span class="sig-paren">)</span><a class="headerlink" href="#c.fs_closedir" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.fs_dirent_name">
<span class="target" id="fs_8h_1af5d719307b8e0c29a9ca0e79ef9a9647"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">fs_dirent_name</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">const</span></em> <em class="property"><span class="pre">struct</span></em> <span class="pre">fs_dirent</span><span class="pre">*</span>, <span class="pre">size_t</span> <em><span class="pre">max_len</span></em>, <span class="pre">char</span> <span class="pre">*</span><em><span class="pre">out_name</span></em>, <span class="pre">uint8_t</span> <span class="pre">*</span><em><span class="pre">out_name_len</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.fs_dirent_name" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.fs_dirent_is_dir">
<span class="target" id="fs_8h_1aa0e61b1ef0436ea9f01dbe865fac5fd0"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">fs_dirent_is_dir</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">const</span></em> <em class="property"><span class="pre">struct</span></em> <span class="pre">fs_dirent</span><span class="pre">*</span><span class="sig-paren">)</span><a class="headerlink" href="#c.fs_dirent_is_dir" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
</div>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric" id="breathe-section-title-functions">Functions</p>
<dl class="c function">
<dt id="c.fsutil_read_file">
<span class="target" id="fsutil_8h_1a3b28b5fddd70aa388a51469d80b8b0c0"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">fsutil_read_file</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">path</span></em>, <span class="pre">uint32_t</span> <em><span class="pre">offset</span></em>, <span class="pre">uint32_t</span> <em><span class="pre">len</span></em>, <span class="pre">void</span> <span class="pre">*</span><em><span class="pre">dst</span></em>, <span class="pre">uint32_t</span> <span class="pre">*</span><em><span class="pre">out_len</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.fsutil_read_file" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.fsutil_write_file">
<span class="target" id="fsutil_8h_1abdc2d53bf062b337e1e21f2e8fcc1d93"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">fsutil_write_file</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">path</span></em>, <em class="property"><span class="pre">const</span></em> <span class="pre">void</span> <span class="pre">*</span><em><span class="pre">data</span></em>, <span class="pre">uint32_t</span> <em><span class="pre">len</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.fsutil_write_file" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
</div>
</div>
</div>
</div>
</div>
<div class="rst-footer-buttons row" role="navigation" aria-label="footer navigation">
<a href="nffs.html" class="btn btn-neutral float-right" title="Newtron Flash Filesystem (nffs)" accesskey="n">Next: Newtron Flash Filesystem (nffs) <span class="fa fa-arrow-circle-right"></span></a>
<a href="../sysinitconfig/sysconfig_error.html" class="btn btn-neutral" title="Validation and Error Messages" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous: Validation and Error Messages</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>