blob: 99f8412ee5c08585e20311edffd66fd65e72977f [file] [log] [blame]
<!--
Documentation/_templates/layout.html
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership. The
ASF licenses this file to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance with the
License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.
-->
<!DOCTYPE html>
<html class="writer-html5" lang="en">
<head>
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>NuttX File System &mdash; NuttX latest documentation</title>
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../../_static/css/theme.css" />
<link rel="stylesheet" type="text/css" href="../../_static/copybutton.css" />
<link rel="stylesheet" type="text/css" href="../../_static/sphinx_collapse.css" />
<link rel="stylesheet" type="text/css" href="../../_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css" />
<link rel="stylesheet" type="text/css" href="../../_static/custom.css" />
<link rel="shortcut icon" href="../../_static/favicon.ico"/>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/sphinx_highlight.js"></script>
<script src="../../_static/clipboard.min.js"></script>
<script src="../../_static/copybutton.js"></script>
<script src="../../_static/design-tabs.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<link rel="next" title="Asynchronous I/O support" href="aio.html" />
<link rel="prev" title="Audio Subsystem" href="../audio/index.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home"> NuttX
</a>
<!-- this version selector is quite ugly, should be probably replaced by something
more modern -->
<div class="version-selector">
<select onchange="javascript:location.href = this.value;">
<option value="../../../latest" selected="selected">latest</option>
<option value="../../../10.0.0" >10.0.0</option>
<option value="../../../10.0.1" >10.0.1</option>
<option value="../../../10.1.0" >10.1.0</option>
<option value="../../../10.2.0" >10.2.0</option>
<option value="../../../10.3.0" >10.3.0</option>
<option value="../../../11.0.0" >11.0.0</option>
<option value="../../../12.0.0" >12.0.0</option>
<option value="../../../12.1.0" >12.1.0</option>
<option value="../../../12.2.0" >12.2.0</option>
<option value="../../../12.2.1" >12.2.1</option>
<option value="../../../12.3.0" >12.3.0</option>
<option value="../../../12.4.0" >12.4.0</option>
<option value="../../../12.5.0" >12.5.0</option>
<option value="../../../12.5.1" >12.5.1</option>
<option value="../../../12.6.0" >12.6.0</option>
<option value="../../../12.7.0" >12.7.0</option>
<option value="../../../12.8.0" >12.8.0</option>
<option value="../../../12.9.0" >12.9.0</option>
<option value="../../../12.10.0" >12.10.0</option>
<option value="../../../12.11.0" >12.11.0</option>
</select>
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../index.html">Home</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../introduction/index.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../quickstart/index.html">Getting Started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../contributing/index.html">Contributing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../introduction/inviolables.html">The Inviolable Principles of NuttX</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../platforms/index.html">Supported Platforms</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../index.html">OS Components</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../binfmt.html">Binary Loader</a></li>
<li class="toctree-l2"><a class="reference internal" href="../drivers/index.html">Device Drivers</a></li>
<li class="toctree-l2"><a class="reference internal" href="../nxflat.html">NXFLAT</a></li>
<li class="toctree-l2"><a class="reference internal" href="../nxgraphics/index.html">NX Graphics Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../paging.html">On-Demand Paging</a></li>
<li class="toctree-l2"><a class="reference internal" href="../audio/index.html">Audio Subsystem</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">NuttX File System</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#virtual-file-system-vfs">Virtual File System (VFS)</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#how-vfs-works">How VFS works</a></li>
<li class="toctree-l4"><a class="reference internal" href="#vfs-interface">VFS Interface</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="#file-systems">File systems</a><ul>
<li class="toctree-l4"><a class="reference internal" href="aio.html">Asynchronous I/O support</a></li>
<li class="toctree-l4"><a class="reference internal" href="binfs.html">BINFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="cromfs.html">CROMFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="fat.html">FAT</a></li>
<li class="toctree-l4"><a class="reference internal" href="hostfs.html">Host File System</a></li>
<li class="toctree-l4"><a class="reference internal" href="littlefs.html">LITTLEFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="mmap.html">File mapping emulation (mmap)</a></li>
<li class="toctree-l4"><a class="reference internal" href="mnemofs.html">MNEMOFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="nfs.html">NFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="nxffs.html">NXFFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="partition.html">Partition Table</a></li>
<li class="toctree-l4"><a class="reference internal" href="procfs.html">PROCFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="romfs.html">ROMFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="rpmsgfs.html">RPMSG File System</a></li>
<li class="toctree-l4"><a class="reference internal" href="smartfs.html">SMARTFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="shmfs.html">Shared Memory File System</a></li>
<li class="toctree-l4"><a class="reference internal" href="spiffs.html">SPIFFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="tmpfs.html">TMPFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="unionfs.html">Union File System</a></li>
<li class="toctree-l4"><a class="reference internal" href="userfs.html">User file system</a></li>
<li class="toctree-l4"><a class="reference internal" href="zipfs.html">ZipFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="inotify.html">Inotify</a></li>
<li class="toctree-l4"><a class="reference internal" href="nuttxfs.html">Nuttx FS</a></li>
<li class="toctree-l4"><a class="reference internal" href="nxflat.html">NuttX FLAT Binary Format (NXFLAT)</a></li>
<li class="toctree-l4"><a class="reference internal" href="pseudofs.html">Pseudo File System</a></li>
<li class="toctree-l4"><a class="reference internal" href="special_files_dev_num.html">Special Files and Device Numbers</a></li>
<li class="toctree-l4"><a class="reference internal" href="v9fs.html">V9FS</a></li>
<li class="toctree-l4"><a class="reference internal" href="v9fs.html#adding-v9fs-to-the-nuttx-configuration">Adding V9FS to the NuttX Configuration</a></li>
<li class="toctree-l4"><a class="reference internal" href="v9fs.html#nfs-mount-command">NFS Mount Command</a></li>
<li class="toctree-l4"><a class="reference internal" href="#fs-categories">FS Categories</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../libs/index.html">NuttX libraries</a></li>
<li class="toctree-l2"><a class="reference internal" href="../net/index.html">Network Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../mm/index.html">Memory Management</a></li>
<li class="toctree-l2"><a class="reference internal" href="../syscall.html">Syscall Layer</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tools/index.html"><code class="docutils literal notranslate"><span class="pre">/tools</span></code> Host Tools</a></li>
<li class="toctree-l2"><a class="reference internal" href="../arch/index.html">Architecture-Specific Code</a></li>
<li class="toctree-l2"><a class="reference internal" href="../boards.html">Boards Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../cmake.html">CMake Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../openamp.html">OpenAMP Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../video.html">Video Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../crypto.html">Crypto API Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../wireless.html">Wireless Subsystem</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../applications/index.html">Applications</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../implementation/index.html">Implementation Details</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../reference/index.html">API Reference</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../faq/index.html">FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../debugging/index.html">Debugging</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/index.html">Guides</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../standards/index.html">Standards</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../glossary.html">Glossary</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../logos/index.html">NuttX Logos</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../_tags/tagsindex.html">Tags</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">NuttX</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item"><a href="../index.html">OS Components</a></li>
<li class="breadcrumb-item active">NuttX File System</li>
<li class="wy-breadcrumbs-aside">
<a href="https://github.com/apache/nuttx/blob/master/Documentation/components/filesystem/index.rst" class="fa fa-github"> Edit on GitHub</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="nuttx-file-system">
<h1>NuttX File System<a class="headerlink" href="#nuttx-file-system" title="Permalink to this heading"></a></h1>
<p>NuttX includes an optional, scalable file system. This file-system may be
omitted altogether; NuttX does not depend on the presence of any file system.</p>
<p id="root-fs"><strong>Pseudo Root File System</strong>. A simple <em>in-memory</em>, <em>pseudo</em> file
system can be enabled by default. This is an <em>in-memory</em> file
system because it does not require any storage medium or block
driver support. Rather, file system contents are generated
on-the-fly as referenced via standard file system operations
(open, close, read, write, etc.). In this sense, the file system
is <em>pseudo</em> file system (in the same sense that the Linux
<code class="docutils literal notranslate"><span class="pre">/proc</span></code> file system is also referred to as a pseudo file
system).</p>
<p>Any user supplied data or logic can be accessed via the
pseudo-file system. Built in support is provided for character and
block drivers in the <code class="docutils literal notranslate"><span class="pre">/dev</span></code> pseudo file system directory.</p>
<p><strong>Mounted File Systems</strong> The simple in-memory file system can be
extended my mounting block devices that provide access to true
file systems backed up via some mass storage device. NuttX
supports the standard <code class="docutils literal notranslate"><span class="pre">mount()</span></code> command that allows a block
driver to be bound to a mountpoint within the pseudo file system
and to a file system. At present, NuttX supports the standard VFAT
and ROMFS file systems, a special, wear-leveling NuttX FLASH File
System (NXFFS), as well as a Network File System client (NFS
version 3, UDP).</p>
<p><strong>Comparison to Linux</strong> From a programming perspective, the NuttX
file system appears very similar to a Linux file system. However,
there is a fundamental difference: The NuttX root file system is a
pseudo file system and true file systems may be mounted in the
pseudo file system. In the typical Linux installation by
comparison, the Linux root file system is a true file system and
pseudo file systems may be mounted in the true, root file system.
The approach selected by NuttX is intended to support greater
scalability from the very tiny platform to the moderate platform.</p>
<section id="virtual-file-system-vfs">
<h2>Virtual File System (VFS)<a class="headerlink" href="#virtual-file-system-vfs" title="Permalink to this heading"></a></h2>
<p>Virtual File System provides a unified interface for various file systems to
be able to co-exist together by exposing a blueprint that each file system
needs to implement. This also allows the file system to be free from worry
about the device driver implementations for storage devices, as they also
expose a unified way of accessing the underlying devices.</p>
<section id="how-vfs-works">
<h3>How VFS works<a class="headerlink" href="#how-vfs-works" title="Permalink to this heading"></a></h3>
<p>Threads are controllable sequences of instruction execution with their own
stacks. Each task in NuttX is represented by a Task Control Block (TCB) (TCB
is defined in <code class="docutils literal notranslate"><span class="pre">include/nuttx/sched.h</span></code>) and tasks are organized in task
lists.</p>
<p>All threads that are created by <code class="docutils literal notranslate"><span class="pre">pthread_create()</span></code> are part of the same task
group. A task group (defined in <code class="docutils literal notranslate"><span class="pre">include/nuttx/sched.h</span></code>) is a shared
structure pointed to by the TCBs of all the threads that belong to the same
task group, and this task group contains all the resources shared across the
task group which includes <em>file descriptors</em> in the form of a <strong>file list</strong>.</p>
<p>A file list (defined in <code class="docutils literal notranslate"><span class="pre">include/nuttx/fs/fs.h</span></code>) contains file structures
that denote open files (along with a spinlock to manage access to the file
list). With the devices listed in the <a class="reference internal" href="#root-fs"><span class="std std-ref">root file system</span></a> (on
points like <code class="docutils literal notranslate"><span class="pre">/dev/led</span></code>, <code class="docutils literal notranslate"><span class="pre">/dev/mmcsd0</span></code>, etc. which are henceforth called
blockdriver mount points) in an unmounted state, storage devices can be
mounted using the <code class="docutils literal notranslate"><span class="pre">mount()</span></code> command (to any point like <code class="docutils literal notranslate"><span class="pre">/dir/abcd</span></code>) with
any specific supported file system, which internally calls its implemented
<code class="docutils literal notranslate"><span class="pre">mountpt_operations-&gt;bind()</span></code> method and passes the blockdriver’s mount
point inode to it, thus creating a <strong>mount point</strong>. The blockdriver mount
point inode will have a <code class="docutils literal notranslate"><span class="pre">mountpt-&gt;i_private</span></code> which contains any (file system
dependent) information about the mount and is to be filled by the file system
during the execution of <code class="docutils literal notranslate"><span class="pre">mountpt_operations-&gt;bind()</span></code> (and usually this data
includes a pointer to the blockdriver mount point as well). After that,
according to system calls, the other exposed functions of the filesystem
are called as per need.</p>
</section>
<section id="vfs-interface">
<h3>VFS Interface<a class="headerlink" href="#vfs-interface" title="Permalink to this heading"></a></h3>
<p>VFS allows file systems to expose their own implementations of methods
belonging to a unified interface:</p>
<ul class="simple">
<li><p><strong>File operations</strong></p></li>
</ul>
<dl class="c function">
<dt class="sig sig-object c" id="c.open">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">open</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">file</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">filep</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">relpath</span></span>, <span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">oflags</span></span>, <span class="n"><span class="pre">mode_t</span></span><span class="w"> </span><span class="n"><span class="pre">mode</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.open" title="Permalink to this definition"></a><br /></dt>
<dd><p>Opens a file. Files are required to be opened before any other file
operations are performed on it.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>filep</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">file</span><span class="p">*</span></span></span>) – Open file’s file structure pointer. The
<code class="docutils literal notranslate"><span class="pre">filep-&gt;f_priv</span></code> member needs to be set here with the file system
specific data that represents an open file.</p></li>
<li><p><strong>relpath</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="p">*</span></span></span>) – Relative path of the file from the root of
the mounted file system.</p></li>
<li><p><strong>oflags</strong> (<span><span class="c-expr sig sig-inline c"><span class="kt">int</span></span></span>) – Flags in a bit field that specify the mode for opening
the file (eg. <code class="docutils literal notranslate"><span class="pre">O_RDONLY</span></code>, <code class="docutils literal notranslate"><span class="pre">O_RDWR</span></code>, etc. defined in
<code class="docutils literal notranslate"><span class="pre">include/fcntl.h</span></code>).</p></li>
<li><p><strong>mode</strong> (<span><span class="c-expr sig sig-inline c"><span class="n">mode_t</span></span></span>) – Specifies the mode (permissions). If <code class="docutils literal notranslate"><span class="pre">oflags</span></code> include
<code class="docutils literal notranslate"><span class="pre">O_CREAT</span></code>, then this contains the mode for the file to be created.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Status of opening a file.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>OK (0)</strong> – Success.</p></li>
<li><p><strong>&lt; 0</strong> – Error.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.close">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">close</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">file</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">filep</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.close" title="Permalink to this definition"></a><br /></dt>
<dd><p>This closes the opened file, and ideally syncs all the changes to the file
to be written to the disk, as well as free the memory allocated to store the
open file’s data.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>filep</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">file</span><span class="p">*</span></span></span>) – Open file’s file structure pointer.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Status of closing a file.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>OK (0)</strong> – Success.</p></li>
<li><p><strong>&lt; 0</strong> – Error.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.read">
<span class="n"><span class="pre">ssize_t</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">read</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">file</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">filep</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">buffer</span></span>, <a class="reference internal" href="../../reference/user/structures.html#c.size_t" title="size_t"><span class="n"><span class="pre">size_t</span></span></a><span class="w"> </span><span class="n"><span class="pre">buflen</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.read" title="Permalink to this definition"></a><br /></dt>
<dd><p>Reads maximum <code class="docutils literal notranslate"><span class="pre">buflen</span></code> bytes from an opened file (from the current offset
the opened file descriptor is pointing at if the file system supports
seeking).</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>filep</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">file</span><span class="p">*</span></span></span>) – Open file’s file structure pointer.</p></li>
<li><p><strong>buffer</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="kt">char</span><span class="p">*</span></span></span>) – Buffer to store the read data.</p></li>
<li><p><strong>buflen</strong> (<span><span class="c-expr sig sig-inline c"><a class="reference internal" href="../../reference/user/structures.html#c.size_t" title="size_t"><span class="n">size_t</span></a></span></span>) – Length of the maximum number of bytes to be read.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Number of bytes read.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>&gt; 0</strong> – Size of bytes read.</p></li>
<li><p><strong>&lt; 0</strong> – Error.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.write">
<span class="n"><span class="pre">ssize_t</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">write</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">file</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">filep</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">buffer</span></span>, <a class="reference internal" href="../../reference/user/structures.html#c.size_t" title="size_t"><span class="n"><span class="pre">size_t</span></span></a><span class="w"> </span><span class="n"><span class="pre">buflen</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.write" title="Permalink to this definition"></a><br /></dt>
<dd><p>Writes maximum <code class="docutils literal notranslate"><span class="pre">buflen</span></code> bytes to an opened file (from the current offset
the opened file is at if the file system supports seeking).</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>filep</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">file</span><span class="p">*</span></span></span>) – Open file’s file structure pointer.</p></li>
<li><p><strong>buffer</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="kt">char</span><span class="p">*</span></span></span>) – Buffer which contains the data to be written.</p></li>
<li><p><strong>buflen</strong> (<span><span class="c-expr sig sig-inline c"><a class="reference internal" href="../../reference/user/structures.html#c.size_t" title="size_t"><span class="n">size_t</span></a></span></span>) – Length of the maximum number of bytes to be written.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Number of bytes written.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>&gt; 0</strong> – Size of bytes written.</p></li>
<li><p><strong>&lt; buflen</strong> – Insufficient storage or file size limit reached</p></li>
<li><p><strong>&lt; 0</strong> – Error.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>POSIX requires that a <code class="docutils literal notranslate"><span class="pre">read()</span></code> after a <code class="docutils literal notranslate"><span class="pre">write()</span></code> should get the newly
written data, but not all file systems conform to POSIX, especially as
POSIX requires atomic writes, which is not usually implemented
as it can impact performance.</p>
<p>To be POSIX compliant in concurrent situations, either the writes have to
be atomic, or read is blocked with a lock until an on-going write is
finished, which, as stated, would impact performance.</p>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.seek">
<span class="n"><span class="pre">off_t</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">seek</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">file</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">filep</span></span>, <span class="n"><span class="pre">off_t</span></span><span class="w"> </span><span class="n"><span class="pre">offset</span></span>, <span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">whence</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.seek" title="Permalink to this definition"></a><br /></dt>
<dd><p>Underlying implementation of <code class="docutils literal notranslate"><span class="pre">lseek()</span></code>, it allows the open file’s file
structure to point to any particular location in the file.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>filep</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">file</span><span class="p">*</span></span></span>) – Open file’s file structure pointer.</p></li>
<li><p><strong>offset</strong> (<span><span class="c-expr sig sig-inline c"><span class="n">off_t</span></span></span>) – The offset required.</p></li>
<li><p><strong>whence</strong> (<span><span class="c-expr sig sig-inline c"><span class="kt">int</span></span></span>) – <p>This controls how the offset it applied. It can have
values (defined in <code class="docutils literal notranslate"><span class="pre">/include/sys/types.h</span></code>):</p>
<ul>
<li><p>SEEK_SET: Offset from start of file.</p></li>
<li><p>SEEK_CUR: Offset from current location in file.</p></li>
<li><p>SEEK_END: Offset <em>after</em> end of file.</p></li>
</ul>
</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>According to POSIX, <code class="docutils literal notranslate"><span class="pre">lseek()</span></code> to any point after the end of the file
<em>does not</em> by itself increase the size of the file. Later writes to this
part will, however, increase it to at least the end of the written data, and
the “gap” before this written data should be filled with <code class="docutils literal notranslate"><span class="pre">\0</span></code> in case of
any reads after such a write operation.</p>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.ioctl">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">ioctl</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">file</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">filep</span></span>, <span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">cmd</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">long</span></span><span class="w"> </span><span class="n"><span class="pre">arg</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.ioctl" title="Permalink to this definition"></a><br /></dt>
<dd><p>It is the underlying implementation of <code class="docutils literal notranslate"><span class="pre">ioctl()</span></code> (I/O Control).
<code class="docutils literal notranslate"><span class="pre">ioctl()</span></code> manipulates the underlying device parameters of files.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>filep</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">file</span><span class="p">*</span></span></span>) – Open file’s file structure pointer.</p></li>
<li><p><strong>cmd</strong> (<span><span class="c-expr sig sig-inline c"><span class="kt">int</span></span></span>) – It can take a variety of values (which are defined in
<code class="docutils literal notranslate"><span class="pre">include/nuttx/fs/ioctl.h</span></code>). It represents the command that will be
carried out on the file. Both the filesystem, as well as the device driver
needs to support the command in order for the function to run.</p></li>
<li><p><strong>arg</strong> (<span><span class="c-expr sig sig-inline c"><span class="kt">unsigned</span><span class="w"> </span><span class="kt">long</span></span></span>) – Additional argument that may be required for
ioctl. Details for what is required is written in the comments beside
the desired ioctl command in <code class="docutils literal notranslate"><span class="pre">include/nuttx/fs/ioctl.h</span></code>.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Status of ioctl operation.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>OK (0)</strong> – Success.</p></li>
<li><p><strong>&lt; 0</strong> – Error.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.mmap">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">mmap</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">file</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">filep</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">mm_map_entry_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">map</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.mmap" title="Permalink to this definition"></a><br /></dt>
<dd><p>Underlying implementation of <code class="docutils literal notranslate"><span class="pre">mmap()</span></code>. <code class="docutils literal notranslate"><span class="pre">mmap()</span></code> creates a new mapping
in the virtual address space of the calling process.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>filep</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">file</span><span class="p">*</span></span></span>) – Open file’s file structure pointer.</p></li>
<li><p><strong>map</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">mm_map_entry_s</span><span class="p">*</span></span></span>) – mmap entry structure pointer, which
includes the virtual address.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Status of mmap operation.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>OK (0)</strong> – Success.</p></li>
<li><p><strong>&lt; 0</strong> – Error.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>NuttX operates in a flat open address space. Therefore, it generally does
not require <code class="docutils literal notranslate"><span class="pre">mmap()</span></code> functionality. There are two notable exceptions where
<code class="docutils literal notranslate"><span class="pre">mmap()</span></code> functionality is required:</p>
<ol class="arabic simple">
<li><p><code class="docutils literal notranslate"><span class="pre">mmap()</span></code> is the API that is used to support direct access to random
access media under the following very restrictive conditions:</p></li>
</ol>
<blockquote>
<div><ol class="loweralpha simple">
<li><p>The filesystem implements the mmap file operation. Any file
system that maps files contiguously on the media should support
this ioctl. (vs. file system that scatter files over the media
in non-contiguous sectors). As of this writing, ROMFS is the
only file system that meets this requirement.</p></li>
<li><p>The underlying block driver supports the BIOC_XIPBASE ioctl
command that maps the underlying media to a randomly accessible
address. At present, only the RAM/ROM disk driver does this.</p></li>
</ol>
</div></blockquote>
<ol class="arabic simple" start="2">
<li><p>If CONFIG_FS_RAMMAP is defined in the configuration, then mmap() will
support simulation of memory mapped files by copying files whole
into RAM.</p></li>
</ol>
</div>
<dl class="c function">
<dt class="sig sig-object c" id="c.truncate">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">truncate</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">file</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">filep</span></span>, <span class="n"><span class="pre">off_t</span></span><span class="w"> </span><span class="n"><span class="pre">length</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.truncate" title="Permalink to this definition"></a><br /></dt>
<dd><p>Shrinks or expands the file to be of the desired size.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>filep</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">file</span><span class="p">*</span></span></span>) – Open file’s file structure pointer.</p></li>
<li><p><strong>length</strong> (<span><span class="c-expr sig sig-inline c"><span class="n">off_t</span></span></span>) – Final size of the file.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Status of truncate operation.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>OK (0)</strong> – Success.</p></li>
<li><p><strong>&lt; 0</strong> – Error.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.poll">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">poll</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">file</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">filep</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">pollfd</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">fds</span></span>, <span class="kt"><span class="pre">bool</span></span><span class="w"> </span><span class="n"><span class="pre">setup</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.poll" title="Permalink to this definition"></a><br /></dt>
<dd><p>Underlying implementation of <code class="docutils literal notranslate"><span class="pre">poll()</span></code>. The <code class="docutils literal notranslate"><span class="pre">poll()</span></code> function provides
applications with a mechanism for multiplexing input/output over a set of
file descriptors.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>filep</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">file</span><span class="p">*</span></span></span>) – Open file’s pointer.</p></li>
<li><p><strong>fds</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">pollfd</span><span class="p">*</span></span></span>) – The structure describing the events to be
monitored, OR NULL if this is a request to stop monitoring events.</p></li>
<li><p><strong>setup</strong> (<span><span class="c-expr sig sig-inline c"><span class="kt">bool</span></span></span>) – true: Setup up the poll; false: Teardown the poll</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Status of poll operation.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>OK (0)</strong> – Success.</p></li>
<li><p><strong>&lt; 0</strong> – Error.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<ul class="simple">
<li><p><strong>Additional open file specific operations</strong></p></li>
</ul>
<dl class="c function">
<dt class="sig sig-object c" id="c.sync">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">sync</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">file</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">filep</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.sync" title="Permalink to this definition"></a><br /></dt>
<dd><p>This synchronizes the on-disk file system state of the file with the
in-memory file system state, ie. commits the file system caches to the disk.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>filep</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">file</span><span class="p">*</span></span></span>) – Open file’s <code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">file</span></code> (defined in
<code class="docutils literal notranslate"><span class="pre">include/nuttx/fs/fs.h</span></code>) pointer.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Status of syncing a file.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>OK (0)</strong> – Success.</p></li>
<li><p><strong>&lt; 0</strong> – Error.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.dup">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">dup</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">file</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">oldp</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">file</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">newp</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.dup" title="Permalink to this definition"></a><br /></dt>
<dd><p>Duplicate an open file structure.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>oldp</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">file</span><span class="p">*</span></span></span>) – Pointer to structure that is to be
duplicated.</p></li>
<li><p><strong>newp</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">file</span><span class="p">*</span></span></span>) – Pointer to structure in which the duplicate
data will be stored.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Status of duplicating open file’s structure.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>OK (0)</strong> – Success.</p></li>
<li><p><strong>&lt; 0</strong> – Error.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.fstat">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">fstat</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">file</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">filep</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.stat" title="stat"><span class="n"><span class="pre">stat</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">buf</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.fstat" title="Permalink to this definition"></a><br /></dt>
<dd><p>Obtain information about an open file.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>filep</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">file</span><span class="p">*</span></span></span>) – Open file’s pointer.</p></li>
<li><p><strong>buf</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><a class="reference internal" href="#c.stat" title="stat"><span class="n">stat</span></a><span class="p">*</span></span></span>) – Pointer to the <code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">stat</span></code> (defined in
<code class="docutils literal notranslate"><span class="pre">include/sys/stat.h</span></code>).</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Status of obtaining open file’s information.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>OK (0)</strong> – Success.</p></li>
<li><p><strong>&lt; 0</strong> – Error.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.fchstat">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">fchstat</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">file</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">filep</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.stat" title="stat"><span class="n"><span class="pre">stat</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">buf</span></span>, <span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">flags</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.fchstat" title="Permalink to this definition"></a><br /></dt>
<dd><p>Change file stats. It can change the mode, timestamps and ownership.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>filep</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">file</span><span class="p">*</span></span></span>) – Open file’s pointer.</p></li>
<li><p><strong>buf</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><a class="reference internal" href="#c.stat" title="stat"><span class="n">stat</span></a><span class="p">*</span></span></span>) – Pointer to stat structure describing
the values that need to be updated.</p></li>
<li><p><strong>flags</strong> (<span><span class="c-expr sig sig-inline c"><span class="kt">int</span></span></span>) – <p>Bit field that can include (defined in
<code class="docutils literal notranslate"><span class="pre">include/nuttx/fs/fs.h</span></code>):</p>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">CH_STAT_MODE</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">CH_STAT_UID</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">CH_STAT_GID</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">CH_STAT_ATIME</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">CH_STAT_MTIME</span></code></p></li>
</ul>
<p>This describes what needs to be updated.</p>
</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Status of changing open file’s stats.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>OK (0)</strong> – Success.</p></li>
<li><p><strong>&lt; 0</strong> – Error.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<ul class="simple">
<li><p><strong>Directory operations</strong></p></li>
</ul>
<dl class="c function">
<dt class="sig sig-object c" id="c.opendir">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">opendir</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">inode</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">mountpt</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">relpath</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">fs_dirent_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">dir</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.opendir" title="Permalink to this definition"></a><br /></dt>
<dd><p>Opens a directory stream for the provided directory. Other directory
operations can be used after this to do various directory related operations
. We say the directory stream points to the first entry, but you need
<code class="docutils literal notranslate"><span class="pre">readdir()</span></code> to read the first entry.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>mountpt</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">inode</span><span class="p">*</span></span></span>) – Mount point inode of the file system.</p></li>
<li><p><strong>relpath</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="p">*</span></span></span>) – Relative path from the root of the point
point of the directory.</p></li>
<li><p><strong>dir</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">fs_dirent_s</span><span class="p">*</span><span class="p">*</span></span></span>) – A directory stream structure pointer
which needs to be populated with the required fields (defined in
<code class="docutils literal notranslate"><span class="pre">include/nuttx/fs/fs.h</span></code>).</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Status of opening the directory.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>OK (0)</strong> – Success.</p></li>
<li><p><strong>&lt; 0</strong> – Error.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.closedir">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">closedir</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">inode</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">mountpt</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">fs_dirent_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">dir</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.closedir" title="Permalink to this definition"></a><br /></dt>
<dd><p>Closes a directory stream, as well as deallocates any memory used while
while opening a directory stream.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>mountpt</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">inode</span><span class="p">*</span></span></span>) – Mount point inode of the file system.</p></li>
<li><p><strong>dir</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">fs_dirent_s</span><span class="p">*</span><span class="p">*</span></span></span>) – A directory stream structure pointer
which was previously allocated (and needs to be freed).</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Status of closing the directory.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>OK (0)</strong> – Success.</p>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.readdir">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">readdir</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">inode</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">mountpt</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">fs_dirent_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">dir</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">dirent</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">entry</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.readdir" title="Permalink to this definition"></a><br /></dt>
<dd><p>This reads the next directory entry in a directory stream. If the stream
points to the base of the directory, then the first directory entry in the
directory is given.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>mountpt</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">inode</span><span class="p">*</span></span></span>) – Mount point inode of the file system.</p></li>
<li><p><strong>dir</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">fs_dirent_s</span><span class="p">*</span><span class="p">*</span></span></span>) – A directory stream structure pointer.</p></li>
<li><p><strong>entry</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">dirent</span><span class="p">*</span></span></span>) – Pointer to the directory entry. This will
be modified to point to the directory entry after it in the directory.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Status of reading the directory.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>OK (0)</strong> – Success.</p></li>
<li><p><strong>&lt; 0</strong> – Error.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.rewinddir">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">rewinddir</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">inode</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">mountpt</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">fs_dirent_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">dir</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.rewinddir" title="Permalink to this definition"></a><br /></dt>
<dd><p>Resets the directory stream back to the first entry, like it was after
opening.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>mountpt</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">inode</span><span class="p">*</span></span></span>) – Mount point inode of the file system.</p></li>
<li><p><strong>dir</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">fs_dirent_s</span><span class="p">*</span><span class="p">*</span></span></span>) – A directory stream structure pointer.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Status of rewinding the directory.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>OK (0)</strong> – Success.</p></li>
<li><p><strong>&lt; 0</strong> – Error.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<ul class="simple">
<li><p><strong>Volume-relations operations</strong></p></li>
</ul>
<dl class="c function">
<dt class="sig sig-object c" id="c.bind">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">bind</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">inode</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">blkdriver</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">data</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">handle</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.bind" title="Permalink to this definition"></a><br /></dt>
<dd><p>This is where the file system related data is initialized, and
is part of the mount process.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>blkdriver</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">inode</span><span class="p">*</span></span></span>) – Pointer to the block driver’s device
inode. This needs to be opened in this function.</p></li>
<li><p><strong>data</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">void</span><span class="p">*</span></span></span>) – The options provided during mount.</p></li>
<li><p><strong>handle</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="kt">void</span><span class="p">*</span><span class="p">*</span></span></span>) – Whatever data <code class="docutils literal notranslate"><span class="pre">handle</span></code> points to is attached
to the <code class="docutils literal notranslate"><span class="pre">mountpt</span></code> inode after this function is called during the mount
process. This way, this file system’s other methods can receive
this information if they have access to <code class="docutils literal notranslate"><span class="pre">mountpt</span></code> inode, by accessing
<code class="docutils literal notranslate"><span class="pre">mountpt-&gt;i_private</span></code>.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Status of binding operation.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>OK (0)</strong> – Success.</p></li>
<li><p><strong>&lt; 0</strong> – Error.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.unbind">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">unbind</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">handle</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">inode</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">blkdriver</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">flags</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.unbind" title="Permalink to this definition"></a><br /></dt>
<dd><p>This is part of the unmounting process. The file system first
needs to assess the flags passed to it and appropriately do the tasks
required by these flags, and then it needs to free the private data
(<code class="docutils literal notranslate"><span class="pre">handle</span></code> and any allocated members), as well as close the
previously-opened (during mount) block driver’s inode.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>handle</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="kt">void</span><span class="p">*</span></span></span>) – Private data of the file-system.</p></li>
<li><p><strong>blkdriver</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">inode</span><span class="p">*</span><span class="p">*</span></span></span>) – The device inode of the block driver’s
device inode.</p></li>
<li><p><strong>flags</strong> (<span><span class="c-expr sig sig-inline c"><span class="kt">unsigned</span><span class="w"> </span><span class="kt">int</span></span></span>) – <p>Flags dictate the actions needed to be carried
out before the file system data is removed and the block driver inode is
closed. The values can be (as defined in <code class="docutils literal notranslate"><span class="pre">include/sys/mount.h</span></code>):</p>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">MNT_FORCE</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">MNT_DETACH</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">MNT_EXPIRE</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">UMOUNT_NOFOLLOW</span></code></p></li>
</ul>
</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Status of unbinding operation.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>OK (0)</strong> – Success.</p></li>
<li><p><strong>&lt; 0</strong> – Error.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.statfs">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">statfs</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">inode</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">mountpt</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.statfs" title="statfs"><span class="n"><span class="pre">statfs</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">buf</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.statfs" title="Permalink to this definition"></a><br /></dt>
<dd><p>Provides stats for that instance of the file system. The exact
stats that are provided can be viewed in the members of
<code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">statfs</span></code> (in file <code class="docutils literal notranslate"><span class="pre">include/sys/statfs.h</span></code>).</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>mountpt</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">inode</span><span class="p">*</span></span></span>) – Mount point inode of the file system.</p></li>
<li><p><strong>buf</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><a class="reference internal" href="#c.statfs" title="statfs"><span class="n">statfs</span></a><span class="p">*</span></span></span>) – Buffer that needs to be filled with the
relevant file system information.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Status of finding the filesystem stats operation.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>OK (0)</strong> – Success.</p></li>
<li><p><strong>&lt; 0</strong> – Error.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<ul class="simple">
<li><p><strong>Path operations</strong></p></li>
</ul>
<dl class="c function">
<dt class="sig sig-object c" id="c.unlink">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">unlink</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">inode</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">mountpt</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">relpath</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.unlink" title="Permalink to this definition"></a><br /></dt>
<dd><p>Removes a file, specifically, removes a name from the file system.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>mountpt</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">inode</span><span class="p">*</span></span></span>) – Mount point inode of the file system.</p></li>
<li><p><strong>relpath</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="p">*</span></span></span>) – The relative path of the file from the root
of the file system.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Status of unlinking operation.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>OK (0)</strong> – Success.</p></li>
<li><p><strong>&lt; 0</strong> – Error.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.mkdir">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">mkdir</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">inode</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">mountpt</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">relpath</span></span>, <span class="n"><span class="pre">mode_t</span></span><span class="w"> </span><span class="n"><span class="pre">mode</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.mkdir" title="Permalink to this definition"></a><br /></dt>
<dd><p>Creates a directory.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>mountpt</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">inode</span><span class="p">*</span></span></span>) – Mount point inode of the file system.</p></li>
<li><p><strong>relpath</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="p">*</span></span></span>) – Relative path of the new directory from the
root of the file system.</p></li>
<li><p><strong>mode</strong> (<span><span class="c-expr sig sig-inline c"><span class="n">mode_t</span></span></span>) – The mode (permissions) for the directory.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Status of creating a directory operation.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>OK (0)</strong> – Success.</p></li>
<li><p><strong>&lt; 0</strong> – Error.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.rmdir">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">rmdir</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">inode</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">mountpt</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">relpath</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.rmdir" title="Permalink to this definition"></a><br /></dt>
<dd><p>Removes a directory.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>mountpt</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">inode</span><span class="p">*</span></span></span>) – Mount point inode of the file system.</p></li>
<li><p><strong>relpath</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="p">*</span></span></span>) – Relative path of the directory from the
root of the file system.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Status of removing a directory operation.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>OK (0)</strong> – Success.</p></li>
<li><p><strong>&lt; 0</strong> – Error.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.rename">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">rename</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">inode</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">mountpt</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">oldrelpath</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">newrelpath</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.rename" title="Permalink to this definition"></a><br /></dt>
<dd><p>Renames a file or a directory</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>mountpt</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">inode</span><span class="p">*</span></span></span>) – Mount point inode of the file system.</p></li>
<li><p><strong>oldrelpath</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="p">*</span></span></span>) – Existing path of the file or directory.</p></li>
<li><p><strong>newrelpath</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="p">*</span></span></span>) – New path of the file or directory.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Status of renaming a file or a directory operation.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>OK (0)</strong> – Success.</p></li>
<li><p><strong>&lt; 0</strong> – Error.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.stat">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">stat</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">inode</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">mountpt</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">relpath</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.stat" title="stat"><span class="n"><span class="pre">stat</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">buf</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.stat" title="Permalink to this definition"></a><br /></dt>
<dd><p>Information about a file or a directory. The exact information that is
provided can be viewed in the members of <code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">stat</span></code>
(in file <code class="docutils literal notranslate"><span class="pre">include/sys/stat.h</span></code>).</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>mountpt</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">inode</span><span class="p">*</span></span></span>) – Mount point inode of the file system.</p></li>
<li><p><strong>relpath</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="p">*</span></span></span>) – Relative path of the file or directory from
the root of the file system.</p></li>
<li><p><strong>buf</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><a class="reference internal" href="#c.stat" title="stat"><span class="n">stat</span></a><span class="p">*</span></span></span>) – Buffer that needs to be filled with the
relevant file or directory information.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Status of finding information about a file or directory.1 operation.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>OK (0)</strong> – Success.</p></li>
<li><p><strong>&lt; 0</strong> – Error.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.chstat">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">chstat</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">inode</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">mountpt</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">relpath</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.stat" title="stat"><span class="n"><span class="pre">stat</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">buf</span></span>, <span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">flags</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.chstat" title="Permalink to this definition"></a><br /></dt>
<dd><p>Change the stats of a file or directory.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>mountpt</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">inode</span><span class="p">*</span></span></span>) – Mount point inode of the file system.</p></li>
<li><p><strong>relpath</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="p">*</span></span></span>) – Relative path of the file or directory from
the root of the file system.</p></li>
<li><p><strong>buf</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><a class="reference internal" href="#c.stat" title="stat"><span class="n">stat</span></a><span class="p">*</span></span></span>) – Contains the new stat information. Access
only the ones that are required according to the flags.</p></li>
<li><p><strong>flags</strong> (<span><span class="c-expr sig sig-inline c"><span class="kt">int</span></span></span>) – A bit field that can have values including <code class="docutils literal notranslate"><span class="pre">CH_STAT_MODE</span></code>
, <code class="docutils literal notranslate"><span class="pre">CH_STAT_UID</span></code>, <code class="docutils literal notranslate"><span class="pre">CH_STAT_GID</span></code>, <code class="docutils literal notranslate"><span class="pre">CH_STAT_ATIME</span></code> or <code class="docutils literal notranslate"><span class="pre">CH_STAT_MTIME</span></code>
which are or-ed together.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.syncfs">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">syncfs</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">inode</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">mountpt</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.syncfs" title="Permalink to this definition"></a><br /></dt>
<dd><p>This works like <code class="docutils literal notranslate"><span class="pre">sync()</span></code> but instead of the file, it syncs the entire
filesystem’s metadata.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>mountpt</strong> (<span><span class="c-expr sig sig-inline c">FAR<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="n">inode</span><span class="p">*</span></span></span>) – Mount point inode of the file system.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>Status of syncing file system metadata operation.</p>
</dd>
<dt class="field-odd">Return values<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>OK (0)</strong> – Success.</p></li>
<li><p><strong>&lt; 0</strong> – Error.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<p>The file systems can have their own implementations for these functions
under-the-hood, but the user does not have to worry about the underlying file
system during file I/O, as the file system has to expose its implementations
in a unified interface.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Each file system has to globally expose their implementations of the unified
interface as defined by <code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">mountpt_operations</span></code> (in
<code class="docutils literal notranslate"><span class="pre">include/fs/fs.h</span></code>) to one of the lists defined in <code class="docutils literal notranslate"><span class="pre">fs/mount/fs_mount.c</span></code>
depending on the type of the file system.</p>
<p>They also need their own <a class="reference external" href="https://en.wikipedia.org/wiki/Magic_number_(programming)">magic number</a>
to be listed in <code class="docutils literal notranslate"><span class="pre">include/sys</span></code> and in <code class="docutils literal notranslate"><span class="pre">fs_gettype</span></code> function (in
<code class="docutils literal notranslate"><span class="pre">fs/mount/fs_gettype.c</span></code>) for identification of the filesystem.</p>
</div>
</section>
</section>
<section id="file-systems">
<h2>File systems<a class="headerlink" href="#file-systems" title="Permalink to this heading"></a></h2>
<p>NuttX provides support for a variety of file systems out of the box.</p>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="aio.html">Asynchronous I/O support</a></li>
<li class="toctree-l1"><a class="reference internal" href="binfs.html">BINFS</a></li>
<li class="toctree-l1"><a class="reference internal" href="cromfs.html">CROMFS</a></li>
<li class="toctree-l1"><a class="reference internal" href="fat.html">FAT</a></li>
<li class="toctree-l1"><a class="reference internal" href="hostfs.html">Host File System</a></li>
<li class="toctree-l1"><a class="reference internal" href="littlefs.html">LITTLEFS</a></li>
<li class="toctree-l1"><a class="reference internal" href="mmap.html">File mapping emulation (mmap)</a></li>
<li class="toctree-l1"><a class="reference internal" href="mnemofs.html">MNEMOFS</a></li>
<li class="toctree-l1"><a class="reference internal" href="nfs.html">NFS</a></li>
<li class="toctree-l1"><a class="reference internal" href="nxffs.html">NXFFS</a></li>
<li class="toctree-l1"><a class="reference internal" href="partition.html">Partition Table</a></li>
<li class="toctree-l1"><a class="reference internal" href="procfs.html">PROCFS</a></li>
<li class="toctree-l1"><a class="reference internal" href="romfs.html">ROMFS</a></li>
<li class="toctree-l1"><a class="reference internal" href="rpmsgfs.html">RPMSG File System</a></li>
<li class="toctree-l1"><a class="reference internal" href="smartfs.html">SMARTFS</a></li>
<li class="toctree-l1"><a class="reference internal" href="shmfs.html">Shared Memory File System</a></li>
<li class="toctree-l1"><a class="reference internal" href="spiffs.html">SPIFFS</a></li>
<li class="toctree-l1"><a class="reference internal" href="tmpfs.html">TMPFS</a></li>
<li class="toctree-l1"><a class="reference internal" href="unionfs.html">Union File System</a></li>
<li class="toctree-l1"><a class="reference internal" href="userfs.html">User file system</a></li>
<li class="toctree-l1"><a class="reference internal" href="zipfs.html">ZipFS</a></li>
<li class="toctree-l1"><a class="reference internal" href="inotify.html">Inotify</a></li>
<li class="toctree-l1"><a class="reference internal" href="nuttxfs.html">Nuttx FS</a></li>
<li class="toctree-l1"><a class="reference internal" href="nxflat.html">NuttX FLAT Binary Format (NXFLAT)</a></li>
<li class="toctree-l1"><a class="reference internal" href="pseudofs.html">Pseudo File System</a></li>
<li class="toctree-l1"><a class="reference internal" href="special_files_dev_num.html">Special Files and Device Numbers</a></li>
<li class="toctree-l1"><a class="reference internal" href="v9fs.html">V9FS</a></li>
<li class="toctree-l1"><a class="reference internal" href="v9fs.html#adding-v9fs-to-the-nuttx-configuration">Adding V9FS to the NuttX Configuration</a></li>
<li class="toctree-l1"><a class="reference internal" href="v9fs.html#nfs-mount-command">NFS Mount Command</a></li>
</ul>
</div>
<section id="fs-categories">
<h3>FS Categories<a class="headerlink" href="#fs-categories" title="Permalink to this heading"></a></h3>
<p>File systems can be divided into these categories on the basis of the drivers
they require:</p>
<ol class="arabic simple">
<li><p>They require a block device driver. They include vfat, romfs, smartfs, and
littlefs.</p></li>
<li><p>They require MTD drivers. They include romfs, spiffs, littlefs.</p></li>
<li><p>They require neither block nor MTD drivers. They include nxffs, tmpfs, nfs
binfs, procfs, userfs, hostfs, cromfs, unionfs, rpmsgfs, and zipfs.</p></li>
</ol>
<p>The requirements are specified by declaring the filesystem in the proper
array in <code class="docutils literal notranslate"><span class="pre">fs/mount/fs_mount.c</span></code>.</p>
</section>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="../audio/index.html" class="btn btn-neutral float-left" title="Audio Subsystem" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="aio.html" class="btn btn-neutral float-right" title="Asynchronous I/O support" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Copyright 2023, The Apache Software Foundation.</p>
</div>
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>