mirror of
https://github.com/git-for-windows/git.git
synced 2026-04-19 19:39:56 -05:00
Merge branch 'jc/no-writev-does-not-work' into jch
* 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
@@ -2030,10 +2030,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)
|
||||
|
||||
@@ -1430,7 +1430,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
@@ -439,7 +439,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];
|
||||
|
||||
@@ -449,19 +448,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