Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ jobs:
- name: Install dependencies
run: |
apk add --no-cache \
avahi-dev \
build-base \
fuse-dev \
libedit-dev \
Expand Down Expand Up @@ -75,6 +76,7 @@ jobs:
- name: Install dependencies
run: |
apk add --no-cache \
avahi-dev \
build-base \
fuse3-dev \
libedit-dev \
Expand Down Expand Up @@ -108,6 +110,7 @@ jobs:
- name: Install dependencies
run: |
dnf --setopt=install_weak_deps=False --assumeyes install \
avahi-devel \
fuse-devel \
gcc \
libgcrypt-devel \
Expand Down Expand Up @@ -141,6 +144,7 @@ jobs:
- name: Install dependencies
run: |
dnf --setopt=install_weak_deps=False --assumeyes install \
avahi-devel \
fuse3-devel \
gcc \
libgcrypt-devel \
Expand Down Expand Up @@ -174,6 +178,7 @@ jobs:
sudo apt-get update
sudo apt-get install --assume-yes --no-install-recommends \
gcc \
libavahi-core-dev \
libbsd-dev \
libgcrypt-dev \
libfuse-dev \
Expand Down Expand Up @@ -209,6 +214,7 @@ jobs:
sudo apt-get update
sudo apt-get install --assume-yes --no-install-recommends \
gcc \
libavahi-core-dev \
libgcrypt-dev \
libfuse3-dev \
libreadline-dev \
Expand Down Expand Up @@ -310,6 +316,7 @@ jobs:
prepare: |
pkg remove -y fusefs-libs3
pkg install -y \
avahi \
fusefs-libs \
libedit \
libgcrypt \
Expand Down Expand Up @@ -346,6 +353,7 @@ jobs:
sync: sshfs
prepare: |
pkg install -y \
avahi \
fusefs-libs3 \
libedit \
libgcrypt \
Expand Down Expand Up @@ -411,6 +419,7 @@ jobs:
sync: sshfs
prepare: |
pkg_add -I \
avahi \
libgcrypt \
meson
run: |
Expand Down Expand Up @@ -453,6 +462,7 @@ jobs:
tar -zxpf bootstrap.tar.gz -C /
export PATH=/opt/local/sbin:/opt/local/bin:/usr/gnu/bin:/usr/bin:/usr/sbin:/sbin:$PATH
pkgin -y install \
avahi \
meson \
libgcrypt
run: |
Expand Down
52 changes: 45 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,22 @@ other applications that need to browse AFP shares.

### FUSE

Discover AFP servers advertised on the local network with Zeroconf:

% afp_client discover
NAME TARGET PORT MODEL
Time Capsule Time-Capsule.local 548 TimeCapsule8,119
afpserver afpserver.local 548 Macmini

Mount an advertised service by its exact instance name. This is
non-interactive; use `afpcmd --browse` when you want a live picker:

% afp_client mount --service "Office File Server" --user myuser \
--volume "File Sharing" /home/myuser/fusemount

Omit `--volume` to authenticate and list the volumes available to that user.
The trailing mountpoint may also be omitted because no filesystem is mounted.

Mount the *File Sharing* volume from afpserver.local on /home/myuser/fusemount
authenticated as user *myuser* (you will be prompted for the password):

Expand Down Expand Up @@ -52,9 +68,25 @@ colons, or other special characters are present.
### Command line client

The *afpcmd* command line client allows you to interactively access AFP shares.
In the most basic use case, it takes an AFP URL as argument.
With `--browse`, it shows a live list of AFP services advertised through
Bonjour/DNS-SD or Avahi. Select a service number to connect, or `q` to quit.
The picker lists services only; pass an AFP URL directly when connecting to
a host that is not advertised.

$ afpcmd --browse
Discovered AFP servers

1 Office File Server
2 Time Capsule

Open volume File Sharing on afpserver.local:
q Quit

Server: 1

After selection, `afpcmd` prompts for a username and password.

You can also invoke it with an AFP URL directly, this example connects to
the *File Sharing* volume on *afpserver.local* as user *myuser*:

$ afpcmd "afp://myuser@afpserver.local/File Sharing"
Password: [input hidden]
Expand All @@ -65,8 +97,13 @@ Connect anonymously to afpserver.local, list all volumes available to guest user

$ afpcmd "afp://afpserver.local"
Connected to server afpserver
Not attached to a volume. Run the 'ls' command to list available volumes
afpcmd: cd Dropbox
Available volumes on afpserver:

1 Dropbox

q Quit

afpcmd: 1
Attached to volume Dropbox
afpcmd: ls
-rw-r--r-- 6148 2025-07-11 14:09 .DS_Store
Expand Down Expand Up @@ -106,9 +143,10 @@ library APIs, behavior, and supported features nevertheless exist.
- To accommodate the above, the Stateless client controller daemon has been renamed to *afpsld*,
reserving *afpfsd* for the FUSE controller daemon
- *mount_afp* has been renamed to *mount_afpfs* to avoid namespace conflict with the macOS *mount_afp* command
- The *afpcmd* TUI client has to be invoked with an AFP URL, and the interactive **connect** command has been
removed; Conversely, when you execute the **disconnect** command the server session will be
terminated and *afpcmd* will shut down
- The *afpcmd* TUI client can browse Zeroconf-advertised AFP services.
The interactive **connect** command has been removed; conversely,
when you execute **disconnect**, the server session is terminated
and *afpcmd* shuts down rather than returning to the connect prompt
- The *afpfsd* FUSE controller daemon has been rewritten to have one process per FUSE mount,
with a manager process to handle mount requests and manage the afpfsd processes
This allows for better isolation and stability of FUSE mounts compared to a single process handling all mounts.
Expand Down
6 changes: 0 additions & 6 deletions TODO.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,6 @@
Netatalk Client Improvements
=====================

General client shortcomings
---------------------------

* integration with avahi/bonjour
* shutting down notices aren't honoured

FUSE client
-----------

Expand Down
Loading
Loading