aboutsummaryrefslogtreecommitdiff
path: root/src/modules/mavlink/mavlink_ftp.cpp
diff options
context:
space:
mode:
authorpx4dev <px4@purgatory.org>2014-05-04 12:25:25 -0700
committerpx4dev <px4@purgatory.org>2014-05-04 12:25:25 -0700
commitef7c57f1cece0e49cd95e7bbdc0d6563eca6a9eb (patch)
treee520fc5ff86ffbdfab11625bcd546160d37cb371 /src/modules/mavlink/mavlink_ftp.cpp
parent12390d7281985b7e3b6649fc9889e2e60a48dad1 (diff)
downloadpx4-firmware-ef7c57f1cece0e49cd95e7bbdc0d6563eca6a9eb.tar.gz
px4-firmware-ef7c57f1cece0e49cd95e7bbdc0d6563eca6a9eb.tar.bz2
px4-firmware-ef7c57f1cece0e49cd95e7bbdc0d6563eca6a9eb.zip
Implement directory listing
Diffstat (limited to 'src/modules/mavlink/mavlink_ftp.cpp')
-rw-r--r--src/modules/mavlink/mavlink_ftp.cpp51
1 files changed, 46 insertions, 5 deletions
diff --git a/src/modules/mavlink/mavlink_ftp.cpp b/src/modules/mavlink/mavlink_ftp.cpp
index 4cb31640e..16f96f2cc 100644
--- a/src/modules/mavlink/mavlink_ftp.cpp
+++ b/src/modules/mavlink/mavlink_ftp.cpp
@@ -187,16 +187,57 @@ MavlinkFTP::ErrorCode
MavlinkFTP::_workList(Request *req)
{
auto hdr = req->header();
+ DIR *dp = opendir(req->dataAsCString());
- // open directory
+ if (dp == nullptr) {
+ return kErrNotDir;
+ }
- // seek in directory
+ ErrorCode errorCode = kErrNone;
+ struct dirent entry, *result = nullptr;
+ unsigned offset = 0;
- // read entries until buffer is full
+ // move to the requested offset
+ seekdir(dp, hdr->offset);
- // send reply
+ for (;;) {
+ // read the directory entry
+ if (readdir_r(dp, &entry, &result)) {
+ errorCode = kErrIO;
+ break;
+ }
- return kErrNone;
+ // no more entries?
+ if (result == nullptr) {
+ break;
+ }
+
+ // name too big to fit?
+ if ((strlen(entry.d_name) + offset + 2) > kMaxDataLength) {
+ break;
+ }
+
+ // store the type marker
+ switch (entry.d_type) {
+ case DTYPE_FILE:
+ hdr->data[offset++] = kDirentFile;
+ break;
+ case DTYPE_DIRECTORY:
+ hdr->data[offset++] = kDirentDir;
+ break;
+ default:
+ hdr->data[offset++] = kDirentUnknown;
+ break;
+ }
+
+ // copy the name, which we know will fit
+ strcpy((char *)&hdr->data[offset], entry.d_name);
+ }
+
+ closedir(dp);
+ hdr->size = offset;
+
+ return errorCode;
}
MavlinkFTP::ErrorCode