mirror of
https://github.com/git/git.git
synced 2026-08-02 22:27:14 +00:00
Merge branch 'jc/no-writev-does-not-work'
We used writev() in limited code paths and supplied emulation for platforms without working writev(), but the emulation was too faithful to the spec to make the result useless to send even 64kB; revert the topic and plan to restart the effort later. * jc/no-writev-does-not-work: Revert "compat/posix: introduce writev(3p) wrapper" Revert "wrapper: introduce writev(3p) wrappers" Revert "sideband: use writev(3p) to send pktlines" Revert "cmake: use writev(3p) wrapper as needed"
This commit is contained in:
4
Makefile
4
Makefile
@@ -2029,10 +2029,6 @@ ifdef NO_PREAD
|
||||
COMPAT_CFLAGS += -DNO_PREAD
|
||||
COMPAT_OBJS += compat/pread.o
|
||||
endif
|
||||
ifdef NO_WRITEV
|
||||
COMPAT_CFLAGS += -DNO_WRITEV
|
||||
COMPAT_OBJS += compat/writev.o
|
||||
endif
|
||||
ifdef NO_FAST_WORKING_DIRECTORY
|
||||
BASIC_CFLAGS += -DNO_FAST_WORKING_DIRECTORY
|
||||
endif
|
||||
|
||||
@@ -137,9 +137,6 @@
|
||||
#include <sys/socket.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/statvfs.h>
|
||||
#ifndef NO_WRITEV
|
||||
#include <sys/uio.h>
|
||||
#endif
|
||||
#include <termios.h>
|
||||
#ifndef NO_SYS_SELECT_H
|
||||
#include <sys/select.h>
|
||||
@@ -326,17 +323,6 @@ int git_lstat(const char *, struct stat *);
|
||||
ssize_t git_pread(int fd, void *buf, size_t count, off_t offset);
|
||||
#endif
|
||||
|
||||
#ifdef NO_WRITEV
|
||||
#define writev git_writev
|
||||
#define iovec git_iovec
|
||||
struct git_iovec {
|
||||
void *iov_base;
|
||||
size_t iov_len;
|
||||
};
|
||||
|
||||
ssize_t git_writev(int fd, const struct iovec *iov, int iovcnt);
|
||||
#endif
|
||||
|
||||
#ifdef NO_SETENV
|
||||
#define setenv gitsetenv
|
||||
int gitsetenv(const char *, const char *, int);
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
#include "../git-compat-util.h"
|
||||
#include "../wrapper.h"
|
||||
|
||||
ssize_t git_writev(int fd, const struct iovec *iov, int iovcnt)
|
||||
{
|
||||
size_t total_written = 0;
|
||||
size_t sum = 0;
|
||||
|
||||
/*
|
||||
* According to writev(3p), the syscall shall error with EINVAL in case
|
||||
* the sum of `iov_len` overflows `ssize_t`.
|
||||
*/
|
||||
for (int i = 0; i < iovcnt; i++) {
|
||||
if (iov[i].iov_len > maximum_signed_value_of_type(ssize_t) ||
|
||||
iov[i].iov_len + sum > maximum_signed_value_of_type(ssize_t)) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
sum += iov[i].iov_len;
|
||||
}
|
||||
|
||||
for (int i = 0; i < iovcnt; i++) {
|
||||
const char *bytes = iov[i].iov_base;
|
||||
size_t iovec_written = 0;
|
||||
|
||||
while (iovec_written < iov[i].iov_len) {
|
||||
ssize_t bytes_written = xwrite(fd, bytes + iovec_written,
|
||||
iov[i].iov_len - iovec_written);
|
||||
if (bytes_written < 0) {
|
||||
if (total_written)
|
||||
goto out;
|
||||
return bytes_written;
|
||||
}
|
||||
if (!bytes_written)
|
||||
goto out;
|
||||
iovec_written += bytes_written;
|
||||
total_written += bytes_written;
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
return (ssize_t) total_written;
|
||||
}
|
||||
@@ -459,7 +459,6 @@ ifeq ($(uname_S),Windows)
|
||||
SANE_TOOL_PATH ?= $(msvc_bin_dir_msys)
|
||||
HAVE_ALLOCA_H = YesPlease
|
||||
NO_PREAD = YesPlease
|
||||
NO_WRITEV = YesPlease
|
||||
NEEDS_CRYPTO_WITH_SSL = YesPlease
|
||||
NO_LIBGEN_H = YesPlease
|
||||
NO_POLL = YesPlease
|
||||
@@ -675,7 +674,6 @@ ifeq ($(uname_S),MINGW)
|
||||
pathsep = ;
|
||||
HAVE_ALLOCA_H = YesPlease
|
||||
NO_PREAD = YesPlease
|
||||
NO_WRITEV = YesPlease
|
||||
NEEDS_CRYPTO_WITH_SSL = YesPlease
|
||||
NO_LIBGEN_H = YesPlease
|
||||
NO_POLL = YesPlease
|
||||
|
||||
@@ -376,7 +376,7 @@ endif()
|
||||
#function checks
|
||||
set(function_checks
|
||||
strcasestr memmem strlcpy strtoimax strtoumax strtoull
|
||||
setenv mkdtemp poll pread memmem writev)
|
||||
setenv mkdtemp poll pread memmem)
|
||||
|
||||
#unsetenv,hstrerror are incompatible with windows build
|
||||
if(NOT WIN32)
|
||||
@@ -421,10 +421,6 @@ if(NOT HAVE_MEMMEM)
|
||||
list(APPEND compat_SOURCES compat/memmem.c)
|
||||
endif()
|
||||
|
||||
if(NOT HAVE_WRITEV)
|
||||
list(APPEND compat_SOURCES compat/writev.c)
|
||||
endif()
|
||||
|
||||
if(NOT WIN32)
|
||||
if(NOT HAVE_UNSETENV)
|
||||
list(APPEND compat_SOURCES compat/unsetenv.c)
|
||||
|
||||
@@ -1429,7 +1429,6 @@ checkfuncs = {
|
||||
'initgroups' : [],
|
||||
'strtoumax' : ['strtoumax.c', 'strtoimax.c'],
|
||||
'pread' : ['pread.c'],
|
||||
'writev' : ['writev.c'],
|
||||
}
|
||||
|
||||
if host_machine.system() == 'windows'
|
||||
|
||||
14
sideband.c
14
sideband.c
@@ -264,7 +264,6 @@ void send_sideband(int fd, int band, const char *data, ssize_t sz, int packet_ma
|
||||
const char *p = data;
|
||||
|
||||
while (sz) {
|
||||
struct iovec iov[2];
|
||||
unsigned n;
|
||||
char hdr[5];
|
||||
|
||||
@@ -274,19 +273,12 @@ void send_sideband(int fd, int band, const char *data, ssize_t sz, int packet_ma
|
||||
if (0 <= band) {
|
||||
xsnprintf(hdr, sizeof(hdr), "%04x", n + 5);
|
||||
hdr[4] = band;
|
||||
iov[0].iov_base = hdr;
|
||||
iov[0].iov_len = 5;
|
||||
write_or_die(fd, hdr, 5);
|
||||
} else {
|
||||
xsnprintf(hdr, sizeof(hdr), "%04x", n + 4);
|
||||
iov[0].iov_base = hdr;
|
||||
iov[0].iov_len = 4;
|
||||
write_or_die(fd, hdr, 4);
|
||||
}
|
||||
|
||||
iov[1].iov_base = (void *) p;
|
||||
iov[1].iov_len = n;
|
||||
|
||||
writev_or_die(fd, iov, ARRAY_SIZE(iov));
|
||||
|
||||
write_or_die(fd, p, n);
|
||||
p += n;
|
||||
sz -= n;
|
||||
}
|
||||
|
||||
41
wrapper.c
41
wrapper.c
@@ -323,47 +323,6 @@ ssize_t write_in_full(int fd, const void *buf, size_t count)
|
||||
return total;
|
||||
}
|
||||
|
||||
ssize_t writev_in_full(int fd, struct iovec *iov, int iovcnt)
|
||||
{
|
||||
ssize_t total_written = 0;
|
||||
|
||||
while (iovcnt) {
|
||||
ssize_t bytes_written = writev(fd, iov, iovcnt);
|
||||
if (bytes_written < 0) {
|
||||
if (errno == EINTR || errno == EAGAIN)
|
||||
continue;
|
||||
return -1;
|
||||
}
|
||||
if (!bytes_written) {
|
||||
errno = ENOSPC;
|
||||
return -1;
|
||||
}
|
||||
|
||||
total_written += bytes_written;
|
||||
|
||||
/*
|
||||
* We first need to discard any iovec entities that have been
|
||||
* fully written.
|
||||
*/
|
||||
while (iovcnt && (size_t)bytes_written >= iov->iov_len) {
|
||||
bytes_written -= iov->iov_len;
|
||||
iov++;
|
||||
iovcnt--;
|
||||
}
|
||||
|
||||
/*
|
||||
* Finally, we need to adjust the last iovec in case we have
|
||||
* performed a partial write.
|
||||
*/
|
||||
if (iovcnt && bytes_written) {
|
||||
iov->iov_base = (char *) iov->iov_base + bytes_written;
|
||||
iov->iov_len -= bytes_written;
|
||||
}
|
||||
}
|
||||
|
||||
return total_written;
|
||||
}
|
||||
|
||||
ssize_t pread_in_full(int fd, void *buf, size_t count, off_t offset)
|
||||
{
|
||||
char *p = buf;
|
||||
|
||||
@@ -47,15 +47,6 @@ ssize_t read_in_full(int fd, void *buf, size_t count);
|
||||
ssize_t write_in_full(int fd, const void *buf, size_t count);
|
||||
ssize_t pread_in_full(int fd, void *buf, size_t count, off_t offset);
|
||||
|
||||
/*
|
||||
* Try to write all iovecs. Returns -1 in case an error occurred with a proper
|
||||
* errno set, the number of bytes written otherwise.
|
||||
*
|
||||
* Note that the iovec will be modified as a result of this call to adjust for
|
||||
* partial writes!
|
||||
*/
|
||||
ssize_t writev_in_full(int fd, struct iovec *iov, int iovcnt);
|
||||
|
||||
static inline ssize_t write_str_in_full(int fd, const char *str)
|
||||
{
|
||||
return write_in_full(fd, str, strlen(str));
|
||||
|
||||
@@ -96,14 +96,6 @@ void write_or_die(int fd, const void *buf, size_t count)
|
||||
}
|
||||
}
|
||||
|
||||
void writev_or_die(int fd, struct iovec *iov, int iovlen)
|
||||
{
|
||||
if (writev_in_full(fd, iov, iovlen) < 0) {
|
||||
check_pipe(errno);
|
||||
die_errno("writev error");
|
||||
}
|
||||
}
|
||||
|
||||
void fwrite_or_die(FILE *f, const void *buf, size_t count)
|
||||
{
|
||||
if (fwrite(buf, 1, count, f) != count)
|
||||
|
||||
@@ -7,7 +7,6 @@ void fprintf_or_die(FILE *, const char *fmt, ...);
|
||||
void fwrite_or_die(FILE *f, const void *buf, size_t count);
|
||||
void fflush_or_die(FILE *f);
|
||||
void write_or_die(int fd, const void *buf, size_t count);
|
||||
void writev_or_die(int fd, struct iovec *iov, int iovlen);
|
||||
|
||||
/*
|
||||
* These values are used to help identify parts of a repository to fsync.
|
||||
|
||||
Reference in New Issue
Block a user