examples: Reformat scp_download.c

Signed-off-by: Jakub Jelen <jjelen@redhat.com>
Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
This commit is contained in:
Jakub Jelen
2025-04-24 14:52:38 +02:00
committed by Andreas Schneider
parent 986e0c593f
commit 320e5154b2

View File

@@ -32,58 +32,63 @@ static const char *createcommand =
"cd /tmp/libssh_tests && date > a && date > b && mkdir c && date > d"; "cd /tmp/libssh_tests && date > a && date > b && mkdir c && date > d";
static char *host = NULL; static char *host = NULL;
static void usage(const char *argv0){ static void usage(const char *argv0)
fprintf(stderr,"Usage : %s [options] host\n" {
fprintf(stderr,
"Usage : %s [options] host\n"
"sample tiny scp downloader client - libssh-%s\n" "sample tiny scp downloader client - libssh-%s\n"
"This program will create files in /tmp and try to fetch them\n", "This program will create files in /tmp and try to fetch them\n",
// "Options :\n",
// " -r : use RSA to verify host public key\n",
argv0, argv0,
ssh_version(0)); ssh_version(0));
exit(0); exit(0);
} }
static int opts(int argc, char **argv){ static int opts(int argc, char **argv)
{
int i; int i;
while((i=getopt(argc,argv,"v"))!=-1){
switch(i){ while ((i = getopt(argc, argv, "v")) != -1) {
switch (i) {
case 'v': case 'v':
verbosity++; verbosity++;
break; break;
default: default:
fprintf(stderr,"unknown option %c\n",optopt); fprintf(stderr, "unknown option %c\n", optopt);
usage(argv[0]); usage(argv[0]);
return -1; return -1;
} }
} }
host = argv[optind]; host = argv[optind];
if(host == NULL) if (host == NULL)
usage(argv[0]); usage(argv[0]);
return 0; return 0;
} }
static void create_files(ssh_session session){ static void create_files(ssh_session session)
ssh_channel channel=ssh_channel_new(session); {
ssh_channel channel = ssh_channel_new(session);
char buffer[1]; char buffer[1];
int rc; int rc;
if(channel == NULL){ if (channel == NULL) {
fprintf(stderr,"Error creating channel: %s\n",ssh_get_error(session)); fprintf(stderr, "Error creating channel: %s\n", ssh_get_error(session));
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if(ssh_channel_open_session(channel) != SSH_OK){ if (ssh_channel_open_session(channel) != SSH_OK) {
fprintf(stderr,"Error creating channel: %s\n",ssh_get_error(session)); fprintf(stderr, "Error creating channel: %s\n", ssh_get_error(session));
ssh_channel_free(channel); ssh_channel_free(channel);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if(ssh_channel_request_exec(channel,createcommand) != SSH_OK){ if (ssh_channel_request_exec(channel, createcommand) != SSH_OK) {
fprintf(stderr,"Error executing command: %s\n",ssh_get_error(session)); fprintf(stderr,
"Error executing command: %s\n",
ssh_get_error(session));
ssh_channel_close(channel); ssh_channel_close(channel);
ssh_channel_free(channel); ssh_channel_free(channel);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
while(!ssh_channel_is_eof(channel)){ while (!ssh_channel_is_eof(channel)) {
rc = ssh_channel_read(channel,buffer,1,1); rc = ssh_channel_read(channel, buffer, 1, 1);
if (rc != 1) { if (rc != 1) {
fprintf(stderr, "Error reading from channel\n"); fprintf(stderr, "Error reading from channel\n");
ssh_channel_close(channel); ssh_channel_close(channel);
@@ -103,34 +108,40 @@ static void create_files(ssh_session session){
ssh_channel_free(channel); ssh_channel_free(channel);
} }
static int fetch_files(ssh_session session)
static int fetch_files(ssh_session session){ {
int size; int size;
char buffer[BUF_SIZE]; char buffer[BUF_SIZE];
int mode; int mode;
char *filename; char *filename;
int r; int r;
ssh_scp scp=ssh_scp_new(session, SSH_SCP_READ | SSH_SCP_RECURSIVE, "/tmp/libssh_tests/*"); ssh_scp scp = ssh_scp_new(session,
if(ssh_scp_init(scp) != SSH_OK){ SSH_SCP_READ | SSH_SCP_RECURSIVE,
fprintf(stderr,"error initializing scp: %s\n",ssh_get_error(session)); "/tmp/libssh_tests/*");
if (ssh_scp_init(scp) != SSH_OK) {
fprintf(stderr, "error initializing scp: %s\n", ssh_get_error(session));
ssh_scp_free(scp); ssh_scp_free(scp);
return -1; return -1;
} }
printf("Trying to download 3 files (a,b,d) and 1 directory (c)\n"); printf("Trying to download 3 files (a,b,d) and 1 directory (c)\n");
do { do {
r = ssh_scp_pull_request(scp);
r=ssh_scp_pull_request(scp); switch (r) {
switch(r){
case SSH_SCP_REQUEST_NEWFILE: case SSH_SCP_REQUEST_NEWFILE:
size=ssh_scp_request_get_size(scp); size = ssh_scp_request_get_size(scp);
filename=strdup(ssh_scp_request_get_filename(scp)); filename = strdup(ssh_scp_request_get_filename(scp));
mode=ssh_scp_request_get_permissions(scp); mode = ssh_scp_request_get_permissions(scp);
printf("downloading file %s, size %d, perms 0%o\n",filename,size,mode); printf("downloading file %s, size %d, perms 0%o\n",
filename,
size,
mode);
free(filename); free(filename);
ssh_scp_accept_request(scp); ssh_scp_accept_request(scp);
r=ssh_scp_read(scp,buffer,sizeof(buffer)); r = ssh_scp_read(scp, buffer, sizeof(buffer));
if(r==SSH_ERROR){ if (r == SSH_ERROR) {
fprintf(stderr,"Error reading scp: %s\n",ssh_get_error(session)); fprintf(stderr,
"Error reading scp: %s\n",
ssh_get_error(session));
ssh_scp_close(scp); ssh_scp_close(scp);
ssh_scp_free(scp); ssh_scp_free(scp);
return -1; return -1;
@@ -138,17 +149,17 @@ static int fetch_files(ssh_session session){
printf("done\n"); printf("done\n");
break; break;
case SSH_ERROR: case SSH_ERROR:
fprintf(stderr,"Error: %s\n",ssh_get_error(session)); fprintf(stderr, "Error: %s\n", ssh_get_error(session));
ssh_scp_close(scp); ssh_scp_close(scp);
ssh_scp_free(scp); ssh_scp_free(scp);
return -1; return -1;
case SSH_SCP_REQUEST_WARNING: case SSH_SCP_REQUEST_WARNING:
fprintf(stderr,"Warning: %s\n",ssh_scp_request_get_warning(scp)); fprintf(stderr, "Warning: %s\n", ssh_scp_request_get_warning(scp));
break; break;
case SSH_SCP_REQUEST_NEWDIR: case SSH_SCP_REQUEST_NEWDIR:
filename=strdup(ssh_scp_request_get_filename(scp)); filename = strdup(ssh_scp_request_get_filename(scp));
mode=ssh_scp_request_get_permissions(scp); mode = ssh_scp_request_get_permissions(scp);
printf("downloading directory %s, perms 0%o\n",filename,mode); printf("downloading directory %s, perms 0%o\n", filename, mode);
free(filename); free(filename);
ssh_scp_accept_request(scp); ssh_scp_accept_request(scp);
break; break;
@@ -160,18 +171,19 @@ static int fetch_files(ssh_session session){
goto end; goto end;
} }
} while (1); } while (1);
end: end:
ssh_scp_close(scp); ssh_scp_close(scp);
ssh_scp_free(scp); ssh_scp_free(scp);
return 0; return 0;
} }
int main(int argc, char **argv){ int main(int argc, char **argv)
{
ssh_session session; ssh_session session;
if(opts(argc,argv)<0) if (opts(argc, argv) < 0)
return EXIT_FAILURE; return EXIT_FAILURE;
session=connect_ssh(host,NULL,verbosity); session = connect_ssh(host, NULL, verbosity);
if(session == NULL) if (session == NULL)
return EXIT_FAILURE; return EXIT_FAILURE;
create_files(session); create_files(session);
fetch_files(session); fetch_files(session);