fs/hostfs: Improve hostfs POSIX compatibility#19456
Open
LingaoM wants to merge 5 commits into
Open
Conversation
LingaoM
requested review from
Ouss4,
jerpelea,
raiden00pl,
xiaoxiang781216 and
yamt
as code owners
July 16, 2026 07:44
|
LingaoM
force-pushed
the
sim-posix-fixes
branch
2 times, most recently
from
July 17, 2026 08:09
e054f59 to
1be3aa5
Compare
Contributor
|
Can you include the test application code you used? Also, just a note, the PR title should follow the same format as your commit subject since we use the titles to generate and sort release notes. You should also included the 'Assisted-by' field in the commit message when using AI tooling. |
The sim host usrsock backend only accepted INET/NETLINK domains and
translated socket addresses through plain struct sockaddr. That prevents
simulated applications from using POSIX AF_LOCAL sockets through the
standard socket API when CONFIG_NET_USRSOCK is used.
Add AF_LOCAL address conversion for struct sockaddr_un, allow PF_LOCAL
sockets through usrsock, handle NuttX socket type flags, and poll host
descriptors from the sim usrsock work item so nonblocking
connect/read/write readiness is reported back to NuttX. Use
sockaddr_storage for native address translation so larger address
structures are not truncated.
Testing:
- Host: Ubuntu 22.04 x86_64.
- Board/config: sim:nsh with CONFIG_NET_USRSOCK=y and
CONFIG_EXAMPLES_HELLO=y.
- make clean && make -j16.
- Ran a temporary hello example that connected to host AF_UNIX
SOCK_STREAM and SOCK_SEQPACKET sockets through NuttX socket(),
connect(), write(), and read(). Both received pong and printed
"AF_LOCAL usrsock test passed".
Assisted-by: Claude:Claude-Fable-5
Signed-off-by: Lingao Meng <menglingao@xiaomi.com>
fcntl(F_GETLK/F_SETLK/F_SETLKW) is handled by VFS and reaches file
systems as private FIOC_* ioctl commands. hostfs previously forwarded
those private ioctl command numbers to the host ioctl backend, which is
not the POSIX file-locking interface and cannot be interpreted by the
host OS.
Keep hostfs on the generic host_ioctl() path and define the FIOC_* lock
command values in the hostfs host ABI. The POSIX sim backend recognizes
those commands in host_ioctl() and translates struct flock fields to the
host ABI before calling host fcntl().
F_SETLKW is implemented by retrying non-blocking host F_SETLK with a
short sleep. This preserves the blocking NuttX API without forwarding
host F_SETLKW directly. Backends that do not implement these lock ioctl
commands return -ENOSYS or -ENOTTY, allowing VFS to fall back to NuttX
internal file locking.
Testing:
- Host: Ubuntu 22.04 x86_64.
- Board/config: sim:nsh with CONFIG_FS_HOSTFS=y,
CONFIG_SIM_HOSTFS=y and CONFIG_EXAMPLES_SIM_POSIX=y.
- make -j16.
- Ran examples/sim_posix from nuttx-apps. The test mounted a long
/tmp hostfs path, opened a host-backed file, and verified
fcntl(F_SETLK), fcntl(F_GETLK), fcntl(F_SETLKW), and unlocking with
F_UNLCK. The app printed "sim_posix: hostfs locks ok" and
"sim_posix: PASS".
Assisted-by: Claude:Claude-Fable-5
Signed-off-by: Lingao Meng <menglingao@xiaomi.com>
getaddrinfo() and getservbyname() use the built-in service table when
resolving service names. The table only contained ntp, so common
service names such as http and https could not be resolved without a
numeric port.
Add http and https entries for both TCP and UDP to match the existing
service table style.
Testing:
- Host: Ubuntu 22.04 x86_64.
- Board/config: sim:nsh with CONFIG_LIBC_NETDB=y and
CONFIG_EXAMPLES_HELLO=y.
- make clean && make -j16.
- Ran a temporary hello example that called getservbyname("http",
"tcp") and getservbyname("https", "tcp"). The app verified ports
80 and 443 and printed "getservbyname http/https test passed".
Assisted-by: Claude:Claude-Fable-5
Signed-off-by: Lingao Meng <menglingao@xiaomi.com>
hostfs_mkpath() appends a relative path to the configured host root with strlcat(). The third argument to strlcat() is the total destination buffer size, not the remaining free space. Passing pathlen - strlen(path) makes the effective limit shrink after a long host root has already been copied. With a sufficiently long root, a valid relative path can be dropped or truncated, so operations under the mount point may resolve to the host root instead of the requested child path. Pass the full destination buffer size and let strlcat() account for the current string length internally. The companion examples/hostfs_longpath app validates this regression by mounting hostfs with a long host root, writing a probe file below the mount point, and reading it back. The old size argument drops the relative component in that scenario; this fix preserves it. Assisted-by: Claude:Claude-Fable-5 Signed-off-by: Lingao Meng <menglingao@xiaomi.com>
hostfs keeps its own HOSTFS_MAX_PATH wrapper for internal buffers, but it should not hard-code a path length separate from the system path configuration. Define HOSTFS_MAX_PATH from PATH_MAX instead. PATH_MAX is backed by CONFIG_PATH_MAX, whose default remains 256, so the default hostfs behavior does not change while configurations that choose a larger path limit are honored consistently. Assisted-by: Claude:Claude-Fable-5 Signed-off-by: Lingao Meng <menglingao@xiaomi.com>
| hostlock.l_len = lock->l_len; | ||
| hostlock.l_pid = lock->l_pid; | ||
|
|
||
| do |
| { | ||
| case FIOC_GETLK: | ||
| case FIOC_SETLK: | ||
| case FIOC_SETLKW: |
Contributor
There was a problem hiding this comment.
revert, let's convert -ENOSYS to -ENOTTY in arch/sim
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR improves NuttX sim compatibility for standard POSIX-facing APIs used by simulated applications.
Changes included:
AF_LOCAL/AF_UNIXsupport to simusrsock, so applications can use the normal NuttX socket API to communicate with host Unix-domain sockets.fcntl(F_GETLK/F_SETLK/F_SETLKW)reaches file systems asFIOC_*ioctl commands after VFS handling; hostfs now converts those lock requestsback to host
fcntl()for host-backed files.PATH_MAXand preserves the relative path component when the configured host root already consumes most of the pathbuffer.
httpandhttpsservice entries to libc netdb sogetservbyname()/getaddrinfo()can resolve common service names without requiring numeric ports.The changes keep applications using standard NuttX/POSIX interfaces rather than exposing host-only APIs directly to application code.
Test application reference:
That temporary test app (
examples/sim_posix) exercises the affected APIs through normal application-facing interfaces:getservbyname()andgetaddrinfo()forhttp/httpsfcntl(F_GETLK/F_SETLK/F_SETLKW)AF_LOCALsockets through the NuttX socket API and simusrsockImpact
usrsock,hostfs, or libcnetdb.socket(AF_LOCAL, ...)through the normal NuttX socket layer on sim when nativeCONFIG_NET_LOCALis not enabled.fcntl(F_GETLK/F_SETLK/F_SETLKW).F_SETLKWis implemented without forwarding a blocking hostF_SETLKWcall directly. hostfs retries with non-blocking hostF_SETLKand sleeps between retries, avoiding a host-side blockingcall that could stop the whole sim OS.
httpandhttpsbecome available in the built-in service database whenCONFIG_LIBC_NETDB=y.-ENOTTY, allowing the VFS file-lock fallback path tohandle unsupported cases.
Testing
Host machine:
Board/config:
sim:nshapps test application:
LingaoM/nuttx-apps@ac8459b
Configuration used in addition to
sim:nsh:CONFIG_NET_LOCAL was left disabled intentionally so AF_LOCAL sockets are handled by sim usrsock; otherwise native NuttX local sockets can handle AF_LOCAL before the sim usrsock backend is
exercised.
Build:
Runtime test:
Expected output:
The test verifies: