Ejemplo n.º 1
0
/* sftp获取文件列表 */
static int sftp_get_list(protocol_data_t *protocol, char **filelist, int *filecounts)
{
#define MALLOC_NUM 10
    if (protocol == NULL || protocol->protocol_data == NULL) {
        return;
    }

    int rc;
    int allocnum;
    int blocksize;
    LIBSSH2_SFTP_ATTRIBUTES attrs;
    int reallocnum;

    sftp_data_t *data = (sftp_data_t *)protocol->protocol_data;
    
    blocksize = sizeof(file_t);

    *filelist = (char *)malloc(blocksize * MALLOC_NUM);
    if (*filelist == NULL) {
        return -2;
    }

    allocnum = MALLOC_NUM;
    reallocnum = MALLOC_NUM;
    *filecounts = 0;

    do {
         char filename[MAX_FILENAME_LEN] = {0}; /*255是文件名最大长度*/
         /* filename存储文件和文件夹名 */
         rc = libssh2_sftp_readdir_ex(data->dir_handle, filename, sizeof(filename), NULL, 0, &attrs);
         if(rc > 0) {
             if (filename[0] != '\0' && filename[0] != '.') {/*略去隐藏文件*/
                 /* 文件夹  或者 普通文件*/
                 if(LIBSSH2_SFTP_S_ISDIR(attrs.permissions) || LIBSSH2_SFTP_S_ISREG(attrs.permissions)) {
                     if (*filecounts >= allocnum) {
                         reallocnum = reallocnum + MALLOC_NUM;
                         *filelist = (char *)realloc(*filelist, blocksize * reallocnum);
                         if (*filelist == NULL) {
                             return -2;
                         }
                         allocnum = allocnum + MALLOC_NUM;
                     }

                     memcpy(*filelist + *filecounts * blocksize, filename, MAX_FILENAME_LEN);
                     memcpy(*filelist + *filecounts * blocksize + MAX_FILENAME_LEN,
                             (char *)&attrs + sizeof(unsigned long), blocksize - MAX_FILENAME_LEN);
                     *filecounts += 1;
                 }
             } 
         } else if (rc == 0) {
             return 0;
         } else {
             return -1;
         }
     } while (1);

     return 0;
}
Ejemplo n.º 2
0
static
void attr2urlinfo(QUrlInfo *urlInfo, const QString &name,
                  LIBSSH2_SFTP_ATTRIBUTES *sftp_attr)
{
    urlInfo->setName(name);

    urlInfo->setSymLink(LIBSSH2_SFTP_S_ISLNK(sftp_attr->permissions));
    urlInfo->setFile(LIBSSH2_SFTP_S_ISREG(sftp_attr->permissions));
    urlInfo->setDir(LIBSSH2_SFTP_S_ISDIR(sftp_attr->permissions));

    QDateTime dt(QDateTime::fromString("1970-01-01 00:00:00",
                                       "yyyy-MM-dd HH:mm:ss"));
    urlInfo->setLastModified(dt.addSecs(sftp_attr->mtime));
    urlInfo->setLastRead(dt.addSecs(sftp_attr->atime));

    urlInfo->setSize(sftp_attr->filesize);

    int p = 0;

    if (sftp_attr->permissions & LIBSSH2_SFTP_S_IRUSR)
        p |= QFile::ReadUser | QFile::ReadOwner;

    if (sftp_attr->permissions & LIBSSH2_SFTP_S_IWUSR)
        p |= QFile::WriteUser | QFile::WriteOwner;

    if (sftp_attr->permissions & LIBSSH2_SFTP_S_IXUSR)
        p |= QFile::ExeUser | QFile::ExeOwner;

    if (sftp_attr->permissions & LIBSSH2_SFTP_S_IRGRP)
        p |= QFile::ReadGroup;

    if (sftp_attr->permissions & LIBSSH2_SFTP_S_IWGRP)
        p |= QFile::WriteGroup;

    if (sftp_attr->permissions & LIBSSH2_SFTP_S_IXGRP)
        p |= QFile::ExeGroup;

    if (sftp_attr->permissions & LIBSSH2_SFTP_S_IROTH)
        p |= QFile::ReadOther;

    if (sftp_attr->permissions & LIBSSH2_SFTP_S_IWOTH)
        p |= QFile::WriteOther;

    if (sftp_attr->permissions & LIBSSH2_SFTP_S_IXOTH)
        p |= QFile::ExeOther;

    urlInfo->setPermissions(p);
    urlInfo->setReadable(p & (LIBSSH2_SFTP_S_IRUSR | LIBSSH2_SFTP_S_IROTH));
    urlInfo->setWritable(p & (LIBSSH2_SFTP_S_IWUSR | LIBSSH2_SFTP_S_IWOTH));

    // TODO
    // urlInfo->setGroup();
    // urlInfo->setOwner();
}
Ejemplo n.º 3
0
/* sftp删除文件夹 */
static int sftp_rm_dir(protocol_data_t *protocol, char *dirname)
{
    int rc;
    LIBSSH2_SFTP_ATTRIBUTES attrs;
    LIBSSH2_SFTP_HANDLE *dir_handle;
    char source[MAX_PATH_LEN] = {0};

    if (protocol == NULL || protocol->protocol_data == NULL 
            || dirname == NULL) {
        return -1;
    }
    
    sftp_data_t *data = (sftp_data_t *)protocol->protocol_data;
    strcpy(source, dirname);

    dir_handle = libssh2_sftp_opendir(data->sftp_session, source);
    if (!dir_handle) {
        return -1;
    }

    do {
         char filename[MAX_FILENAME_LEN] = {0}; /*255是文件名最大长度*/
         rc = libssh2_sftp_readdir_ex(dir_handle, filename, sizeof(filename), NULL, 0, &attrs);
         if(rc > 0) {
             if (filename[0] != '\0' && filename[0] != '.') {/*略去隐藏文件*/
                 if (LIBSSH2_SFTP_S_ISREG(attrs.permissions)) {
                     add_lastfilename(source, filename);
                     libssh2_sftp_unlink(data->sftp_session, source);
                     del_lastfilename(source);
                 }
                 if(LIBSSH2_SFTP_S_ISDIR(attrs.permissions)){
                     add_lastdirname(source, filename);
                     sftp_rm_dir(protocol, source);
                     del_lastdirname(source);
                 }
             }
         } else if (rc == 0) {
             break;
         } else {
             continue;
         }
    } while (1);

    libssh2_sftp_closedir(dir_handle);
    libssh2_sftp_rmdir(data->sftp_session, source);

    return 0;
}