| 402 | } |
| 403 | |
| 404 | int 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; |
nothing calls this directly
no outgoing calls
no test coverage detected