Fix atomic readfile app when file reports zero length (#133)

Co-authored-by: Steve Karg <skarg@users.sourceforge.net>
This commit is contained in:
Steve Karg
2020-10-10 10:45:34 -05:00
committed by GitHub
parent 762ffacc8e
commit 4b1794f93a
+20 -10
View File
@@ -112,6 +112,8 @@ static void AtomicReadFileAckHandler(uint8_t *service_request,
BACNET_ATOMIC_READ_FILE_DATA data; BACNET_ATOMIC_READ_FILE_DATA data;
FILE *pFile = NULL; /* stream pointer */ FILE *pFile = NULL; /* stream pointer */
size_t octets_written = 0; size_t octets_written = 0;
size_t octet_count = 0;
uint8_t *octet_buffer = NULL;
if (address_match(&Target_Address, src) && if (address_match(&Target_Address, src) &&
(service_data->invoke_id == Request_Invoke_ID)) { (service_data->invoke_id == Request_Invoke_ID)) {
@@ -124,31 +126,39 @@ static void AtomicReadFileAckHandler(uint8_t *service_request,
pFile = fopen(Local_File_Name, "rb+"); pFile = fopen(Local_File_Name, "rb+");
} }
if (pFile) { if (pFile) {
result = octet_count = octetstring_length(&data.fileData[0]);
fseek(pFile, data.type.stream.fileStartPosition, SEEK_SET); if (octet_count == 0) {
/* asked for many octets, and got zero. Force EOF */
if (!data.endOfFile) {
fprintf(stderr, "Missing EOF!\n");
data.endOfFile = true;
}
} else {
result = fseek(pFile, data.type.stream.fileStartPosition,
SEEK_SET);
if (result == 0) { if (result == 0) {
/* unit to write in bytes - /* unit to write in bytes -
in our case, an octet is one byte */ in our case, an octet is one byte */
octet_buffer = octetstring_value(&data.fileData[0]);
octets_written = octets_written =
fwrite(octetstring_value(&data.fileData[0]), 1, fwrite(octet_buffer, 1, octet_count, pFile);
octetstring_length(&data.fileData[0]), pFile); if (octets_written != octet_count) {
if (octets_written !=
octetstring_length(&data.fileData[0])) {
fprintf(stderr, fprintf(stderr,
"Unable to write data to file \"%s\".\n", "Unable to write data to file \"%s\".\n",
Local_File_Name); Local_File_Name);
} else if (octets_written == 0) {
fprintf(stderr, "Received 0 byte octet string!.\n");
} else { } else {
Target_File_Start_Position = Target_File_Start_Position =
data.type.stream.fileStartPosition + octets_written; data.type.stream.fileStartPosition +
printf("\r%d bytes", (int)Target_File_Start_Position); octets_written;
printf("\r%d bytes",
(int)Target_File_Start_Position);
} }
fflush(pFile); fflush(pFile);
} else { } else {
fprintf(stderr, "Unable to seek to %d!\n", fprintf(stderr, "Unable to seek to %d!\n",
data.type.stream.fileStartPosition); data.type.stream.fileStartPosition);
} }
}
fclose(pFile); fclose(pFile);
} }
if (data.endOfFile) { if (data.endOfFile) {