FTP: fix truncate errors. Also correct errno reporting.

Seems that warnx() everytime changes originak errno to EINVAL.
This commit is contained in:
Vladimir Ermakov
2014-09-17 20:02:32 +04:00
parent f55d20a133
commit 407a4e0f06
+4 -4
View File
@@ -230,6 +230,7 @@ out:
warnx("FTP: ack\n"); warnx("FTP: ack\n");
#endif #endif
} else { } else {
int r_errno = errno;
warnx("FTP: nak %u", errorCode); warnx("FTP: nak %u", errorCode);
payload->req_opcode = payload->opcode; payload->req_opcode = payload->opcode;
payload->opcode = kRspNak; payload->opcode = kRspNak;
@@ -237,7 +238,7 @@ out:
payload->data[0] = errorCode; payload->data[0] = errorCode;
if (errorCode == kErrFailErrno) { if (errorCode == kErrFailErrno) {
payload->size = 2; payload->size = 2;
payload->data[1] = errno; payload->data[1] = r_errno;
} }
} }
@@ -544,8 +545,7 @@ MavlinkFTP::_workTruncateFile(PayloadHeader* payload)
} }
// check perms allow us to write (not romfs) // check perms allow us to write (not romfs)
int mode = st.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO); if (!(st.st_mode & (S_IWUSR | S_IWGRP | S_IWOTH))) {
if (!(mode & ~(S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH))) {
errno = EROFS; errno = EROFS;
return kErrFailErrno; return kErrFailErrno;
} }
@@ -571,7 +571,7 @@ MavlinkFTP::_workTruncateFile(PayloadHeader* payload)
return kErrFailErrno; return kErrFailErrno;
} }
if (lseek(fd, payload->offset - 1, SEEK_SET) != 0) { if (lseek(fd, payload->offset - 1, SEEK_SET) < 0) {
::close(fd); ::close(fd);
return kErrFailErrno; return kErrFailErrno;
} }