• src/sftp/sftp.c sftp_common.csrc/sftp/objects.mk sftp.h sftp_attr.c sf

    From Deucе@1:103/705 to Git commit to main/sbbs/master on Fri Apr 24 14:19:27 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/f193bd5695d05dcd9186ad10
    Added Files:
    src/sftp/sftp.c sftp_common.c
    Modified Files:
    src/sftp/objects.mk sftp.h sftp_attr.c sftp_client.c sftp_pkt.c sftp_server.c sftp_str.c
    Removed Files:
    src/sftp/sftp_static.h
    Log Message:
    sftp: single-TU build + request-id dispatch + extension negotiation

    Rebuild the SFTP library as one translation unit (sftp.c #includes the
    five source files) so the compiler sees every internal function. Drop
    the cross-TU shim pattern that was in sftp_static.h — its wrappers
    were only there to share state-oriented helpers between client.c and
    server.c across TU boundaries, which is moot now. The file is
    renamed to sftp_common.c and reduced to genuinely shared pieces
    (extension table, appendheader). Non-public functions lose their
    sftp_*_ prefix and become static. Public API in sftp.h is unchanged
    from the consumer's POV; only 60 T-symbols remain in libsftp_mt.a,
    all legitimately public.

    Client gets a request-id demux (struct sftpc_pending per in-flight op
    on the caller's stack; sftpc_recv dispatches completed packets to the
    matching waiter's event) plus new ops: stat / lstat / fstat /
    opendir / readdir / mkdir / rmdir / remove / rename / setstat /
    fsetstat. Per-thread last-error via pthread_key_t so concurrent
    callers don't clobber each other's status.

    INIT/VERSION now negotiate extensions: both sides advertise (name,
    version) pairs; an extension is enabled only when name AND version
    match. Initial extensions: [email protected] and [email protected],
    both at version "1".

    sftps_state_t now splits into a public outer struct (callbacks,
    version, extensions) and an opaque priv struct (rxp/txp/mtx/running/ id/terminating) living inside the TU so consumers can't tamper with
    internal fields. Packet struct bodies (sftp_tx_pkt, sftp_rx_pkt, sftp_extended_file_attribute) move out of sftp.h for the same reason.

    Client ops validate NULL/range args before taking the mutex so a
    doomed call never acquires the lock.

    Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
    --- SBBSecho 3.37-Linux
    * Origin: Vertrauen - [vert/cvs/bbs].synchro.net (1:103/705)