AminetAminet
Search:
85349 packages online
About
Recent
Browse
Search
Upload
Setup
Services

comm/tcp/Fitz.lha

Mirror:Random
Showing: m68k-amigaos iconppc-amigaos iconppc-morphos iconi386-aros iconi386-amithlon iconppc-warpup iconppc-powerup icongeneric iconother icon
No screenshot available
Short:Light TCP/IP network file server/mounter
Author:Timm S. Mueller, Claude Sonnet
Uploader:tmueller schulze-mueller de
Type:comm/tcp
Version:1.10
Architecture:m68k-amigaos; other
Date:2026-06-12
Download:comm/tcp/Fitz.lha - View contents
Readme:comm/tcp/Fitz.readme
Downloads:2

Overview
--------------------------------------------------------------------------

Fitz is a lightweight, cross-platform, symmetric network file server
and mounter.

No configuration files, no daemons, no hassle - just a single command
line program for sharing and mounting directories ad-hoc style.

For use on trusted LANs - at home behind a NAT gateway, in guest
networks that you can trust, or via SSH tunnel or VPN. Also use
the READONLY option when appropriate.

Currently supported: Amiga, Unixoid (FUSE3 for mounting e.g. on
Linux, FreeBSD, macOS)

Fitz goes both ways: You can share and mount - on all supported
platforms, both directions are supported. So of course you can share
an Amiga directory with other Amigas. You can run as many instances
as you like. There is no central server.

Fitz supports Amiga case-insensitive filenames, permission bits and
comments, not only when serving from an Amiga, but from Unix servers
as well. Support (through xattrs) is provided for Linux, FreeBSD,
macOS and probably others, and the required capabilities are detected
and negotiated with clients at runtime.


Simplest possible use
--------------------------------------------------------------------------

It's really very simple. Assume you have three computers in your home
network, the Amigas named atze and keule, and the Linux machine lotte:

  keule # fitz serve RAM:

  atze # fitz mount keule KEULE:

  lotte $ mkdir ~/keule
  lotte $ fitz mount keule ~/keule

  lotte $ mkdir ~/shared
  lotte $ fitz serve ~/shared

  atze # fitz mount lotte LOTTE:

  keule # fitz mount lotte LOTTE:

You can also share and mount based on symbolic service names, which are
automatically promoted inside your local network. In the following
example, not a single hostname or IP address is needed:

  keule # fitz serve RAM:T service temp

  lotte $ fitz serve ~/data service data
  
  atze # fitz mount :/temp TEMP:
  atze # fitz mount :/data DATA:

You may give the FitzCtrl utility a try, which allows you to administer
Fitz shares and mounts with a graphical user interface on the Amiga. For
getting started, you would just click "Add Server" on one Amiga, start
FitzCtrl on another, double click on the listed share, and be connected.


Requirements
--------------------------------------------------------------------------

Amiga: OS >= v37, bsdsocket.library v3, 68000 CPU

POSIX/FUSE, build requirements:
gcc or clang, FUSE3 library and headers (libfuse3-dev/fuse3-devel),
pthreads. Use macFUSE on macOS. If your OS does not support FUSE for
mounting, you may still try running the server, as it is largely POSIX
compliant. If your OS or filesystem does not provide xattrs, then the
server can still run and just deny clients certain capabilities.


Build and install
--------------------------------------------------------------------------

On Amiga:

  # copy fitz C:

Fitz is reentrant and can be made resident:

  # protect C:fitz p add
  # resident C:fitz

On macOS, install macFUSE:

  $ brew install macfuse
  
On Unixoid Fitz goes into /usr/local/bin:

  $ make all
  $ sudo make install
  
Building for Amiga requires the vbcc toolchain:

  $ make amiga

Use 'make help' to see a list of targets.


Getting started
--------------------------------------------------------------------------

WARNING: If you invoke 'fitz serve', Fitz simply starts serving the
current directory - without authentication.

Make sure you don't expose a share on a host or network interface
that is reachable from untrusted networks, such as the internet.
Typically it is safe to use behind a home router which is also a NAT
gateway, but make sure that this is the case.

1. Start by sharing an empty directory.

2. Copy the things to share into the shared directory. By default,
clients have no means to create links inside a share, but if you place
symlinks in a share, these can be traversed by clients, even if they
cannot create them or resolve them to their actual paths.

3. When there is no need for clients to write to a share, use the
READONLY option, so data can't be devastated, not even by accident.

4. You can enable a thin layer of security by specifying ASKPASS in the
server command line. This will prompt you for a password, and clients
will be prompted for that password as well. Authentication by default
implies encryption. You can also specify ENCRYPT in the command lines of
either server or client, which will require encryption from the other
side - even without authentication. See also Encryption for more details.


Usage
--------------------------------------------------------------------------

Share a directory:

  $ fitz serve [rootdir] [PORT num] [RO] [IFACE addr[:port]] [ASKPASS]
               [SERVICE name] [ENCRYPT] ( [TZOFFS sec] (Amiga only) )

  rootdir defaults to the current directory.
  PORT num defaults to 17711.
  Keyword RO (or READONLY) rejects all write operations.
  IFACE (or INTERFACE) binds to a specific address (e.g. 127.0.0.1),
  and optionally a port number. If not specified, the server binds to
  all of the machine's interfaces.
  ASKPASS will prompt for a password that clients will be required to
  specify as well. Successful authentication usually implies encryption.
  SERVICE will give the service a name. With this option, several named
  services can coexist without you to remember where they are located.
  ENCRYPT will require encryption from clients.
  TZOFFS (Amiga only) specifies a time zone offset in seconds.

  Examples:
  $ fitz serve help                   get help on the serve command
  $ fitz serve                        share current directory
  $ fitz serve /home/shared           share a specific directory
  # fitz serve RAM: service ramdisk   share RAM:, service name "ramdisk"
  $ fitz serve /srv/pub port 8888     share on a different port
  # fitz serve SYS:T RO TZOFFS 7200   read-only share, CEST (Amiga)
  $ fitz serve iface 127.0.0.1:6666   localhost only
  # fitz serve df0: askpass           serve df0:, with password
  $ fitz serve encrypt                require encryption from clients

Mount a share (client side):

  # fitz mount service [VOLUME] [RO] [OH] [ENCRYPT] [TZOFFS sec]
  Unix:
  $ fitz mount service mountpoint [RO] [OH] [ENCRYPT] [fuse-args]

  service can be just a hostname, host:port, hostname:/servicename, 
  or just :/servicename.
  mountpoint must exist and should be an empty directory.
  OH (or OMITHIDDEN) hides dot-files from listings (still accessible).
  fuse-args are additional arguments passed to FUSE (Unix only).
  ENCRYPT will require encryption - with or without password.

  Examples:
  # fitz mount hostname:/service RO   mount to FITZ: read-only (Amiga)
  # fitz mount :/data DATA:           mount service :/data to DATA:
  # fitz mount klappstulle NETZ:      mount klappstulle to NETZ: (Amiga)
  $ fitz mount 192.168.1.5:8888 ~/net mount 192.168.1.5:8888 to ~/net
  $ fitz mount a1200 ~/net -f         mount a1200, running in foreground
  $ fitz mount NEED=unix server       require the "unix" capability
  # fitz mount someshare encrypt      require encryption from the server

  The client reconnects automatically if the server restarts; operations
  block during reconnect and resume transparently (open files excepted).
  
  Unmount on Unixoid:
  $ umount ~/net
  $ fusermount3 -u ~/net              (if needed - I don't)

  Unmount on Amiga:
  press CTRL-C, or send the CTRL-C signal with the 'break' command.
  Use the 'status' command to see the task numbers of Fitz processes.
  'fitz query' will also display the task numbers of named services.


Service names and discovery
--------------------------------------------------------------------------

Fitz supports named services and a port-mapping facility. Instead of
running shares on distinct port numbers, you can give them names:

  $ fitz serve dirname SERVICE homedir
  # fitz serve RAM: SERVICE ramdisk

which will allow a client to mount by name instead of a port number:

  # fitz mount hostname:/homedir 
  # fitz mount hostname:/ramdisk

In addition to that, you can mount services inside a LAN even without
knowing the hosts on which they are located - so you don't have to
specify their IP addresses or hostnames. When mounting, you can use the
notation :/servicename, which stands for 'on the local network':

  # fitz mount :/homedir
  # fitz mount :/ramdisk

Note, however, that automatic service discovery will only work inside
the same LAN segment, i.e. computers which are on the same switch or
bridge. If services are separated by a router (or VPN, etc.) then
automatic service discovery will probably not work; in that case
however you can still mount by hostname:/servicename.

With the 'query' command you can get a list of services currently
available in your local network, including their port numbers and the
process IDs (or task numbers) on the respective machine. For example:

  $ fitz query
  platin.intra.sm41.de (10.168.1.4):
    tek 17721 10155
    tmueller 17718 10147
    data 17722 10151
    netsys-a3000 17723 10159
  a500.intra.sm41.de (10.168.1.36):
    a500 17711 11
    a500-ram 17712 12
    

System time, Amiga and general notes
--------------------------------------------------------------------------

- Servers are usually carrying timestamps not in local time, but in UTC,
so Amiga system time needs to be normalised towards UTC when talking to a
Unix server.

Keep a correct Amiga system time by syncing with a NTP server in your
network startup script. If you are in a region without daylight saving, 
Fitz will fall back to the Amiga system locale, and you are done.

To account for DST, provide a 'TZ' env variable containing a POSIX time
zone format. Get this format string on most Unixoids with e.g.

  strings /usr/share/zoneinfo/Europe/Berlin | tail -n 1

You would set this as the TZ variable on the Amiga like this:

  setenv TZ "CET-1CEST,M3.5.0,M10.5.0/3"
  copy ENV:TZ ENVARC:

And, after syncing towards UTC (or the realtime clock running in UTC),
run TZUtil (from Aminet) to correct the system time according to TZ.
Fitz will use the TZ variable as well, and calculate the required offset
towards UTC when talking to a Unix server. See also the example below.

Alternatively, you can specify the offset towards UTC in seconds with the
'TZOFFS' env variable (or command line argument), but you would have to
account for DST and calculate the offset yourself. For example, TZOFFS for
Japan (which has no DST) would be +9 hours, that is 32400 seconds.

- A good place for setting up shares on an Amiga is your network startup
script. The following example uses FitzCtrl, accounts for NTP, DST, and
assumes you have the TZ variable set.

  ntpsync -t10 -d0 pool.ntp.org ; sync towards UTC
  wait 2 sec
  tzutil
  resident c:fitz ; requires the P bit set
  SYS:Prefs/FitzCtrl start

- See also the FitzCtrl utility, which allows you to configure Fitz mounts
and shares with a graphical user interface, and launch them all at once in
your network startup script.

- OH (OMITHIDDEN) can give confusing results when recursively deleting
directories which are not empty due to invisible dot-files.

- Remember that you will probably want to include xattrs for backups
and copies of Amiga directories on a Unix server with cp, rsync, tar.


Capability management
--------------------------------------------------------------------------

The protocols and defaults are adjusted in such way that things can be
expected to just work. For more insight and control over your mounted
filesystems, show a server's protocol and capabilities:

  # fitz query host[:port]
  # fitz query [host]:/service
  
With the arguments USE and NEED you can request server capabilities
opportunistically or strictly. For example, USE=amiga-case would use
a server's offer of Amiga-style case insensitive file names; the same
with NEED=amiga-case, but mounting would fail if the server cannot
provide the requested feature.
  
Amiga servers offer (and Amiga clients by default use)
"iso-8859-1,amiga-case,amiga-comment,amiga-flags".
Unix servers offer "unix,case,amiga-case" (and possibly a few more),
and additionally "amiga-comment,amiga-flags" (given the required
support). Unix clients by default use the capabilities "unix,case".
  
So by default Amiga clients get case-insensitive names, Amiga comments
and file flags even from Unix servers, provided that the server and
filesystem can support them - and fall back to 'Unix-like' verbatim
filenames and no support for comments and special Amiga flags.
If you strictly require them, you would specify
NEED=amiga-case,amiga-comment,amiga-flags.
  
Unix servers and clients talk to each other in a pretty standard way,
except for that chown and chgrp are not supported by the protocol.


Encryption
--------------------------------------------------------------------------

1. By default, connections are NOT authenticated and NOT encrypted.
2. Authentication by default implies encryption of the data stream. 
3. The data stream can also be encrypted opportunistically, without
prior authentication.
4. If you use passwords or request encryption, encryption is rather
solid - but it can be prohibitively slow on a 7MHz 68000.
5. You can request a weaker than the default cipher - which might be
sufficient to obfuscate the data on the network for casual attackers.
The strongest cipher is speck64-27, the weakest is speck64-5.
6. Weaker ciphers do not mean weaker authentication.
7. You can also specify cipher=none, in which case the data stream is
unencrypted even with prior authentication.

Authentication is BLAKE2-MAC, and stream cipher is SPECK64 big endian.
Of course this unusual combination is geared towards slow Amigas.
"So the NSA will be able to read my traffic?", you may ask. The answer
is: Yes, most probably, and SPECK64 is but one of the many reasons.

Really, if you mistrust it - and you have every reason to - then don't
use it, as it also degrades performance. Ensure security by not exposing
Fitz to untrusted networks. The original intent was just to obfuscate
the data rather than to encrypt it by modern standards - so it won't
get picked up too easily with packet sniffing.

Use the ENCRYPT keyword to make sure that the traffic will be encrypted.
Clients, if required to encrypt, will pick the first from the server's
list of possible ciphers. Use CIPHER=name to choose another.

Here are some examples:

  $ fitz serve nocrypt  - deny clients encryption
  $ fitz serve askpass  - prompt server (and clients) for password
  $ fitz serve encrypt  - require (opportunistic) encryption from clients
  # fitz mount encrypt  - require (opportunistic) encryption from server
  $ fitz serve password xxx    - use the given password as the secret
  # fitz mount pw xxx          - use the given password as the secret
  $ fitz serve secret filename - use secret from file (max. 1024 bytes)
  # fitz mount secret filename - use secret from file (max. 1024 bytes)

Get a list of ciphers offered by a server with the 'query' command.
You can also change the list of ciphers offered to clients:

  $ fitz serve cipher=speck64-27,speck64-11 ...

Clients are still free to use no encryption at all - use the 'encrypt'
keyword at the server to enforce it:

  $ fitz serve encrypt cipher=speck64-27,...

Clients can also choose one from the offered ciphers:

  $ fitz mount cipher=speck64-11 ...


Disclaimer
--------------------------------------------------------------------------

See also COPYRIGHT.

The only thing that can be guaranteed is that this software can corrupt
your data, silently, when you least expect it.

Consider everything here experimental, and don't entrust it important
data that you cannot recover.


Rationale
--------------------------------------------------------------------------

Created for lack of a better tool.

Samba: The smbfs mounter on Amiga is great. But the Samba server is a
pile of bloat and obsolescence, and a nuisance to configure. You are
building megabytes of cruft, and then try to make sense of weird
compatibility options to disable 95% of that. And you keep wondering
when your distribution will finally drop them for godawful security -
which you couldn't care less about in your home network.

NFS: ch_nfsmount on Amiga is great. NFSv2 is fast and easy to setup -
for the 1993 Unix aficionado. In the kernel you enable options nobody
has bothered to switch on in a decade or two. The NFSv2 userland
support, which any sane distribution has abandoned a long time ago,
you build yourself from sources you picked up in a back-alley
scrapyard on the internet. After that it's awesome.

I haven't tried many newer mounters (NFSv3, possibly some other for
Samba). What I've found is that I had to write mount list entries, so
shares cannot be terminated by the break signal, and the network stack
cannot remove them automatically. And then it still doesn't work the
other way round - and setting up a Samba or NFS server on an Amiga
would be even more insane.

ch_nfsmount and smbfs show how it's done: They are not handlers that
go into L:, but are started as regular programs that provide the
volumes dynamically, and so go away when the break signal arrives.
That way starting/stopping the network can bring up and remove shares
naturally and cleanly.

These were the reasons why I wanted to write such a thing for a long
time. Now with the arrival of English as a programming language, I found
a good reason to give these things a try and craft it in exactly the way
I wanted. 

The result is an Amiga binary which is both server and client, and works
swiftly and nicely even on an unexpanded Amiga. With it I can not only
mount my Unix machines, but even the smallest Amigas can exchange data
with each other. Of course, you can also use it for sharing a directory on
your laptop in a guest LAN - for you and your friends to collaborate on
some project.

Despite quickly pulling off a working prototype, the initial enthusiasm
about AI assistance waned midway into this project. Its coding standards
and practices differed from my own, and so I spent too much time talking
and refactoring what couldn't be explained with reasonable effort.
In-context learning did not work satisfactory. The choice was whether I'd
prefer the assistant to fall back to unwanted habits, or to waste too
much context and become ineffective, confused, and blathering. So after a
while I stopped using it. The prefs program FitzCtrl was entirely written
by hand again.


Authors
--------------------------------------------------------------------------

- Timm S. Mueller <tmueller et schulze-mueller piste de>
  Code, concept, architecture, testing, refactoring, documentation
  
- Claude Sonnet 4.6
  Code, test-bedding, interface and architecture consulting

No emulators were harmed during development.


Contents of comm/tcp/Fitz.lha
 PERMSSN    UID  GID    PACKED    SIZE  RATIO METHOD CRC     STAMP          NAME
---------- ----------- ------- ------- ------ ---------- ------------ -------------
[Amiga]                    270     628  43.0% -lh5- 0e57 Jun 11 14:54 Fitz.info
[Amiga]                  13303   30305  43.9% -lh5- dc15 Jun 11 15:30 Fitz/CHANGES
[Amiga]                    716    1252  57.2% -lh5- 3d2f Jun 11 15:30 Fitz/COPYRIGHT
[Amiga]                  43541   87660  49.7% -lh5- def8 Jun 11 15:30 Fitz/fitz
[Amiga]                  24587   47892  51.3% -lh5- 3315 Jun 11 15:30 Fitz/FitzCtrl
[Amiga]                    189     454  41.6% -lh5- 5ebe Jun 11 15:30 Fitz/FitzCtrl.info
[Amiga]                    203     398  51.0% -lh5- e212 Jun 11 15:30 Fitz/Makefile
[Amiga]                   7652   19079  40.1% -lh5- 081c Jun 11 15:30 Fitz/README
[Amiga]                   1762    4277  41.2% -lh5- 84f5 Jun 11 15:30 Fitz/README-GUI
[Amiga]                    191     468  40.8% -lh5- 174c Jun 11 15:30 Fitz/README-GUI.info
[Amiga]                    190     468  40.6% -lh5- 307a Jun 11 15:30 Fitz/README.info
[Amiga]                    270     628  43.0% -lh5- bba7 Jun 11 15:30 Fitz/src.info
[Amiga]                  27226   92378  29.5% -lh5- e857 Jun 11 15:30 Fitz/src/amiga-client.c
[Amiga]                   2084    4911  42.4% -lh5- 9055 Jun 11 15:30 Fitz/src/amiga-common.c
[Amiga]                   1161    2394  48.5% -lh5- a5fc Jun 11 15:30 Fitz/src/amiga-common.h
[Amiga]                   3166    8990  35.2% -lh5- e660 Jun 11 15:30 Fitz/src/amiga-comparetree.c
[Amiga]                   1248    2986  41.8% -lh5- 7a65 Jun 11 15:30 Fitz/src/amiga-main.c
[Amiga]                  22561   76870  29.3% -lh5- ccec Jun 11 15:30 Fitz/src/amiga-server.c
[Amiga]                   3540   10905  32.5% -lh5- 40ae Jun 11 15:30 Fitz/src/amiga-tzparse.c
[Amiga]                    602    1096  54.9% -lh5- 0b13 Jun 11 15:30 Fitz/src/amiga-tzparse.h
[Amiga]                   5786   22681  25.5% -lh5- 18b5 Jun 11 15:30 Fitz/src/argparse.c
[Amiga]                   1769    4605  38.4% -lh5- b3bc Jun 11 15:30 Fitz/src/argparse.h
[Amiga]                    265     516  51.4% -lh5- a326 Jun 11 15:30 Fitz/src/debug.h
[Amiga]                   5051   18519  27.3% -lh5- fd2c Jun 11 15:30 Fitz/src/fitz-common-client.c
[Amiga]                   1907    5147  37.1% -lh5- f12b Jun 11 15:30 Fitz/src/fitz-common-server.c
[Amiga]                   5000   14030  35.6% -lh5- d9ee Jun 11 15:30 Fitz/src/fitz-common.c
[Amiga]                   4268   12017  35.5% -lh5- 5b23 Jun 11 15:30 Fitz/src/fitz-common.h
[Amiga]                    398     887  44.9% -lh5- a164 Jun 11 15:30 Fitz/src/fitz-platform.h
[Amiga]                    564    1114  50.6% -lh5- 2221 Jun 11 15:30 Fitz/src/fitz-posix
[Amiga]                   7040   20228  34.8% -lh5- 21fb Jun 11 15:30 Fitz/src/fitz-protocol.h
[Amiga]                   7137   37216  19.2% -lh5- 02b8 Jun 11 15:30 Fitz/src/fitz-test.c
[Amiga]                    203     320  63.4% -lh5- cae4 Jun 11 15:30 Fitz/src/fitz-version.h
[Amiga]                  25416   86949  29.2% -lh5- 30db Jun 11 15:30 Fitz/src/fitzctrl.c
[Amiga]                    646    1578  40.9% -lh5- ffc6 Jun 11 15:30 Fitz/src/kprintf.asm
[Amiga]                   1348    3908  34.5% -lh5- 559f Jun 11 15:30 Fitz/src/Makefile
[Amiga]                    201     343  58.6% -lh5- 8015 Jun 11 15:30 Fitz/src/speck64be.asm
[Amiga]                      0       0 100.0% -lh0- 0000 Jun 11 15:30 Fitz/src/test-mount/.keep
[Amiga]                    166     825  20.1% -lh5- 8c98 Jun 11 15:30 Fitz/src/tests/bench-amiga
[Amiga]                    141     570  24.7% -lh5- 9cb8 Jun 11 15:30 Fitz/src/tests/bench.sh
[Amiga]                    724    1666  43.5% -lh5- c420 Jun 11 15:30 Fitz/src/tests/clean.sh
[Amiga]                   8030   30867  26.0% -lh5- 0eb7 Jun 11 15:30 Fitz/src/tests/run.lua
[Amiga]                  15168   55654  27.3% -lh5- 486e Jun 11 15:30 Fitz/src/unix-client.c
[Amiga]                   1030    2439  42.2% -lh5- 0200 Jun 11 15:30 Fitz/src/unix-common.c
[Amiga]                  19574   72824  26.9% -lh5- 0015 Jun 11 15:30 Fitz/src/unix-server.c
---------- ----------- ------- ------- ------ ---------- ------------ -------------
 Total        44 files  266294  788942  33.8%            Jun 12 23:28
Page generated in 0.03 seconds
Aminet © 1992-2024 Urban Müller and the Aminet team. Aminet contact address: <aminetaminet net>