* fixes/2.45.1/2.41: Revert "fsck: warn about symlink pointing inside a gitdir" Revert "Add a helper function to compare file contents" clone: drop the protections where hooks aren't run tests: verify that `clone -c core.hooksPath=/dev/null` works again Revert "core.hooksPath: add some protection while cloning" init: use the correct path of the templates directory again hook: plug a new memory leak ci: stop installing "gcc-13" for osx-gcc ci: avoid bare "gcc" for osx-gcc job ci: drop mention of BREW_INSTALL_PACKAGES variable send-email: avoid creating more than one Term::ReadLine object send-email: drop FakeTerm hack
		
			
				
	
	
		
			73 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include "git-compat-util.h"
 | 
						|
#include "copy.h"
 | 
						|
#include "path.h"
 | 
						|
#include "gettext.h"
 | 
						|
#include "strbuf.h"
 | 
						|
#include "abspath.h"
 | 
						|
 | 
						|
int copy_fd(int ifd, int ofd)
 | 
						|
{
 | 
						|
	while (1) {
 | 
						|
		char buffer[8192];
 | 
						|
		ssize_t len = xread(ifd, buffer, sizeof(buffer));
 | 
						|
		if (!len)
 | 
						|
			break;
 | 
						|
		if (len < 0)
 | 
						|
			return COPY_READ_ERROR;
 | 
						|
		if (write_in_full(ofd, buffer, len) < 0)
 | 
						|
			return COPY_WRITE_ERROR;
 | 
						|
	}
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
static int copy_times(const char *dst, const char *src)
 | 
						|
{
 | 
						|
	struct stat st;
 | 
						|
	struct utimbuf times;
 | 
						|
	if (stat(src, &st) < 0)
 | 
						|
		return -1;
 | 
						|
	times.actime = st.st_atime;
 | 
						|
	times.modtime = st.st_mtime;
 | 
						|
	if (utime(dst, ×) < 0)
 | 
						|
		return -1;
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
int copy_file(const char *dst, const char *src, int mode)
 | 
						|
{
 | 
						|
	int fdi, fdo, status;
 | 
						|
 | 
						|
	mode = (mode & 0111) ? 0777 : 0666;
 | 
						|
	if ((fdi = open(src, O_RDONLY)) < 0)
 | 
						|
		return fdi;
 | 
						|
	if ((fdo = open(dst, O_WRONLY | O_CREAT | O_EXCL, mode)) < 0) {
 | 
						|
		close(fdi);
 | 
						|
		return fdo;
 | 
						|
	}
 | 
						|
	status = copy_fd(fdi, fdo);
 | 
						|
	switch (status) {
 | 
						|
	case COPY_READ_ERROR:
 | 
						|
		error_errno("copy-fd: read returned");
 | 
						|
		break;
 | 
						|
	case COPY_WRITE_ERROR:
 | 
						|
		error_errno("copy-fd: write returned");
 | 
						|
		break;
 | 
						|
	}
 | 
						|
	close(fdi);
 | 
						|
	if (close(fdo) != 0)
 | 
						|
		return error_errno("%s: close error", dst);
 | 
						|
 | 
						|
	if (!status && adjust_shared_perm(dst))
 | 
						|
		return -1;
 | 
						|
 | 
						|
	return status;
 | 
						|
}
 | 
						|
 | 
						|
int copy_file_with_time(const char *dst, const char *src, int mode)
 | 
						|
{
 | 
						|
	int status = copy_file(dst, src, mode);
 | 
						|
	if (!status)
 | 
						|
		return copy_times(dst, src);
 | 
						|
	return status;
 | 
						|
}
 |