These functions handles EINTR/EAGAIN errors during read/write operations,
which is something cache.c didn't.
While at it, fix a bug in print_slot() where errors during reading from the
cache slot might go by unnoticed.
Noticed-by: Jim Meyering <jim@meyering.net>
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
if (fstat(slot->cache_fd, &slot->cache_st))
return errno;
if (fstat(slot->cache_fd, &slot->cache_st))
return errno;
- slot->bufsize = read(slot->cache_fd, slot->buf, sizeof(slot->buf));
+ slot->bufsize = xread(slot->cache_fd, slot->buf, sizeof(slot->buf));
if (slot->bufsize < 0)
return errno;
if (slot->bufsize < 0)
return errno;
/* Print the content of the active cache slot (but skip the key). */
static int print_slot(struct cache_slot *slot)
{
/* Print the content of the active cache slot (but skip the key). */
static int print_slot(struct cache_slot *slot)
{
i = lseek(slot->cache_fd, slot->keylen + 1, SEEK_SET);
if (i != slot->keylen + 1)
return errno;
i = lseek(slot->cache_fd, slot->keylen + 1, SEEK_SET);
if (i != slot->keylen + 1)
return errno;
- while((i=read(slot->cache_fd, slot->buf, sizeof(slot->buf))) > 0)
- j = write(STDOUT_FILENO, slot->buf, i);
+ while((i = xread(slot->cache_fd, slot->buf, sizeof(slot->buf))) > 0)
+ i = xwrite(STDOUT_FILENO, slot->buf, i);
return errno;
else
return 0;
return errno;
else
return 0;
S_IRUSR|S_IWUSR);
if (slot->lock_fd == -1)
return errno;
S_IRUSR|S_IWUSR);
if (slot->lock_fd == -1)
return errno;
- if (write(slot->lock_fd, slot->key, slot->keylen + 1) < 0)
+ if (xwrite(slot->lock_fd, slot->key, slot->keylen + 1) < 0)
return errno;
return 0;
}
return errno;
return 0;
}