Proper file IO loops #40

This commit is contained in:
David Sidrane
2015-08-19 10:54:02 -10:00
parent e0a619c011
commit 121f83a420
4 changed files with 85 additions and 30 deletions
@@ -380,7 +380,7 @@ protected:
{
int rv = uavcan::protocol::file::Error::INVALID_VALUE;
if (path.size() > 0)
if (path.size() > 0 && inout_size != 0)
{
FDCacheBase& cache = getFDCache();
int fd = cache.open(path.c_str(), O_RDONLY);
@@ -391,9 +391,9 @@ protected:
}
else
{
rv = ::lseek(fd, offset, SEEK_SET);
ssize_t total_read = 0;
ssize_t len = 0;
rv = ::lseek(fd, offset, SEEK_SET);
if (rv < 0)
{
@@ -401,21 +401,27 @@ protected:
}
else
{
// TODO use a read at offset to fill on EAGAIN
len = ::read(fd, out_buffer, inout_size);
if (len < 0)
rv = 0;
ssize_t remaining = inout_size;
ssize_t nread;
do
{
rv = errno;
}
else
{
rv = 0;
nread = ::read(fd, &out_buffer[total_read], remaining);
if (nread < 0)
{
rv = errno;
}
else
{
remaining -= nread,
total_read += nread;
}
}
while (nread > 0 && remaining > 0);
}
(void)cache.close(fd, rv != 0 || len != inout_size);
inout_size = len;
(void)cache.close(fd, rv != 0 || total_read != inout_size);
inout_size = total_read;
}
}
return rv;
@@ -51,10 +51,22 @@ protected:
{
const int FormatBufferLength = 63;
char buffer[FormatBufferLength + 1];
int n = snprintf(buffer, FormatBufferLength, "%ld.%06ld\t%d\t%lld\n",
static_cast<long>(ts.tv_sec), static_cast<long>(ts.tv_nsec / 1000L),
static_cast<int>(code), static_cast<long long>(argument));
(void)write(fd, buffer, n); // TODO FIXME Write loop
ssize_t remaining = snprintf(buffer, FormatBufferLength, "%ld.%06ld\t%d\t%lld\n",
static_cast<long>(ts.tv_sec), static_cast<long>(ts.tv_nsec / 1000L),
static_cast<int>(code), static_cast<long long>(argument));
ssize_t total_written = 0;
ssize_t written;
do
{
written = write(fd, &buffer[total_written], remaining);
if (written > 0)
{
total_written += written;
remaining -= written;
}
}
while (written > 0 && remaining > 0);
(void)close(fd);
}
}
@@ -82,7 +94,6 @@ public:
return rv;
}
};
}
}
@@ -55,13 +55,25 @@ protected:
{
char buffer[MaxStringLength + 1];
(void)memset(buffer, 0, sizeof(buffer));
int len = read(fd, buffer, MaxStringLength);
(void)close(fd);
if (len > 0)
ssize_t remaining = MaxStringLength;
ssize_t total_read = 0;
ssize_t nread;
do
{
for (int i = 0; i < len; i++)
nread = ::read(fd, &buffer[total_read], remaining);
if (nread > 0)
{
if (buffer[i] == ' ' || buffer[i] == '\n' || buffer[i] == '\r' )
remaining -= nread,
total_read += nread;
}
}
while (nread > 0 && remaining > 0);
(void)close(fd);
if (total_read > 0)
{
for (int i = 0; i < total_read; i++)
{
if (buffer[i] == ' ' || buffer[i] == '\n' || buffer[i] == '\r')
{
buffer[i] = '\0';
break;
@@ -81,7 +93,20 @@ protected:
int fd = open(path.c_str(), O_WRONLY | O_CREAT | O_TRUNC, FilePermissions);
if (fd >= 0)
{
(void)write(fd, value.c_str(), value.size()); // TODO FIXME Write loop
ssize_t remaining = value.size();
ssize_t total_written = 0;
ssize_t written;
do
{
written = write(fd, &value.c_str()[total_written], remaining);
if (written > 0)
{
total_written += written;
remaining -= written;
}
}
while (written > 0 && remaining > 0);
(void)fsync(fd);
(void)close(fd);
}
@@ -117,7 +142,7 @@ public:
// coverity[toctou]
rv = mkdir(base_path.c_str(), S_IRWXU | S_IRWXG | S_IRWXO);
}
if (rv >= 0 )
if (rv >= 0)
{
base_path.push_back('/');
if ((base_path.size() + MaxStringLength) > MaxPathLength)
@@ -129,7 +154,6 @@ public:
return rv;
}
};
}
}
@@ -125,10 +125,24 @@ class FirmwareVersionChecker : public uavcan::IFirmwareVersionChecker
}
else
{
if (size != write(dfd, buffer, size))
rv = 0;
ssize_t remaining = size;
ssize_t total_written = 0;
ssize_t written;
do
{
rv = -errno;
written = write(dfd, &buffer[total_written], remaining);
if (written < 0)
{
rv = -errno;
}
else
{
total_written += written;
remaining -= written;
}
}
while (written > 0 && remaining > 0);
}
}
}
@@ -251,7 +265,7 @@ protected:
node_info.hardware_version.major,
node_info.hardware_version.minor);
if (n > 0 && n < (int) sizeof(fname_root) - 2)
if (n > 0 && n < (int)sizeof(fname_root) - 2)
{
DIR* const fwdir = opendir(fname_root);