MCPcopy Create free account
hub / github.com/KangLin/RabbitRemoteControl / AsyncReadDir

Method AsyncReadDir

Plugins/FileTransfer/ChannelSFTP.cpp:404–495  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

402}
403
404int CChannelSFTP::AsyncReadDir()
405{
406 //qDebug(log) << Q_FUNC_INFO;
407 for(auto it = m_vDirs.begin(); it != m_vDirs.end();) {
408 auto d = *it;
409 switch (d->state) {
410 case STATE::OPEN: {
411 d->sftp = sftp_opendir(m_SessionSftp, d->szPath.toStdString().c_str());
412 if(d->sftp) {
413 d->state = STATE::READ;
414 break;
415 }
416 int err = sftp_get_error(m_SessionSftp);
417 if (err == SSH_FX_OK || err == SSH_FX_EOF) {
418 d->state = STATE::FINISH;
419 break;
420 }
421 if (err == SSH_FX_FAILURE && ssh_get_error_code(m_Session) == SSH_REQUEST_DENIED) {
422 qDebug(log) << "Request denied:" << d->szPath;
423 break;
424 }
425 qCritical(log) << "Error opening directory:" << d->szPath
426 << "Error:"
427 << sftp_get_error(m_SessionSftp)
428 << ssh_get_error(m_Session);
429 d->state = STATE::ERR;
430 d->Error = err;
431 break;
432 }
433 case STATE::READ: {
434 sftp_attributes attributes = nullptr;
435 while ((attributes = sftp_readdir(m_SessionSftp, d->sftp)) != NULL) {
436 auto p = GetFileNode(d->szPath, attributes);
437 if(p)
438 d->vFileNode.append(p);
439 sftp_attributes_free(attributes);
440 }
441 // 检查是否结束
442 if (sftp_dir_eof(d->sftp)) {
443 d->state = STATE::CLOSE;
444 break;
445 }
446 int err = sftp_get_error(m_SessionSftp);
447 if (err == SSH_FX_OK)
448 break;
449 if (err == SSH_FX_EOF) {
450 break;
451 d->state = STATE::CLOSE;
452 }
453 qCritical(log) << "Error reading directory:" << d->szPath
454 << "Error:" << err << ssh_get_error(m_Session);
455 d->state = STATE::ERR;
456 d->Error = err;
457 break;
458 }
459 case STATE::CLOSE: {
460 if(!d->sftp) {
461 d->state = STATE::FINISH;

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected