Skip to content

Releases: jrohel/NetMount

NetMount client version 1.8.1, server version 1.8.1, ninstall version 1.0, and nmmanage version 1.1.0

27 May 09:42

Choose a tag to compare

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 all name_conversion modes). 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 is chdir.

    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 entry

    If 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_names entry 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:\\INSTALL instead of C:\INSTALL).
    An example showing a path containing a , character was also added
    (D=/share_with\,comma).

  • Optimize unicode_to_ascii with conditional compilation

    Use conditional compilation to include only the relevant conversion
    function:

    • convert_utf8_to_ascii is used on non-Windows platforms
    • convert_windows_unicode_to_ascii is used only on Windows platforms
  • Fix missing closing bracket in [--bind-port=<UDP_PORT>]

    The usage string in the help output, README.md, and SERVER.md was
    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

13 Mar 11:27

Choose a tag to compare

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 if client_timestamp is 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_FLAG in the NetMount protocol
    header. Clients set this flag to indicate that a specific CLOSE_FILE
    request is extended and contains the timestamp. The server sets this
    flag in the CLOSE_FILE reply when client_timestamp is 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_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

  • Add support for NETMOUNT_FEATURE_QUERY

    Server now supports the NETMOUNT_FEATURE_QUERY request, 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 extended CLOSE_FILE and
    DISK_INFO_LARGE operations.

    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), the CLOSE_FILE reply 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

21 Feb 08:56

Choose a tag to compare

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/D
    

    When 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_FILE and EXTENDED_OPEN_CREATE_FILE
    operations now call try_open_file to 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_FILE and EXTENDED_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

21 Nov 21:59

Choose a tag to compare

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_data and 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

12 Oct 21:30

Choose a tag to compare

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, or 64.
    Setting it to 0 disables read-ahead buffering entirely.
    If the /MIN_READ_LEN:<length> argument is not provided, the default value of 64 is 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.gz DATATA~1.GZ DATA_TAR.GZ DATA_TAR.GZ
    NašePísně.doc NAEPSN~1.DOC NA_EP_~1.DOC NASEPI~1.DOC
    píseň.txt PSE~1.TXT P_SE_.TXT PISEN.TXT
    история.txt ~1.TXT _______.TXT ISTORIJA.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

08 Sep 20:09

Choose a tag to compare

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
      ARCHIVE for 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) and EXTENDED.
      AUTO mode on these systems prefers:

      1. NATIVE (if supported)
      2. EXTENDED (if supported)
      3. IGNORE (as fallback)
    • Windows supports NATIVE (via standard API) and defaults to it in AUTO mode.

  • Check DOS READONLY attribute when opening for write, writing, or deleting

    When running on Windows, the server uses native support for DOS
    attributes, and the operating system itself enforces READONLY checks
    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 READONLY attribute 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 the fopen, rename,
    stat, and truncate functions use the local 8-bit encoding for
    filenames, which depends on the system locale.

    The rename and stat functions have been replaced with C++
    std::filesystem equivalents, which work correctly with UTF-16
    on Windows. The fopen function has been replaced with
    the Windows-specific _wfopen, which supports UTF-16.
    The truncate function 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

20 Jul 09:17

Choose a tag to compare

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_clock instead of chrono::utc_clock in log

    std::chrono::system_clock is sufficient for logging purposes.
    The resulting binary is smaller, and the system_clock is 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, and ntohl with our own to_big16,
    from_big16, and from_big32 functions. 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 on inet_pton and inet_ntop.

  • udp_socket_win: inet_pton/ntop fallback for pre-Vista Windows

    On Windows, inet_pton and inet_ntop are only supported starting with
    Windows Vista. To maintain compatibility with older versions, custom
    helper functions ip_from_string and ip_to_string were introduced.

    These helpers use inet_pton/inet_ntop when available, and fall back
    to the legacy inet_addr and inet_ntoa functions 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_pton and inet_ntop are unavailable (likely
    on pre-Vista Windows), and the server falls back to using inet_addr
    and inet_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

12 Jul 09:55

Choose a tag to compare

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
  • 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

08 Jul 15:46

Choose a tag to compare

Changes in NetMount server version 1.3.0 -> 1.4.0

Features

  • Replace err_print and dbg_print with a level-based logger

    Previously, there were only two logging levels: dbg_print and err_print.
    Additionally, dbg_print had 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, and TRACE.
    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 the find_file function 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

02 Jul 11:48

Choose a tag to compare

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_conversion configurations.

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.