| 
				
				
					
				
				
				 | 
			
			 | 
			@@ -392,6 +392,86 @@ static int libssh_close_dir(URLContext *h) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    return 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			static int libssh_delete(URLContext *h) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int ret; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    LIBSSHContext *libssh = h->priv_data; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    sftp_attributes attr = NULL; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    char path[MAX_URL_SIZE]; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if ((ret = libssh_connect(h, h->filename, path, sizeof(path))) < 0) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        goto cleanup; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (!(attr = sftp_stat(libssh->sftp, path))) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        ret = AVERROR(sftp_get_error(libssh->sftp)); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        goto cleanup; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (attr->type == SSH_FILEXFER_TYPE_DIRECTORY) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (sftp_rmdir(libssh->sftp, path) < 0) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            ret = AVERROR(sftp_get_error(libssh->sftp)); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            goto cleanup; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } else { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (sftp_unlink(libssh->sftp, path) < 0) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            ret = AVERROR(sftp_get_error(libssh->sftp)); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            goto cleanup; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    ret = 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			cleanup: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (attr) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        sftp_attributes_free(attr); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    libssh_close(h); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    return ret; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			static int libssh_move(URLContext *h_src, URLContext *h_dst) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int ret; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    LIBSSHContext *libssh = h_src->priv_data; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    char path_src[MAX_URL_SIZE], path_dst[MAX_URL_SIZE]; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    char hostname_src[1024], hostname_dst[1024]; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    char credentials_src[1024], credentials_dst[1024]; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int port_src = 22, port_dst = 22; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    av_url_split(NULL, 0, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                 credentials_src, sizeof(credentials_src), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                 hostname_src, sizeof(hostname_src), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                 &port_src, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                 path_src, sizeof(path_src), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                 h_src->filename); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    av_url_split(NULL, 0, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                 credentials_dst, sizeof(credentials_dst), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                 hostname_dst, sizeof(hostname_dst), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                 &port_dst, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                 path_dst, sizeof(path_dst), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                 h_dst->filename); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (strcmp(credentials_src, credentials_dst) || | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            strcmp(hostname_src, hostname_dst) || | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            port_src != port_dst) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return AVERROR(EINVAL); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if ((ret = libssh_connect(h_src, h_src->filename, path_src, sizeof(path_src))) < 0) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        goto cleanup; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (sftp_rename(libssh->sftp, path_src, path_dst) < 0) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        ret = AVERROR(sftp_get_error(libssh->sftp)); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        goto cleanup; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    ret = 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			cleanup: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    libssh_close(h_src); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    return ret; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			#define OFFSET(x) offsetof(LIBSSHContext, x) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			#define D AV_OPT_FLAG_DECODING_PARAM | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			#define E AV_OPT_FLAG_ENCODING_PARAM | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -416,6 +496,8 @@ URLProtocol ff_libssh_protocol = { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    .url_write           = libssh_write, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    .url_seek            = libssh_seek, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    .url_close           = libssh_close, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    .url_delete          = libssh_delete, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    .url_move            = libssh_move, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    .url_open_dir        = libssh_open_dir, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    .url_read_dir        = libssh_read_dir, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    .url_close_dir       = libssh_close_dir, | 
		
		
	
	
		
			
				| 
				
					
				
				
				
				 | 
			
			 | 
			
  |