Exemple #1
0
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;
}