Fix directory operations to comply with ISO 11783-13:2021 (sections
C.3.4.2 and C.3.5.2), which specifies that directory operations differ
significantly from standard file operations:
- The Count parameter in a Read File request represents the number of
directory entries to read, not the number of bytes.
- The Offset parameter in a Seek File request represents the logical
entry index, not a byte offset.
The previous implementation treated directories strictly as files,
using byte-based offsets and counts. This resulted in incorrect seeking
behavior and protocol violations when listing directories.
Align the implementation with the standard by:
1. Server side:
- Introduce isobusfs_srv_dir_entry_visible() to consistently
filter out invalid (unreadable, hidden, oversized) entries. This
ensures that entry indices remain stable.
- Implement isobusfs_srv_dir_skip_entries() to advance the
directory stream by logical visible entries rather than bytes.
- Update the Read File handler to interpret count as the
maximum number of entries and return the number of entries read
in the response header.
- Update the Seek File handler to seek by entry index.
2. Client side:
- Calculate the request count based on the number of minimal-size
entries that fit into the maximum data length.
- Interpret the response count as the number of entries received
rather than the byte length of the payload.
Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
The cmd_exit() function used -EINTR to signal a clean exit from the
interactive mode. This is semantically incorrect because EINTR is an
errno value meant for system call interruptions, not application-level
control flow.
Stop using -EINTR for cmd_exit(). Introduce ISOBUSFS_CLI_RET_EXIT (a
positive return code) to distinguish control flow from actual errors.
Map this to exit code 0 in main(), keeping negative errno values for
real errors. This makes the exit path explicit and prevents confusion
with actual interrupted system calls.
Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
Add expected_size field to test patterns to properly validate cases
where the requested read size exceeds the actual file size. This allows
testing the server's behavior when clients request more data than is
available.
When a read request is larger than the file, the server correctly
returns data up to EOF. The test framework now distinguishes between
this expected scenario and genuine read failures.
Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
Move part of isobusfs which can be reused by other applications to the
libj1939. By the way, reuse some of new libj1939 code in the j1939cat.
Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
Modify the isobusfs_log function in isobusfs_cmn.c to explicitly limit
the lengths of the time_buffer, level_str, and log_entry strings in
the snprintf format string to 40, 10, and 150 characters respectively.
This change acknowledges that truncation may still occur, but it is now
explicit and controlled.
This change silences the following warning:
cmake -DCMAKE_BUILD_TYPE=Debug -D CMAKE_C_COMPILER=gcc -B build
cmake --build build
/home/isobusfs/isobusfs_cmn.c: In function 'isobusfs_log':
/home/isobusfs/isobusfs_cmn.c:104:30: warning: '%s' directive output
may be truncated writing up to 191 bytes into a region of size between
182 and 245 [-Wformat-truncation=]
104 | "[%s] [%s]: %s", time_buffer, level_str, log_entry);
| ^~ ~~~~~~~~~
/home/isobusfs/isobusfs_cmn.c:103:9: note: 'snprintf' output 12 or more
bytes (assuming 266) into a destination of size 256
103 | snprintf(complete_log_entry, sizeof(complete_log_entry),
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
104 | "[%s] [%s]: %s", time_buffer, level_str, log_entry);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
The memset in isobusfs_srv_volume_status_resp() was attempting to make a
padding beyond the buffer. Fix it.
Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
Kernel may notify us about some error, which may happens if the bus was
in the error state. But this is not a good reason to kill application,
especially the server side.
Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
Fix following clang warnings:
CC isobusfs/isobusfs_srv_fa.o
isobusfs/isobusfs_srv_fa.c:387:6: warning: variable 'handle' is used
uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (ret < 0) {
^~~~~~~
isobusfs/isobusfs_srv_fa.c:411:15: note: uninitialized use occurs here
res.handle = handle;
^~~~~~
isobusfs/isobusfs_srv_fa.c:387:2: note: remove the 'if' if its condition is
always false
if (ret < 0) {
^~~~~~~~~~~~~~
isobusfs/isobusfs_srv_fa.c:368:6: warning: variable 'handle' is used
uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (name_len > ISOBUSFS_MAX_PATH_NAME_LENGTH) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
isobusfs/isobusfs_srv_fa.c:411:15: note: uninitialized use occurs here
res.handle = handle;
^~~~~~
isobusfs/isobusfs_srv_fa.c:368:2: note: remove the 'if' if its condition is
always false
if (name_len > ISOBUSFS_MAX_PATH_NAME_LENGTH) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
isobusfs/isobusfs_srv_fa.c:362:6: warning: variable 'handle' is used
uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (name_len > msg->len - sizeof(*req)) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
isobusfs/isobusfs_srv_fa.c:411:15: note: uninitialized use occurs here
res.handle = handle;
^~~~~~
isobusfs/isobusfs_srv_fa.c:362:2: note: remove the 'if' if its condition is
always false
if (name_len > msg->len - sizeof(*req)) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
isobusfs/isobusfs_srv_fa.c:356:6: warning: variable 'handle' is used
uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (!client) {
^~~~~~~
isobusfs/isobusfs_srv_fa.c:411:15: note: uninitialized use occurs here
res.handle = handle;
^~~~~~
isobusfs/isobusfs_srv_fa.c:356:2: note: remove the 'if' if its condition is
always false
if (!client) {
^~~~~~~~~~~~~~
isobusfs/isobusfs_srv_fa.c:352:16: note: initialize the variable 'handle' to
silence this warning
uint8_t handle;
^
= '\0'
isobusfs/isobusfs_srv_fa.c:505:9: warning: variable 'entry_count' set but not
used [-Wunused-but-set-variable]
size_t entry_count = 0;
^
5 warnings generated.
Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
Fixes the following warning:
| isobusfs/isobusfs_cmn.c: In function 'isobusfs_get_timeout_ms':
| isobusfs/isobusfs_cmn.c:140:51: warning: format '%ld' expects argument of type 'long int', but argument 2 has type 'int64_t' {aka 'long long int'} [-Wformat=]
| 140 | warn("timeout too long: %ld ms", time_diff);
| | ~~^ ~~~~~~~~~
| | | |
| | | int64_t {aka long long int}
| | long int
| | %lld
Before more contributions will come, change the license and make this
project usable as a library.
Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
Introduce the ISOBUS File Server (FS) interface, compatible with ISO
11783-13. The implementation utilizes the kernel's existing CAN J1939
socket support.
For testing following setup can be used:
ip link add type vcan
ip l s dev vcan0 up
j1939acd -r 64-95 -c /tmp/1122334455667788.jacd 1122334455667788 vcan0 &
j1939acd -r 96-127 -c /tmp/1122334455667789.jacd 1122334455667789 vcan0 &
sleep 1
isobusfs-srv -i vcan0 -n 1122334455667788 -v vol1:/path/to/export/
isobusfs-cli -i vcan0 -n 0x1122334455667789 -m 0x1122334455667788 -I
Interactive mode currently support following commands:
exit - exit interactive mode
quit - exit interactive mode
help - show this help
dmesg - show log buffer
selftest - run selftest
ls - list directory
ll - list directory with long listing format
cd - change directory
pwd - print name of current/working directory
get - get file
Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>