1
0
mirror of https://git.libssh.org/projects/libssh.git synced 2025-07-29 13:01:13 +03:00

scp recursive mode

This commit is contained in:
Aris Adamantiadis
2009-09-06 19:35:40 +03:00
parent 7ff80a2666
commit 929f5ca25b
4 changed files with 31 additions and 12 deletions

View File

@ -85,7 +85,7 @@ static int fetch_files(ssh_session session){
int mode; int mode;
char *filename; char *filename;
int r; int r;
ssh_scp scp=ssh_scp_new(session, SSH_SCP_READ, "/tmp/libssh_tests/*"); ssh_scp scp=ssh_scp_new(session, SSH_SCP_READ | SSH_SCP_RECURSIVE, "/tmp/libssh_tests/*");
if(ssh_scp_init(scp) != SSH_OK){ if(ssh_scp_init(scp) != SSH_OK){
fprintf(stderr,"error initializing scp: %s\n",ssh_get_error(session)); fprintf(stderr,"error initializing scp: %s\n",ssh_get_error(session));
return -1; return -1;
@ -121,6 +121,9 @@ static int fetch_files(ssh_session session){
free(filename); free(filename);
ssh_scp_accept_request(scp); ssh_scp_accept_request(scp);
break; break;
case SSH_SCP_REQUEST_ENDDIR:
printf("End of directory\n");
break;
case SSH_SCP_REQUEST_EOF: case SSH_SCP_REQUEST_EOF:
printf("End of requests\n"); printf("End of requests\n");
goto end; goto end;

View File

@ -467,7 +467,8 @@ enum {
/** Code is going to write/create remote files */ /** Code is going to write/create remote files */
SSH_SCP_WRITE, SSH_SCP_WRITE,
/** Code is going to read remote files */ /** Code is going to read remote files */
SSH_SCP_READ SSH_SCP_READ,
SSH_SCP_RECURSIVE=0x10
}; };
enum ssh_scp_request_types { enum ssh_scp_request_types {
@ -476,7 +477,11 @@ enum ssh_scp_request_types {
/** A new file is going to be pulled */ /** A new file is going to be pulled */
SSH_SCP_REQUEST_NEWFILE, SSH_SCP_REQUEST_NEWFILE,
/** End of requests */ /** End of requests */
SSH_SCP_REQUEST_EOF SSH_SCP_REQUEST_EOF,
/** End of directory */
SSH_SCP_REQUEST_ENDDIR,
/** Warning received */
SSH_SCP_REQUEST_WARNING
}; };
LIBSSH_API ssh_scp ssh_scp_new(ssh_session session, int mode, const char *location); LIBSSH_API ssh_scp ssh_scp_new(ssh_session session, int mode, const char *location);

View File

@ -365,6 +365,7 @@ enum ssh_scp_states {
struct ssh_scp_struct { struct ssh_scp_struct {
ssh_session session; ssh_session session;
int mode; int mode;
int recursive;
ssh_channel channel; ssh_channel channel;
char *location; char *location;
enum ssh_scp_states state; enum ssh_scp_states state;

View File

@ -40,7 +40,7 @@ ssh_scp ssh_scp_new(ssh_session session, int mode, const char *location){
return NULL; return NULL;
} }
ZERO_STRUCTP(scp); ZERO_STRUCTP(scp);
if(mode != SSH_SCP_WRITE && mode != SSH_SCP_READ){ if((mode&~SSH_SCP_RECURSIVE) != SSH_SCP_WRITE && (mode &~SSH_SCP_RECURSIVE) != SSH_SCP_READ){
ssh_set_error(session,SSH_FATAL,"Invalid mode %d for ssh_scp_new()",mode); ssh_set_error(session,SSH_FATAL,"Invalid mode %d for ssh_scp_new()",mode);
ssh_scp_free(scp); ssh_scp_free(scp);
return NULL; return NULL;
@ -52,7 +52,8 @@ ssh_scp ssh_scp_new(ssh_session session, int mode, const char *location){
return NULL; return NULL;
} }
scp->session=session; scp->session=session;
scp->mode=mode; scp->mode=mode & ~SSH_SCP_RECURSIVE;
scp->recursive = (mode & SSH_SCP_RECURSIVE) != 0;
scp->channel=NULL; scp->channel=NULL;
scp->state=SSH_SCP_NEW; scp->state=SSH_SCP_NEW;
return scp; return scp;
@ -66,7 +67,10 @@ int ssh_scp_init(ssh_scp scp){
ssh_set_error(scp->session,SSH_FATAL,"ssh_scp_init called under invalid state"); ssh_set_error(scp->session,SSH_FATAL,"ssh_scp_init called under invalid state");
return SSH_ERROR; return SSH_ERROR;
} }
ssh_log(scp->session,SSH_LOG_PROTOCOL,"Initializing scp session %s on location '%s'",scp->mode==SSH_SCP_WRITE?"write":"read",scp->location); ssh_log(scp->session,SSH_LOG_PROTOCOL,"Initializing scp session %s %son location '%s'",
scp->mode==SSH_SCP_WRITE?"write":"read",
scp->recursive?"recursive ":"",
scp->location);
scp->channel=channel_new(scp->session); scp->channel=channel_new(scp->session);
if(scp->channel == NULL){ if(scp->channel == NULL){
scp->state=SSH_SCP_ERROR; scp->state=SSH_SCP_ERROR;
@ -78,9 +82,11 @@ int ssh_scp_init(ssh_scp scp){
return SSH_ERROR; return SSH_ERROR;
} }
if(scp->mode == SSH_SCP_WRITE) if(scp->mode == SSH_SCP_WRITE)
snprintf(execbuffer,sizeof(execbuffer),"scp -t %s",scp->location); snprintf(execbuffer,sizeof(execbuffer),"scp -t %s %s",
scp->recursive ? "-r":"", scp->location);
else else
snprintf(execbuffer,sizeof(execbuffer),"scp -f %s",scp->location); snprintf(execbuffer,sizeof(execbuffer),"scp -f %s %s",
scp->recursive ? "-r":"", scp->location);
if(channel_request_exec(scp->channel,execbuffer) == SSH_ERROR){ if(channel_request_exec(scp->channel,execbuffer) == SSH_ERROR){
scp->state=SSH_SCP_ERROR; scp->state=SSH_SCP_ERROR;
return SSH_ERROR; return SSH_ERROR;
@ -416,15 +422,19 @@ int ssh_scp_pull_request(ssh_scp scp){
scp->processed = 0; scp->processed = 0;
return scp->request_type; return scp->request_type;
break; break;
case 'T': case 'E':
/* Timestamp */ scp->request_type=SSH_SCP_REQUEST_ENDDIR;
break; channel_write(scp->channel,"",1);
return scp->request_type;
case 0x1: case 0x1:
ssh_set_error(scp->session,SSH_REQUEST_DENIED,"SCP: Warning: %s",&buffer[1]); ssh_set_error(scp->session,SSH_REQUEST_DENIED,"SCP: Warning: %s",&buffer[1]);
return SSH_ERROR; scp->request_type=SSH_SCP_REQUEST_WARNING;
return scp->request_type;
case 0x2: case 0x2:
ssh_set_error(scp->session,SSH_FATAL,"SCP: Error: %s",&buffer[1]); ssh_set_error(scp->session,SSH_FATAL,"SCP: Error: %s",&buffer[1]);
return SSH_ERROR; return SSH_ERROR;
case 'T':
/* Timestamp */
default: default:
ssh_set_error(scp->session,SSH_FATAL,"Unhandled message: (%d)%s",buffer[0],buffer); ssh_set_error(scp->session,SSH_FATAL,"Unhandled message: (%d)%s",buffer[0],buffer);
return SSH_ERROR; return SSH_ERROR;