Releases: jrohel/NetMount
NetMount client version 1.8.1, server version 1.8.1, ninstall version 1.0, and nmmanage version 1.1.0
Changes in NetMount client version 1.8.0 -> 1.8.1
Other
-
use unsigned comparisons in int2F_redirector
If the redirector does not handle a requested function, control is
passed to the next INT 0x2F handler. This also applies to network
requests for disks managed by the redirector, which typically end
in DOS returning "function number invalid."Function numbers are bytes. The redirector previously used the signed
"JG" instruction to check whether the requested function was outside its
table. This worked fine for network redirector functions, which were
always <127 (positive in signed logic).FreeDOS Kernel 2044 (v2.44, 2026) introduced a new function 0xA3 to
report total and free sizes of disks larger than 2 GiB (up to 256 TiB).
Interpreted as a negative number in signed comparison, it appeared
within the table and was incorrectly treated as supported. However,
the function handler was missing, so the redirector did nothing, leaving
registers unchanged and reporting an incorrect disk size.NetMount client 1.8.0 added support for 0xA3. However, without this fix,
any future function with code 128 and above could trigger the same
problem.This fix replaces all signed conditional jumps in int2F_redirector
with unsigned versions, fixing function detection and preventing
misinterpretation of function codes 128 and above.
Changes in NetMount server version 1.8.0 -> 1.8.1
Security
-
Check client path for path traversal attacks
When
name_conversion=OFF, only minimal modifications are applied to the
client-supplied path (lowercasing). This could be exploited by an attacker
crafting a request with a path containing..to escape the shared
directory (path traversal attack).The client path is now validated before being mapped to the server path
(for allname_conversionmodes). If an attempt to escape the shared
directory is detected, the request is rejected with "path not found" and a
security alert is logged. -
Check for operation on root directory
An attacker may attempt (by crafting a request) to manipulate the shared
directory itself — for example, delete it or read/modify its attributes.
The only legitimate operation on the shared directory root ischdir.Operations are now checked to detect forbidden manipulation of the shared
directory. If such an attempt is detected, the request is rejected with
"access denied" and a security alert is logged.
Fixes
-
Fix
Drive::get_server_name: remove stale directory list entryIf an entry was present in the in-memory directory list but the
corresponding file no longer existed on disk, the server would return a
path to a non-existent file.The stale entry and the corresponding
fcb_namesentry are now removed
from the directory list, and an empty path is returned instead.
Other
-
SERVER.md: document backslash escaping in shared path definitions
The
\character is used as an escape character in shared path definitions
and must be doubled (e.g.,C:\\INSTALLinstead ofC:\INSTALL).
An example showing a path containing a,character was also added
(D=/share_with\,comma). -
Optimize
unicode_to_asciiwith conditional compilationUse conditional compilation to include only the relevant conversion
function:convert_utf8_to_asciiis used on non-Windows platformsconvert_windows_unicode_to_asciiis used only on Windows platforms
-
Fix missing closing bracket in
[--bind-port=<UDP_PORT>]The usage string in the help output,
README.md, andSERVER.mdwas
missing the closing>bracket in[--bind-port=<UDP_PORT>].
Binaries
The release includes the complete NetMount source code (server, DOS client, NInstall and NMManage DOS utilities), as well as:
- 2 builds of the DOS client: for 8086 and 80286 CPUs
- 2 statically linked builds of the server for Windows: for i686 and x86_64 (cross-compiled using MinGW on Linux)
- 4 statically linked builds of the server for Linux: i686, x86_64, ARM aarch64 big endian, ARM aarch64 little endian
- the "netmount-u2a.map" file with the transliteration table
For transliteration of Unicode characters in filenames to ASCII, the NetMount server requires the file netmount-u2a.map, containing the transliteration table, to be placed next to the server binary.
The full path to the transliteration file can be changed using the argument "--translit-map-path=<PATH>".
To disable transliteration, set an empty path using "--translit-map-path=". If transliteration is disabled,
non-ASCII characters will be replaced with underscores (_).
Name conversion can be completely disabled for a specific share using "name_conversion=OFF".
Other utilities have not changed in this release. If needed, use builds from the older releases.
NetMount client version 1.8.0, server version 1.8.0, ninstall version 1.0, and nmmanage version 1.1.0
Changes in NetMount client version 1.7.1 -> 1.8.0
Features
-
Send updated file timestamp to server on close
Upon closing a file, the NetMount client checks whether the file's
timestamp has changed since it was opened - for example, if DOS
updated the file timestamp. If the NetMount server supports extended
features, the client sends the updated timestamp to the server.The server can then apply this timestamp, depending on its
configuration, to set the file's last-write time. -
Add support for DISK_INFO_LARGE request (up to 256 TiB)
Original DISK_INFO request is limited to 2 GiB - 32 KiB due to
16-bit total_clusters and available_clusters fields.DISK_INFO_LARGE is a newly added request in DOS network redirectors,
supported by newer DOS implementations (e.g., FreeDOS Kernel 2044 /
version 2.44, 2026). It uses 32-bit total_clusters and available_clusters,
allowing reporting of disks up to 256 TiB - 64 KiB. Original DISK_INFO
behavior remains unchanged.If the NetMount server does not support DISK_INFO_LARGE, the client
falls back to using the original DISK_INFO request.
Other
-
Add has_drive_extended_features to shared_data
Adds a bit in the shared_data structure indicating whether a
particular NetMount server supports extended features.The client ABI version has been increased to 2, with a minimum
compatible version remaining 1.The has_drive_extended_features bit field was deliberately placed
at the end of the shared_data structure to preserve the layout
of existing fields and maintain backward ABI compatibility. -
Initialize has_drive_extended_features from server responses
When a NetMount client connects to a remote share, it initially sets
the corresponding bit in has_drive_extended_features to 0. This is
the safe default, indicating that extended features are not assumed
to be supported until the client has confirmed them.As communication with the server proceeds, the server indicates in
its responses whether extended features are supported. The client
updates the has_drive_extended_features bit accordingly to reflect
the actual server capabilities.
Changes in NetMount server version 1.7.0 -> 1.8.0
Features
-
Support setting file last-write timestamp on close
Allow client to provide requested timestamp when closing a file.
Timestamp is applied only ifclient_timestampis enabled.A new shared directory option was introduced:
client_timestamp=<ENABLED>use client timestamp if present:0=OFF,1=ON(default:ON)Introduce new
DRIVE_PROTO_EXT_FEATURES_FLAGin the NetMount protocol
header. Clients set this flag to indicate that a specificCLOSE_FILE
request is extended and contains the timestamp. The server sets this
flag in theCLOSE_FILEreply whenclient_timestampis enabled. -
Improve disk info precision with smaller sector sizes
The server previously reported total and free space using fixed 32 KiB sectors.
Now it chooses the smallest sector size that is 512 bytes times a power of two
(512, 1024, 2048, etc.), capped at 32 KiB. This change allows more accurate disk
space reporting on small drives. -
Add support for DISK_INFO_LARGE request (up to 256 TiB)
Original
DISK_INFOrequest is limited to 2 GiB - 32 KiB due to
16-bit total_clusters and available_clusters fields.DISK_INFO_LARGEis a newly added request in DOS network redirectors,
supported by newer DOS implementations (e.g., FreeDOS Kernel 2044 /
version 2.44, 2026). It uses 32-bit total_clusters and available_clusters,
allowing reporting of disks up to 256 TiB - 64 KiB. OriginalDISK_INFO
behavior remains unchanged -
Add support for NETMOUNT_FEATURE_QUERY
Server now supports the
NETMOUNT_FEATURE_QUERYrequest, allowing
clients to query if a specific NetMount feature is supported.
This enables future extension of server services while preserving
existing behavior. -
Set DRIVE_PROTO_FLAG_EXTENDED_FORMAT in responses
Setting this flag in responses indicates that the server supports
NETMOUNT_FEATURE_QUERY, as well as the extendedCLOSE_FILEand
DISK_INFO_LARGEoperations.This informs clients that they can make use of the server’s
extended features.Note:
If file client timestamps are ignored (client timestamps are disabled
in the server configuration), theCLOSE_FILEreply will clear this
flag. In all other responses, the flag remain`s set
Other
-
Flush stdout after printing status table
-
Flush stderr after each log message and dump packet
-
Optimize volume label handling
Requests for volume labels are handled directly without generating
a directory list. However, if the client called find_next, the server
would still iterate over the old directory list unnecessarily, even
though it would not return any more results.Now, the unnecessary iteration is not performed.
-
Define and use DRIVE_PROTO_FLAG_CHECKSUM_USED, DRIVE_PROTO_FLAG_RO_SHARE
Defining and using these constants in the code is better than relying on magic numbers.
-
help: add missing attrs for repeated drives
-
Adjust priorities of log messages
Update the priority of several log messages. The NetMount server
supports configurable logging verbosity, and these changes make
the output more useful at different log levels. -
Improve log/exception messages and use
__func__Minor adjustments to log and exception messages, replacing
manual function name strings with the standard__func__variable.
Changes in NMManage version 1.0.0 -> 1.1.0
Features
-
Add support for ABI 2 and bump version to 1.1.0
NMManage version 1.1.0 extends the "
DRIVE <drive> INFO" command to
show whether a drive supports extended features. There are three
possible states:- "Server HAS_EXTENDED_FEATURES: YES"
- "Server HAS_EXTENDED_FEATURES: NO"
- "Client does not support extended features"
Additionally, the "
DRIVE <drive> GET HAS_EXTENDED_FEATURES" command
was added. This command reports two possible states:- "
YES" - supported by both client and server - "
NO" - not supported by client or server
Binaries
The release includes the complete NetMount source code (server, DOS client, NInstall and NMManage DOS utilities), as well as:
- 2 builds of the DOS client: for 8086 and 80286 CPUs
- 2 statically linked builds of the server for Windows: for i686 and x86_64 (cross-compiled using MinGW on Linux)
- 4 statically linked builds of the server for Linux: i686, x86_64, ARM aarch64 big endian, ARM aarch64 little endian
- the "netmount-u2a.map" file with the transliteration table
- 1 build of the DOS utility NMManage for the 8086 CPU
For transliteration of Unicode characters in filenames to ASCII, the NetMount server requires the file netmount-u2a.map, containing the transliteration table, to be placed next to the server binary.
The full path to the transliteration file can be changed using the argument "--translit-map-path=<PATH>".
To disable transliteration, set an empty path using "--translit-map-path=". If transliteration is disabled,
non-ASCII characters will be replaced with underscores (_).
Name conversion can be completely disabled for a specific share using "name_conversion=OFF".
Other utilities have not changed in this release. If needed, use builds from the older releases.
NetMount client version 1.7.1, server version 1.7.0, ninstall version 1.0, and nmmanage version 1.0.0
Changes in NetMount client version 1.7.0 -> 1.7.1
Fixes
-
fix missing read buffer invalidation on file truncation
Invalidate the read buffer if it contains data that was removed by
file truncation.This can occur when the file is truncated via a write operation with
zero-length data or when the file is reopened and replaced with an
empty file.
Changes in NetMount server version 1.6.0 -> 1.7.0
Features
-
Support for read-only shares
The server now supports read-only shares. Clients have read-only access to these shares.
A new shared directory option was introduced:
readonly=<MODE>enable read-only sharing: 0 = writable, 1 = read-only (default: writable)Example usage:
$ ./netmount-server/netmount-server C=/srv/C,readonly=1 D=/srv/D attrs mode | access | drive | path extended | read-only | C | /srv/C extended | read/write | D | /srv/DWhen a share is configured as read-only, the server adds the read-only share flag
to every response header. This change is compatible with existing clients. They
ignore this flag, so no functionality is broken. New clients can make use of it. -
Add macOS build support with DOS attributes in extended attributes
Adds macOS-specific Makefile and filesystem implementation that stores
DOS attributes (archive, hidden, read-only, system) in extended attributes.macOS extended attribute support is adapted from the Linux
implementation with platform-specific changes and is currently untested.
Fixes
-
time_to_fat: Clamp time_t to valid DOS FAT timestamp range
Added boundary checks when converting time_t to DOS FAT timestamp.
DOS FAT supports times only between 1980-01-01 00:00:00 and
2107-12-31 23:59:58. Previously, times outside this range could result
in incorrect year values while other fields were correct.Now, the year is checked: if it is before 1980, the timestamp is set
to the minimum valid FAT time (1980-01-01 00:00:00). If it is after
2107, the timestamp is set to the maximum valid FAT time
(2107-12-31 23:59:58). -
Fix symlink handling
DOS does not support symlinks. Therefore, the NetMount server follows
symlinks and returns what they point to.Deleting a symlink deletes the link itself, not its target (file or
directory). Deleting a symlink that points to a non-empty directory is not
a problem on the server side, and the contents of the target directory are
not affected. However, DOS does not recognize symlinks, so DOS or its
applications may attempt to be "clever" and refuse to delete a link to a
non-empty directory, or even proactively delete the contents of the target
directory.Before this fix, a problem occurred when a symlink pointed to a nonexistent
path (a dangling symlink). When building the directory listing, such a link
incorrectly inherited the properties (size, date and time, attributes) of
the previous entry. Attempting to delete such a symlink resulted in an
unhandled exception (server crash).Now, a symlink pointing to a nonexistent file is listed as a zero-size file.
Its last modification date is set to 1980-01-01 00:00:00 (the minimum DOS FAT
timestamp), and all attributes (ARCHIVE, HIDDEN, READ ONLY, SYSTEM) are
cleared. Deletion has been fixed, and the symlink is now removed correctly
whether it points to an existing item or not.Attempts to create or replace a file where a dangling symlink already exists
now return ACCESS_DENIED. Previously, if the parent directory of the symlink
target existed but the final component did not, the server could create
the target file. Since DOS does not support symlinks, this behavior appeared
unintuitive, as a create/replace request could silently create a different
file than the one referenced by the client. -
Improve and unify error handling
Numerous changes have been made to error handling.
FilesystemError is now used in more places instead of std::runtime_error.
Added get_dos_err_code to extract the DOS error code from exceptions, and
mapped selected std::filesystem::filesystem_error cases to corresponding
DOS error codes.
Added log_exception_get_dos_err_code to unify exception logging and
error reporting.This unification also fixes previously unhandled exceptions.
-
Fix EXTENDED_OPEN_CREATE_FILE to disallow replacing read-only files
-
Disallow replacing a file if it would remove the system attribute
This aligns the behavior with DOS.
-
Fix write_file to not check the read-only attribute
The read-only attribute is handled at open time. Files opened with CREATE_FILE
(create or truncate) must remain writable. Checking the attribute in write_file
would incorrectly block writes to a newly created or truncated file marked
as read-only. -
Ignore read-only attribute on directories
Attributes on directories are preserved but not enforced.
This aligns the behavior with DOS.
-
Sync error codes with MS-DOS
Tested which error codes are returned by MS-DOS 5.0, MS-DOS 6.22, and MS-DOS 7.1
in various scenarios, and updated the NetMount server to return the same error codes. -
Refresh directory list after creating new file
Required when filename conversion mode is enabled to ensure that
subsequent operations can see the newly created file. -
Verify file can be opened before granting access
Added
try_open_file()helper.OPEN_FILEandEXTENDED_OPEN_CREATE_FILE
operations now calltry_open_fileto attempt opening the existing file
in the requested mode.Previously, there were cases where DOS attributes allowed access but
server-side file permissions did not.OPEN_FILEandEXTENDED_OPEN_CREATE_FILE
could incorrectly report success even when the requested mode was not
permitted by the server.Example: a request to open a file for read/write could succeed in these
operations even if the server allowed read-only access. This caused
subsequent writes to fail, and reads could erroneously succeed even though
the file should not have been openable.
Binaries
The release includes the complete NetMount source code (server, DOS client, and the NInstall DOS utility), as well as:
- 2 builds of the DOS client: for 8086 and 80286 CPUs
- 2 statically linked builds of the server for Windows: for i686 and x86_64 (cross-compiled using MinGW on Linux)
- 4 statically linked builds of the server for Linux: i686, x86_64, ARM aarch64 big endian, ARM aarch64 little endian
- the "netmount-u2a.map" file with the transliteration table
For transliteration of Unicode characters in filenames to ASCII, the NetMount server requires the file netmount-u2a.map, containing the transliteration table, to be placed next to the server binary.
The full path to the transliteration file can be changed using the argument "--translit-map-path=<PATH>".
To disable transliteration, set an empty path using "--translit-map-path=". If transliteration is disabled,
non-ASCII characters will be replaced with underscores (_).
Name conversion can be completely disabled for a specific share using "name_conversion=OFF".
Other utilities have not changed in this release. If needed, use builds from the older releases.
NetMount client version 1.7.0, server version 1.6.0, ninstall version 1.0, and nmmanage version 1.0.0
Changes in NetMount client version 1.6.0 -> 1.7.0
Fixes
-
pktdrv_init: Fix releasing packet driver handle for ARP frames
There was a bug in the argument: the type of ARP frame was passed
instead of the handle. The code is executed only in the event of
a packet driver initialization failure, and only when the handler for
ARP frames was successfully registered but the registration of the IPv4
handler subsequently failed. This scenario normally does not occur.
Other
-
Remove redundant GPL-2.0 license file
-
Block reception of frames until netmount is fully initialized
-
Add checks when retrieving local MAC address from packet driver
-
Add NetMount client and ABI version info to shared data
Prepares the shared data structure for use by external programs
that will interact with the NetMount client. -
Restrict packet driver interrupt range to 0x60–0x80
Previously, the valid range was 0x60–0xFF. The upper limit was reduced
to 0x80 to match the range of software interrupts used by DOS packet
drivers (0x60–0x80). -
Define and use new/renamed configuration macros
-
Check installed NetMount version for compatibility
-
Move shared_data struct and parameter macros to shdata.h
Moved the definition of
struct shared_dataand the NetMount client
parameter macros from netmount.c to shdata.h.This allows other programs (e.g. the upcoming NetMount management tool)
to access shared_data and related configuration limits (min/max/default)
without duplicating definitions. -
Move additional header files to "shared" directory
Moved shdata.h, exitcode.h, nettypes.h, and pktdrv.h into the existing
"shared" directory, which already contains headers shared with the
NetMount server. This makes these headers available to other programs
in the future (e.g., the upcoming NetMount management tool).
Added NMManage DOS utility for reading/modifying params of NetMount DOS client
Key Features
- Display general information about NMManage and the installed NetMount client.
- Inspect and configure global network settings.
- List all currently mounted network drives and view or modify individual drive options.
- Access and modify IP-to-MAC address table entries.
Binaries
The release includes the complete NetMount source code (server, DOS client, NInstall and NMManage), as well as:
- 2 builds of the DOS client: for 8086 and 80286 CPUs
- 1 build of the DOS utility NMManage for the 8086 CPU
The NetMount server and NInstall have not changed in this release; if needed, use builds from the older release https://github.com/jrohel/NetMount/releases/tag/client-v1.6.0%2Cserver-v1.6.0%2Cninstall-v1.0 .
NetMount client version 1.6.0, server version 1.6.0, and ninstall version 1.0
Changes in NetMount client version 1.5.0 -> 1.6.0
Features
-
Support hexadecimal numbers in arguments
NetMount still accepts numbers in decimal by default, but if a number in an argument starts
with"0x"or"0X", it is now interpreted as a hexadecimal number. -
Read-ahead buffering for file reads
By default, it uses a 64-byte buffer and, when reading files, requests at least 64 bytes
from the server to fill this buffer - assuming that subsequent reads will be sequential and
can be served directly from it. This change results in up to 64x faster reads when
the application reads 1 byte at a time, and 16x faster for 4-byte blocks. Read-ahead buffering
also reduces the load on the network and the NetMount server. Serving a single 64-byte read is
much less demanding than handling 16 separate 4-byte requests, or 64 one-byte requests.The size of the read-ahead buffer is configurable using the
/MIN_READ_LEN:<length>argument.
The<length>value may be one of the following:0,1,2,4,8,16,32, or64.
Setting it to0disables read-ahead buffering entirely.
If the/MIN_READ_LEN:<length>argument is not provided, the default value of64is used.
This setting is independent for each mounted drive. However, internally, the NetMount client uses
a single shared 64-byte read-ahead buffer for all mounted drives, and the setting determines
how many bytes from the beginning of the buffer are used by each drive.Read-ahead buffering is applied only when the read request is smaller than the configured buffer
size. Larger reads bypass the buffer.
Other
-
Optimize memory usage
Release environment from memory, and do it during the INSTALL phase
-
Extend validation of arguments
-
Add 8086/80286 targets to Makefile and disassembly
-
Add documentation section on sharing a network interface with other applications
Changes in NetMount server version 1.5.0 -> 1.6.0
Features
-
Improve server file names conversion to DOS 8.3 format
Previously, invalid characters in filenames were removed.
The updated logic now attempts to transliterate Unicode characters to ASCII.
It removes combining characters (accents, diacritics, etc.) and replaces
non-ASCII characters with their ASCII equivalents.By default, the transliteration mapping table is loaded from the file
"netmount-u2a.map", but the path can be changed using the--translit_map_path=<PATH>argument.
Setting<PATH>to an empty string disables the use of the mapping table.The mapping table is user-extensible and can be customized easily.
If a Unicode character is not found in the mapping table, it is replaced by an underscore '_'.Examples:
original name old conversion new but missing map file new conversion data.tar.gzDATATA~1.GZDATA_TAR.GZDATA_TAR.GZNašePísně.docNAEPSN~1.DOCNA_EP_~1.DOCNASEPI~1.DOCpíseň.txtPSE~1.TXTP_SE_.TXTPISEN.TXTистория.txt~1.TXT_______.TXTISTORIJA.TXT
Added NInstall DOS utility
The "ninstall" utility installs (loads) the DOS TSR NetMount driver using parameters specified
in a configuration file. Specifically, it launches "NETMOUNT INSTALL" in the current working
directory and passes the supported parameters from the file as command-line arguments.
The user may also provide additional arguments.
The configuration file must contains lines in the format "<key> <value>".
Supported keys are: "IPADDR", "NETMASK", "GATEWAY", "PACKETINT", and "MTU".
The file must include the "IPADDR" key; all other keys are optional.
All other lines are ignored.
This format was chosen to be compatible with the configuration file used by the mTCP project.
For example, a file generated by the mTCP DHCP client can be used directly.
Binaries
The release includes the complete NetMount source code (server, DOS client, and the NInstall DOS utility), as well as:
- 2 builds of the DOS client: for 8086 and 80286 CPUs
- 2 statically linked builds of the server for Windows: for i686 and x86_64 (cross-compiled using MinGW on Linux, tested using Wine on Linux, and on Windows XP SP3)
- 4 statically linked builds of the server for Linux: i686, x86_64, ARM aarch64 big endian, ARM aarch64 little endian
- 1 build of the DOS utility NInstall for the 8086 CPU
- the "netmount-u2a.map" file with the transliteration table
For transliteration of Unicode characters in filenames to ASCII, the file netmount-u2a.map
with the transliteration table must be placed next to the server binary.
If this file is missing, non-ASCII characters will be replaced with underscores (_).
Previously, DOS binaries were built under Wine using the Windows version of Open Watcom v2.
They are now built using the Linux version of Open Watcom v2.
NetMount client version 1.5.0 and server version 1.5.0
Changes in NetMount server version 1.4.2 -> 1.5.0
Features
-
Support storing DOS attributes on FreeBSD, Linux, and Windows
Previously, DOS attributes (
ARCHIVE,HIDDEN,READONLY,SYSTEM) were
only supported on Linux and only when using the FAT file system. This version
extends support to FreeBSD and Windows, and adds the ability to use
additional file systems.DOS attributes can now be stored using either native file system support
or extended attributes ("user.NetMountAttrs"). This allows DOS attributes
to be stored even on file systems that do not natively support them,
as long as they support extended attributes.Support for storing attributes on directories has also been added;
previously, only files were supported.A new shared directory option was introduced:
attrs=<storage_method>Method to store DOS attributes:
AUTO,IGNORE,NATIVE,EXTENDED(default:AUTO)-
AUTO- Automatically select the best available method. -
IGNORE- Ignore all DOS attribute requests. Reading returns
ARCHIVEfor files, none for directories. -
NATIVE- Use OS-native support (typically via file system). -
EXTENDED- Store one-byte DOS attributes in the extended attribute
"user.NetMountAttrs".
Method support by OS:
-
All platforms support
IGNORE. -
FreeBSD and Linux support
NATIVE(FAT only) andEXTENDED.
AUTOmode on these systems prefers:NATIVE(if supported)EXTENDED(if supported)IGNORE(as fallback)
-
Windows supports
NATIVE(via standard API) and defaults to it inAUTOmode.
-
-
Check DOS
READONLYattribute when opening for write, writing, or deletingWhen running on Windows, the server uses native support for DOS
attributes, and the operating system itself enforcesREADONLYchecks
before write or delete operations. However, on other operating systems -
especially when DOS attributes are stored as extended attributes -
the OS ignores them, treating them as regular user data.The server now explicitly checks the DOS
READONLYattribute before
allowing operations that would modify a file, such as opening for writing,
writing to the file, deleting a file, or removing a directory. This ensures
access control when sharing files with DOS-style attributes. -
Support Unicode filenames on Windows
Thanks to support for mapping long and non-ASCII filenames to
the DOS 8.3 format, it is possible to share files with non-ASCII names.
The issue occurred when running on Windows, where thefopen,rename,
stat, andtruncatefunctions use the local 8-bit encoding for
filenames, which depends on the system locale.The
renameandstatfunctions have been replaced with C++
std::filesystemequivalents, which work correctly with UTF-16
on Windows. Thefopenfunction has been replaced with
the Windows-specific_wfopen, which supports UTF-16.
Thetruncatefunction has been reimplemented specifically for Windows.
Other
-
ReplyCache – check whole request, cache no responses
The response uses the same sequence number as the request. Originally,
the server only checked whether the cached response had the same
sequence number as the newly received request. If so, the request
was not processed further and the cached response was reused.Now, the request itself is also stored in the cache, not just
the response. When a new request arrives with the same sequence number,
its length is compared first, and if it matches, the entire content
of the request is compared as well.This prevents a situation where a response to a previous request could
be incorrectly reused for a different request with the same sequence
number. While such collisions are rare, they can occur - for example,
if a client's last request used sequence number 1 and the client
then restarted, it might send a different request with the same sequence
number (1) after restart.Another change concerns requests that do not trigger a response
(malformed requests). Previously, repeated invalid requests would be
reprocessed each time. Now, such requests are also cached along
with the information that no response was sent, preventing repeated
processing.
Binaries
The release includes the complete NetMount source code (server and DOS client) and staticaly linked server builds:
- 2 builds of server for Windows: for i686 and x86_64 (cross-compiled using MinGW on Linux, tested using Wine on Linux, and on Windows XP SP3)
- 4 builds of server for Linux: i686, x86_64, ARM aarch64 big endian, ARM aarch64 little endian
The DOS client has not changed in this release; if needed, use DOS client builds from the older release https://github.com/jrohel/NetMount/releases/tag/client-v1.5.0%2Cserver-v1.2.0 .
NetMount client version 1.5.0 and server version 1.4.2
Changes in NetMount server version 1.4.1 -> 1.4.2
NetMount Server 1.4.2 focuses on improved compatibility with older systems and optimization.
Build compatibility with FreeBSD 14.2 has been restored. This fixes a regression introduced in NetMount
1.4.0, where the use of std::chrono::utc_clock in the logging system broke the build on platforms
lacking support for it.
On Windows, the networking library is no longer linked unnecessarily when it's not needed - when
using serial port sharing via the built-in network stack.
Furthermore, on systems older than Windows Vista that lack support for inet_pton and inet_ntop,
the server automatically falls back to using the legacy inet_addr and inet_ntoa functions.
Optimizations
-
Optimize volume label handling by skipping directory list
Volume label requests are now handled directly, without generating
the directory list.
Compatibility with older systems
-
Use
chrono::system_clockinstead ofchrono::utc_clockin logstd::chrono::system_clockis sufficient for logging purposes.
The resulting binary is smaller, and thesystem_clockis supported
by older standard libraries, which improves compatibility. For example,
the standard library in FreeBSD 14.2 does not support
std::chrono::utc_clock. -
udp_socket_win: Use our to_big/from_big instead of hton/ntoh
Replaced calls to
htons,ntohs, andntohlwith our ownto_big16,
from_big16, andfrom_big32functions. These are already used elsewhere
in the codebase, so we no longer need to rely on the Windows versions. -
udp_socket_win: Dynamic load "ws2_32.dll" at runtime when needed
The "ws2_32.dll" dependency is now loaded dynamically at runtime, and only
if networking functionality is actually required. Previously, the library
was linked at build time, which meant network functions were always needed,
even when unused - such as when using serial port sharing.When serial port sharing is used, the server relies on a built-in,
OS-independent network implementation. Therefore, there's no need to
depend on Windows networking libraries at all.This change allows the server to run and share data over a serial port
even on Windows systems without networking support (e.g., stripped-down
configurations). Previously, Windows Vista or later was required due to
link-time dependencies oninet_ptonandinet_ntop. -
udp_socket_win: inet_pton/ntop fallback for pre-Vista Windows
On Windows,
inet_ptonandinet_ntopare only supported starting with
Windows Vista. To maintain compatibility with older versions, custom
helper functionsip_from_stringandip_to_stringwere introduced.These helpers use
inet_pton/inet_ntopwhen available, and fall back
to the legacyinet_addrandinet_ntoafunctions otherwise. This
ensures IPv4 support across a wider range of Windows versions.
The legacy functions have been available since the early days of IPv4
support in Windows - at least since Windows 95 and Windows NT 3.1.
Other
-
udp_socket_win: Log NOTICE if falling back to inet_ntoa/addr
Logs a NOTICE if
inet_ptonandinet_ntopare unavailable (likely
on pre-Vista Windows), and the server falls back to usinginet_addr
andinet_ntoa.
Binaries
The release includes the complete NetMount source code (server and DOS client) and server builds:
- 2 builds of server for Windows: for i686 and x86_64 (cross-compiled using MinGW on Linux, tested using Wine on Linux, and on Windows XP SP3)
- 4 builds of server for Linux: i686, x86_64, ARM aarch64 big endian, ARM aarch64 little endian (ARM binaries tested using QEMU)
The DOS client has not changed in this release; if needed, use DOS client builds from the older release https://github.com/jrohel/NetMount/releases/tag/client-v1.5.0%2Cserver-v1.2.0 .
NetMount client version 1.5.0 and server version 1.4.1
Changes in NetMount server version 1.4.0 -> 1.4.1
Fixes
-
Fix --help message - remove <> from label and name_conversion
-
Fix SLIP receive data length check
Fixed an off-by-one error in the SLIP frame decoding logic.
The server incorrectly reported a buffer overflow when receiving data
exactly equal to the buffer size (1500 bytes), effectively limiting
the maximum receive size to 1499 bytes (MTU 1499).
Sending was unaffected and allowed full 1500-byte frames.
This issue has now been resolved.
Other
-
Improve documentation
- README.md: mention of built-in SLIP protocol in the basic
description of netmount-server - Remove .exe in linux server example
- Use of only one type of dash character
- README.md: mention of built-in SLIP protocol in the basic
-
Added release dates to changelogs
-
Improved MTU documentation for serial transfer (SLIP)
Binaries
The release includes the complete NetMount source code (server and DOS client) and server builds:
- 2 builds of server for Windows: for i686 and x86_64 (cross-compiled using MinGW on Linux, tested using Wine on Linux)
- 4 builds of server for Linux: i686, x86_64, ARM aarch64 big endian, ARM aarch64 little endian (ARM binaries tested using QEMU)
The DOS client has not changed in this release; if needed, use DOS client builds from the older release https://github.com/jrohel/NetMount/releases/tag/client-v1.5.0%2Cserver-v1.2.0 .
NetMount client version 1.5.0 and server version 1.4.0
Changes in NetMount server version 1.3.0 -> 1.4.0
Features
-
Replace
err_printanddbg_printwith a level-based loggerPreviously, there were only two logging levels:
dbg_printanderr_print.
Additionally,dbg_printhad to be enabled at compile time.Now, both are replaced with a single
log()function that supports seven
logging levels:CRITICAL,ERROR,WARNING,NOTICE,INFO,DEBUG, andTRACE.
Users can configure the desired logging verbosity at application startup.Log messages are written to standard error (stderr) and are automatically prefixed
with ISO 8601 timestamps with millisecond precision.A new program argument has been added
--log-level=<LEVEL>Logging verbosity level:0 = OFF,7 = TRACE(default:3) -
Add support for setting volume label for shared drives
Previously, shared drives had no volume label. Now, the user can specify
a label for each shared drive. If a volume label is not specified,
the default label "NETMOUNT" is used. To share a drive without a volume
label, an empty string can be passed:--label=.Added optional argument
<label>=<volume_label>to the shared drive definition:<label>=<volume_label>volume label (first 11 chars used,
default: NETMOUNT; use "--label=" to remove)
Fixes
-
Don't exit on error in Drive::Item::create_directory_list
If an error occurs during directory listing (e.g. when a request is made
to list a directory using a file-type argument), the error is now only
logged and does not cause the server to exit. -
Implement basic INT2F_UNLOCK_FILE handler
Previously, only the INT2F_LOCK_UNLOCK_FILE function (a client request)
was handled. INT2F_UNLOCK_FILE is now supported as well, but both
handlers currently only validate the file handle and log an ERROR if
the handle is invalid. Actual locking/unlocking is not yet implemented
and may be added later.
Other
-
dump_packet to stderr instead of stdout
-
server: create_server_path: Add path to exception message
-
Check if the shared path is a directory
Previously, this check was not performed, so the user could specify
a file (socket, device, ...) instead of a directory as the shared path. -
create_directory_list: Add "." and ".." entries only to non-root directories
Previously, "." and ".." entries were added to the list for all directories,
and thefind_filefunction skipped these entries for root directories.
Binaries
The release includes the complete NetMount source code (server and DOS client) and server builds:
- 2 builds of server for Windows: for i686 and x86_64 (cross-compiled using MinGW on Linux, tested using Wine on Linux)
- 4 builds of server for Linux: i686, x86_64, ARM aarch64 big endian, ARM aarch64 little endian (ARM binaries tested using QEMU)
The DOS client has not changed in this release; if needed, use DOS client builds from the older release.
NetMount client version 1.5.0 and server version 1.3.0
Changes in NetMount server version 1.2.0 -> 1.3.0
Features
-
Integrate SLIP support (implement IP, UDP, and SLIP protocols)
There are cases where having SLIP support built directly into netmount-server is useful. For example:
- The operating system does not support SLIP
- The user does not have permission to configure the system network
- The user wants to keep the SLIP client fully isolated from the system and other networks (preventing possible IP address conflicts between SLIP and other networks)
- The user prefers not to modify the system’s network configuration
- The user wants to quickly and easily run netmount-server over SLIP
This implementation adds new arguments:
--slip-dev=<SERIAL_DEVICE>Serial device used for SLIP (host network is used by default)--slip-speed=<SERIAL_SPEED>Baud rate of the SLIP serial device--slip-rts-cts=<ENABLED>Enable hardware flow control: 0 = OFF, 1 = ON (default: OFF)By default, netmount-server still uses the operating system’s network
stack. When the--slip-dev=<SERIAL_DEVICE>option is used, it switches
to the internal SLIP implementation and shares data via the specified
SERIAL_DEVICE. In this case, the--slip-speed=<BAUD_RATE>option is
required to set the baud rate of the serial device. Optionally, hardware
flow control can be enabled using--slip-rts-cts=1.The MTU of the built-in implementation is 1500 bytes - meaning
the maximum size of a received and transmitted IP packet is 1500 bytes.
To use a smaller MTU, configure it on the netmount DOS
client side. The client will send and request packets accordingly.The
--bind-addr=<IP_ADDR>option is not supported in this mode.
netmount-server responds to all IP addresses, and the source IP address
in reply matches the destination address of the incoming request.
UDP port handling works the same as when using the operating system’s
network stack - by default, netmount-server listens on port 12200, which
can be changed using the--bind-port=<UDP_PORT>option.The internal implementation is completely isolated from the system’s
network. The only requirement is user access to the serial port.Example usage:
netmount-server --slip-dev=/dev/ttyUSB0 --slip-speed=115200 C=/shared/ -
Remove shared FilesystemDB, each drive has its own handle table
Previously, all shared drives used a single items table. Since DOS uses
a 16-bit number to store the start cluster (which we use as a handle),
this limited the total number of entries across all shared drives to
65,535.Now, each shared drive has its own table, allowing up to 65,535 entries
per drive.Additionally, it's now possible to share the same directory multiple
times with different settings — in particular, with different
name_conversionconfigurations.
Other
- Optimize: Dynamically allocate slots for handles: Previously, memory for all handles
(65,535 slots) was allocated at program startup. Now, the slot space grows dynamically
as needed
Binaries
The release includes the complete NetMount source code (server and DOS client) and server builds:
- 2 builds of server for Windows: for i686 and x86_64 (cross-compiled using MinGW on Linux, tested using Wine on Linux)
- 4 builds of server for Linux: i686, x86_64, ARM aarch64 big endian, ARM aarch64 little endian (ARM binaries tested using QEMU)
The DOS client has not changed since the previous release; if needed, use DOS client builds from the previous release.