static int lscp_deny_request(lua_State *L) { struct scp_ud * scpud = get_scpud(L); const char *reason=luaL_checkstring(L,2); int r=ssh_scp_deny_request(scpud->scp,reason); if(r==SSH_ERROR){ scp_error(L,scpud); } return 0; }
/** @brief copies files from source location to destination * @param src source location * @param dest destination location * @param recursive Copy also directories */ static int do_copy(struct location *src, struct location *dest, int recursive){ int size; socket_t fd; struct stat s; int w,r; char buffer[16384]; int total=0; int mode; char *filename; /* recursive mode doesn't work yet */ (void)recursive; /* Get the file name and size*/ if(!src->is_ssh){ fd=fileno(src->file); fstat(fd,&s); size=s.st_size; mode = s.st_mode & S_IFMT; filename=ssh_basename(src->path); } else { size=0; do { r=ssh_scp_pull_request(src->scp); if(r==SSH_SCP_REQUEST_NEWDIR){ ssh_scp_deny_request(src->scp,"Not in recursive mode"); continue; } if(r==SSH_SCP_REQUEST_NEWFILE){ size=ssh_scp_request_get_size(src->scp); filename=strdup(ssh_scp_request_get_filename(src->scp)); mode=ssh_scp_request_get_permissions(src->scp); //ssh_scp_accept_request(src->scp); break; } if(r==SSH_ERROR){ fprintf(stderr,"Error: %s\n",ssh_get_error(src->session)); return -1; } } while(r != SSH_SCP_REQUEST_NEWFILE); } if(dest->is_ssh){ r=ssh_scp_push_file(dest->scp,src->path, size, mode); // snprintf(buffer,sizeof(buffer),"C0644 %d %s\n",size,src->path); if(r==SSH_ERROR){ fprintf(stderr,"error: %s\n",ssh_get_error(dest->session)); ssh_scp_free(dest->scp); return -1; } } else { if(!dest->file){ dest->file=fopen(filename,"w"); if(!dest->file){ fprintf(stderr,"Cannot open %s for writing: %s\n",filename,strerror(errno)); if(src->is_ssh) ssh_scp_deny_request(src->scp,"Cannot open local file"); return -1; } } if(src->is_ssh){ ssh_scp_accept_request(src->scp); } } do { if(src->is_ssh){ r=ssh_scp_read(src->scp,buffer,sizeof(buffer)); if(r==SSH_ERROR){ fprintf(stderr,"Error reading scp: %s\n",ssh_get_error(src->session)); return -1; } if(r==0) break; } else { r=fread(buffer,1,sizeof(buffer),src->file); if(r==0) break; if(r<0){ fprintf(stderr,"Error reading file: %s\n",strerror(errno)); return -1; } } if(dest->is_ssh){ w=ssh_scp_write(dest->scp,buffer,r); if(w == SSH_ERROR){ fprintf(stderr,"Error writing in scp: %s\n",ssh_get_error(dest->session)); ssh_scp_free(dest->scp); dest->scp=NULL; return -1; } } else { w=fwrite(buffer,r,1,dest->file); if(w<=0){ fprintf(stderr,"Error writing in local file: %s\n",strerror(errno)); return -1; } } total+=r; } while(total < size); printf("wrote %d bytes\n",total); return 0; }