mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-31 08:11:36 +08:00
FTP: Add file checksum calculation command.
This commit is contained in:
@@ -34,6 +34,7 @@
|
|||||||
/// @file mavlink_ftp.cpp
|
/// @file mavlink_ftp.cpp
|
||||||
/// @author px4dev, Don Gagne <don@thegagnes.com>
|
/// @author px4dev, Don Gagne <don@thegagnes.com>
|
||||||
|
|
||||||
|
#include <crc32.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
@@ -220,6 +221,11 @@ MavlinkFTP::_process_request(Request *req)
|
|||||||
errorCode = _workRemoveDirectory(payload);
|
errorCode = _workRemoveDirectory(payload);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case kCmdCalcFileCRC32:
|
||||||
|
errorCode = _workCalcFileCRC32(payload);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
errorCode = kErrUnknownCommand;
|
errorCode = kErrUnknownCommand;
|
||||||
break;
|
break;
|
||||||
@@ -690,6 +696,39 @@ MavlinkFTP::_workCreateDirectory(PayloadHeader* payload)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @brief Responds to a CalcFileCRC32 command
|
||||||
|
MavlinkFTP::ErrorCode
|
||||||
|
MavlinkFTP::_workCalcFileCRC32(PayloadHeader* payload)
|
||||||
|
{
|
||||||
|
char file_buf[256];
|
||||||
|
uint32_t checksum = 0;
|
||||||
|
ssize_t bytes_read;
|
||||||
|
strncpy(file_buf, _data_as_cstring(payload), kMaxDataLength);
|
||||||
|
|
||||||
|
int fd = ::open(file_buf, O_RDONLY);
|
||||||
|
if (fd < 0) {
|
||||||
|
return kErrFailErrno;
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
bytes_read = ::read(fd, file_buf, sizeof(file_buf));
|
||||||
|
if (bytes_read < 0) {
|
||||||
|
int r_errno = errno;
|
||||||
|
::close(fd);
|
||||||
|
errno = r_errno;
|
||||||
|
return kErrFailErrno;
|
||||||
|
}
|
||||||
|
|
||||||
|
checksum = crc32part((uint8_t*)file_buf, bytes_read, checksum);
|
||||||
|
} while (bytes_read == sizeof(file_buf));
|
||||||
|
|
||||||
|
::close(fd);
|
||||||
|
|
||||||
|
payload->size = sizeof(uint32_t);
|
||||||
|
*((uint32_t*)payload->data) = checksum;
|
||||||
|
return kErrNone;
|
||||||
|
}
|
||||||
|
|
||||||
/// @brief Returns true if the specified session is a valid open session
|
/// @brief Returns true if the specified session is a valid open session
|
||||||
bool
|
bool
|
||||||
MavlinkFTP::_valid_session(unsigned index)
|
MavlinkFTP::_valid_session(unsigned index)
|
||||||
|
|||||||
@@ -99,6 +99,7 @@ public:
|
|||||||
kCmdOpenFileWO, ///< Opens file at <path> for writing, returns <session>
|
kCmdOpenFileWO, ///< Opens file at <path> for writing, returns <session>
|
||||||
kCmdTruncateFile, ///< Truncate file at <path> to <offset> length
|
kCmdTruncateFile, ///< Truncate file at <path> to <offset> length
|
||||||
kCmdRename, ///< Rename <path1> to <path2>
|
kCmdRename, ///< Rename <path1> to <path2>
|
||||||
|
kCmdCalcFileCRC32, ///< Calculate CRC32 for file at <path>
|
||||||
|
|
||||||
kRspAck = 128, ///< Ack response
|
kRspAck = 128, ///< Ack response
|
||||||
kRspNak ///< Nak response
|
kRspNak ///< Nak response
|
||||||
@@ -154,6 +155,7 @@ private:
|
|||||||
ErrorCode _workRemoveFile(PayloadHeader *payload);
|
ErrorCode _workRemoveFile(PayloadHeader *payload);
|
||||||
ErrorCode _workTruncateFile(PayloadHeader *payload);
|
ErrorCode _workTruncateFile(PayloadHeader *payload);
|
||||||
ErrorCode _workRename(PayloadHeader *payload);
|
ErrorCode _workRename(PayloadHeader *payload);
|
||||||
|
ErrorCode _workCalcFileCRC32(PayloadHeader *payload);
|
||||||
|
|
||||||
static const unsigned kRequestQueueSize = 2; ///< Max number of queued requests
|
static const unsigned kRequestQueueSize = 2; ///< Max number of queued requests
|
||||||
Request _request_bufs[kRequestQueueSize]; ///< Request buffers which hold work
|
Request _request_bufs[kRequestQueueSize]; ///< Request buffers which hold work
|
||||||
|
|||||||
Reference in New Issue
Block a user