Browse Source

Move read_in_full() and write_in_full() to wrapper.c

A few compat/* layer functions call these functions, but we would really
want to keep them thin, without depending too much on the libgit proper.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Junio C Hamano 17 years ago
parent
commit
559e840b74
  1. 38
      wrapper.c
  2. 38
      write_or_die.c

38
wrapper.c

@ -133,6 +133,44 @@ ssize_t xwrite(int fd, const void *buf, size_t len) @@ -133,6 +133,44 @@ ssize_t xwrite(int fd, const void *buf, size_t len)
}
}

ssize_t read_in_full(int fd, void *buf, size_t count)
{
char *p = buf;
ssize_t total = 0;

while (count > 0) {
ssize_t loaded = xread(fd, p, count);
if (loaded <= 0)
return total ? total : loaded;
count -= loaded;
p += loaded;
total += loaded;
}

return total;
}

ssize_t write_in_full(int fd, const void *buf, size_t count)
{
const char *p = buf;
ssize_t total = 0;

while (count > 0) {
ssize_t written = xwrite(fd, p, count);
if (written < 0)
return -1;
if (!written) {
errno = ENOSPC;
return -1;
}
count -= written;
p += written;
total += written;
}

return total;
}

int xdup(int fd)
{
int ret = dup(fd);

38
write_or_die.c

@ -45,44 +45,6 @@ void maybe_flush_or_die(FILE *f, const char *desc) @@ -45,44 +45,6 @@ void maybe_flush_or_die(FILE *f, const char *desc)
}
}

ssize_t read_in_full(int fd, void *buf, size_t count)
{
char *p = buf;
ssize_t total = 0;

while (count > 0) {
ssize_t loaded = xread(fd, p, count);
if (loaded <= 0)
return total ? total : loaded;
count -= loaded;
p += loaded;
total += loaded;
}

return total;
}

ssize_t write_in_full(int fd, const void *buf, size_t count)
{
const char *p = buf;
ssize_t total = 0;

while (count > 0) {
ssize_t written = xwrite(fd, p, count);
if (written < 0)
return -1;
if (!written) {
errno = ENOSPC;
return -1;
}
count -= written;
p += written;
total += written;
}

return total;
}

void fsync_or_die(int fd, const char *msg)
{
if (fsync(fd) < 0) {

Loading…
Cancel
Save