1
1
Problem was that the terminal was not needed, and some nul bytes were to be read.
Этот коммит содержится в:
Aris Adamantiadis 2009-08-09 00:25:09 +02:00
родитель 807cb635c1
Коммит b993579079

Просмотреть файл

@ -160,9 +160,9 @@ static int open_location(struct location *loc, int flag){
} }
loc->channel=channel_new(loc->session); loc->channel=channel_new(loc->session);
channel_open_session(loc->channel); channel_open_session(loc->channel);
channel_request_pty(loc->channel); //channel_request_pty(loc->channel);
snprintf(buffer,sizeof(buffer),"scp -vt %s",loc->path); snprintf(buffer,sizeof(buffer),"scp -vt %s",loc->path);
fprintf(stderr,"sending \"%s\"\n",buffer); fprintf(stderr,"Execution of \"%s\"\n",buffer);
if(channel_request_exec(loc->channel,buffer) < 0){ if(channel_request_exec(loc->channel,buffer) < 0){
printf("error executing scp: %s\n",ssh_get_error(loc->session)); printf("error executing scp: %s\n",ssh_get_error(loc->session));
return -1; return -1;
@ -185,6 +185,7 @@ static int do_copy(struct location *src, struct location *dest){
struct stat s; struct stat s;
int w,r; int w,r;
char buffer[4196]; char buffer[4196];
int total=0;
/*FIXME*/ /*FIXME*/
if(dest->is_ssh && !src->is_ssh){ if(dest->is_ssh && !src->is_ssh){
fd=fileno(src->file); fd=fileno(src->file);
@ -192,6 +193,9 @@ static int do_copy(struct location *src, struct location *dest){
size=s.st_size; size=s.st_size;
} else } else
size=0; size=0;
r=channel_read(dest->channel,buffer,1,0);
printf("Received %d\n", buffer[0]);
snprintf(buffer,sizeof(buffer),"C0644 %d %s\n",size,src->path); snprintf(buffer,sizeof(buffer),"C0644 %d %s\n",size,src->path);
printf("writing \"%s\"",buffer); printf("writing \"%s\"",buffer);
if(channel_write(dest->channel,buffer,strlen(buffer))<0){ if(channel_write(dest->channel,buffer,strlen(buffer))<0){
@ -199,7 +203,7 @@ static int do_copy(struct location *src, struct location *dest){
return -1; return -1;
} }
r=channel_read(dest->channel,buffer,1,0); r=channel_read(dest->channel,buffer,1,0);
write(1,buffer,1); printf("Received %d\n", buffer[0]);
do { do {
r=fread(buffer,1,sizeof(buffer),src->file); r=fread(buffer,1,sizeof(buffer),src->file);
if(r==0) if(r==0)
@ -209,30 +213,48 @@ static int do_copy(struct location *src, struct location *dest){
return -1; return -1;
} }
w=channel_write(dest->channel,buffer,r); w=channel_write(dest->channel,buffer,r);
//printf(".");
fflush(stdout);
//usleep(500);
if(w<0){ if(w<0){
fprintf(stderr,"error writing in channel: %s\n",ssh_get_error(dest->session)); fprintf(stderr,"error writing in channel: %s\n",ssh_get_error(dest->session));
r=channel_get_exit_status(dest->channel);
if(r!=-1)
printf("Exit status : %d\n",r);
return -1; return -1;
} }
total+=w;
if(w!=r){ if(w!=r){
fprintf(stderr,"coulnd write %d bytes : %d\n",r,w); fprintf(stderr,"coulnd write %d bytes : %d\n",r,w);
} }
if((r=channel_poll(dest->channel,0))>0){ /* if((r=channel_poll(dest->channel,0))>0){
if((size_t)r>sizeof(buffer))
r=sizeof(buffer);
r=channel_read(dest->channel,buffer,r,0); r=channel_read(dest->channel,buffer,r,0);
write(1,buffer,r); buffer[r]=0;
printf("received : \"%s\"\n",buffer);
} }
if((r=channel_poll(dest->channel,1)) > 0){ if((r=channel_poll(dest->channel,1))>0){
if((size_t)r>sizeof(buffer))
r=sizeof(buffer);
r=channel_read(dest->channel,buffer,r,1); r=channel_read(dest->channel,buffer,r,1);
write(1,buffer,r); buffer[r]=0;
} printf("received ext : \"%s\"\n",buffer);
}*/
} while(1); } while(1);
channel_write(dest->channel,"\0",1); printf("wrote %d bytes\n",total);
channel_write(dest->channel,"",1);
channel_send_eof(dest->channel); channel_send_eof(dest->channel);
r=channel_read(dest->channel, buffer, 1, 0);
if(r>0)
printf("Received %d\n", buffer[0]);
//channel_close(dest->channel);
do{ do{
if((r=channel_poll(dest->channel,0))>0){ if((r=channel_poll(dest->channel,0))>0){
r=channel_read(dest->channel,buffer,r,0); r=channel_read(dest->channel,buffer,r,0);
if(r<=0) if(r>0)
break; write(1,buffer,r);
write(1,buffer,r);
} }
if((r=channel_poll(dest->channel,1)) > 0){ if((r=channel_poll(dest->channel,1)) > 0){
r=channel_read(dest->channel,buffer,r,1); r=channel_read(dest->channel,buffer,r,1);
@ -240,7 +262,10 @@ static int do_copy(struct location *src, struct location *dest){
break; break;
write(1,buffer,r); write(1,buffer,r);
} }
} while(r>0); } while(!channel_is_eof(dest->channel) && r != SSH_ERROR);
r=channel_get_exit_status(dest->channel);
if(r!=-1)
printf("Exit status : %d\n",r);
return 0; return 0;
} }
@ -261,6 +286,7 @@ int main(int argc, char **argv){
if(do_copy(src,dest) < 0) if(do_copy(src,dest) < 0)
return EXIT_FAILURE; return EXIT_FAILURE;
} }
ssh_disconnect(dest->session);
ssh_finalize(); ssh_finalize();
return 0; return 0;
} }