Eu assumo que por "cliente sftp" você se refere a um cliente SFTP do OpenSSH. O "problema" é que, quando você pressiona Ctrl+C, ele interrompe o upload e fecha o arquivo remoto de maneira limpa, como se o upload estivesse completamente concluído (observe que esse é um comportamento correto e muitos outros clientes SFTP se comportam da mesma maneira). Portanto, o servidor não tem absolutamente nenhuma maneira de dizer que o upload foi interrompido.
Estritamente falando, o cliente OpenSSH envia uma dica de tamanho ao servidor ao criar o arquivo. Mas o servidor OpenSSH não usa nem mesmo registra essas informações. Embora seja bastante simples modificar seu código para registrar o tamanho, se essa for uma opção para você.
Veja process_open
em sftp-server.c
:
a = get_attrib();
flags = flags_from_portable(pflags);
mode = (a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) ? a->perm : 0666;
logit("open \"%s\" flags %s mode 0%o",
name, string_from_portable(pflags), mode);
Altere a logit
declaração para:
logit("open \"%s\" flags %s mode 0%o size %llu",
name, string_from_portable(pflags), mode, (unsigned long long)a->size);
Observe que o envio da dica de tamanho é opcional. Enquanto alguns clientes SFTP o enviarão (por exemplo, OpenSSH ou WinSCP), outros não (por exemplo, PSFTP, FileZilla ou LFTP). Nesse caso, você receberá 0 pol a->size
.
Se o cliente realmente tivesse abortado o upload (sem fechar o arquivo remoto corretamente, por exemplo, quando o arquivo sftp
for morto), você seria capaz de diferenciá-lo do prefixo "forçado" para "fechar" o registro:
bytes forçados de fechamento "/data/README.md" lidos 0 gravados 5366