Il developer ITotalJustice ha creato un nuovo server FTP leggero, veloce e single-threaded scritto in linguaggio C, compatibile con diverse console, tra cui Nintendo Wii, 3DS, DS e Switch.
Questo progetto è stato sviluppato per imparare il protocollo FTP e implementa un server con basso utilizzo di memoria, nessuna allocazione dinamica e overhead ridotto grazie all’uso di funzioni come poll()
o, in assenza di questa, select()
.
Il server FTP è configurabile, con un file di configurazione situato in /config/ftpsrv/config.ini
. Ogni release include un template per evitare di sovrascrivere le configurazioni esistenti durante gli aggiornamenti.
Sulla Nintendo Switch, per motivi di sicurezza, è obbligatorio impostare un nome utente e una password, a meno che non venga abilitata l’opzione anonima (anon=1
).
Questo è particolarmente importante se usato con ldn-mitm, che potrebbe altrimenti permettere modifiche non autorizzate alla scheda SD.
Piattaforme supportate
Il server è stato portato sulle seguenti piattaforme:
- Nintendo Switch: Sia come applicazione che come sys-module.
- Nintendo Wii.
- Nintendo 3DS: Necessita di ottimizzazioni, poiché utilizza attualmente I/O POSIX con overhead.
- Nintendo DS: La build risolve un problema con dswifi e il supporto WPS, che non è attualmente supportato ufficialmente da devkitPro.
Pianificato anche un porting per console PlayStation 4, ma richiede ulteriori competenze nella creazione di servizi in background (daemon).
Problematiche note e workaround
- Bug con Dolphin (KDE): Un problema specifico con il comando
LIST
e file.jpg/.png
in directory. Il workaround consiste nel non inviare il pathname nella risposta del comandoLIST
. - Compatibilità con ffmpeg/mpv: I client come ffmpeg utilizzano il comando
ABOR
durante i trasferimenti, causando blocchi. La soluzione implementata separa i comandi e gli argomenti utilizzando il delimitatore\r\n
.
Comandi supportati senza autenticazione
Sono supportati comandi FTP standard come USER
, PASS
, QUIT
, ABOR
e HELP
. Tuttavia, il comando PWD
, secondo l’RFC959, dovrebbe essere disponibile senza autenticazione, ma in questa implementazione richiede l’autenticazione e restituisce un errore 530
se non soddisfatta.
Funzionalità future
Tra le funzionalità in programma vi sono il supporto per TLS, l’aggiunta di comandi FTP avanzati come ACCT
, STOU
e SITE
, oltre alla validazione della sequenza di comandi come RNTO
dopo RNFR
.
Changelog
Fix “vfs_unistd close” e socket non bloccanti
- Precedentemente, molti socket erano bloccanti, causando potenziali blocchi su alcune piattaforme come Nintendo Switch. Ora, i socket di controllo vengono sottoposti a polling per i dati in uscita, migliorando la reattività.
- Risolto un bug grave nei socket unistd che chiudeva erroneamente
STDIN
(fd=0) durante il comandoLIST
.
Rimozione di sscanf
e miglioramenti nei messaggi di errore
- Sostituiti gli utilizzi di
sscanf
consnprintf
estrtol
per migliorare le prestazioni. - Risolto un errore di polling sul comando
PORT
. - Migliorati i messaggi di errore per i comandi
RETR
eSTOR
, includendo il percorso completo.
Messaggi di controllo asincroni
- I messaggi verso i client ora vengono inviati in modalità asincrona. Aggiunto un buffer aggiuntivo per gestire gli errori di invio.
Timeout delle sessioni e rimozione di sendfile
- Aggiunto un timeout per le sessioni inattive, per prevenire il consumo di tutte le risorse disponibili.
- Rimosso temporaneamente il supporto a
sendfile
(Linux), che offriva velocità elevate, ma non era supportato su altre piattaforme.
Nuove funzionalità e fix per Nintendo Switch (Nx)
- Supporto a opzioni separate per porte tra applicazione e sys-module.
- Montaggio e visualizzazione dei salvataggi, dump del firmware, e velocità di trasferimento migliorate nel sys-module.
- Il LED lampeggia durante i trasferimenti di dati.
- Nuove opzioni di montaggio per
bis
,hdd
, e sistemi di salvataggio. - Risolto un bug con il sysmod che esauriva la memoria dei socket.
- Aggiunto supporto per il montaggio di “gc”,
romfs
, e archiviazione zip per salvataggi.
Timeout nel ciclo di trasferimento dati
- Inserito un timeout di 1ms per gestire situazioni in cui la velocità del disco è inferiore a quella della rete, come nel caso di trasferimenti da HDD.
Ottimizzazioni e aggiornamenti generali
- Miglioramenti nello stile del codice e aggiunta di informazioni di versione e commit nel sistema di build con CMake.
- Aggiunto supporto UTF-8 per i comandi
OPTS
. - Il backend VFS gestisce ora i dispositivi virtuali.
Download: ftpsrv v1.0.0 (3DS)
Download: ftpsrv v1.0.0 (NDS)
Download: ftpsrv v1.0.0 (Wii)
Download: ftpsrv v1.0.0 (Switch app) (Switch sysmodule)
Download: Source code ftpsrv v1.0.0
Fonte: gbatemp.net