diff options
author | px4dev <px4@purgatory.org> | 2014-05-04 12:25:25 -0700 |
---|---|---|
committer | px4dev <px4@purgatory.org> | 2014-05-04 12:25:25 -0700 |
commit | ef7c57f1cece0e49cd95e7bbdc0d6563eca6a9eb (patch) | |
tree | e520fc5ff86ffbdfab11625bcd546160d37cb371 /src/modules/mavlink/mavlink_ftp.cpp | |
parent | 12390d7281985b7e3b6649fc9889e2e60a48dad1 (diff) | |
download | px4-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.cpp | 51 |
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 |