зеркало из https://github.com/microsoft/git.git
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>
This commit is contained in:
Родитель
7df1709c36
Коммит
559e840b74
38
wrapper.c
38
wrapper.c
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче