  
  	while (1) {
 -		const char *end = strchrnul(p, ':');
-+		const char *end = strchrnul(p, ';');
++		const char *end = strchrnul(p, PATH_SEP);
  
  		strbuf_reset(&buf);
  
-diff -ru source/send-pack.c source-new/send-pack.c
---- source/send-pack.c	2017-06-04 19:08:11.000000000 -0600
-+++ source-new/send-pack.c	2018-12-02 16:07:24.788757117 -0700
-@@ -570,7 +570,7 @@
- 			if (args->stateless_rpc)
- 				close(out);
- 			if (git_connection_is_socket(conn))
--				shutdown(fd[0], SHUT_WR);
-+				; // XXX
- 
- 			/*
- 			 * Do not even bother with the return value; we know we
-diff -ru source/setup.c source-new/setup.c
+@@ -622,6 +622,7 @@
+ 	struct async *async = data;
+ 	intptr_t ret;
+ 
++#if !defined(__redox__)
+ 	if (async->isolate_sigpipe) {
+ 		sigset_t mask;
+ 		sigemptyset(&mask);
+@@ -631,6 +632,7 @@
+ 			return (void *)ret;
+ 		}
+ 	}
++#endif
+ 
+ 	pthread_setspecific(async_key, async);
+ 	ret = async->proc(async->proc_in, async->proc_out, async->data);
+diff -ruw source/setup.c source-new/setup.c
 --- source/setup.c	2017-06-04 19:08:11.000000000 -0600
-+++ source-new/setup.c	2018-12-02 16:07:24.788757117 -0700
-@@ -1143,21 +1143,21 @@
- 	return read_gitfile_gently(suspect, return_error_code);
- }
- 
--/* if any standard file descriptor is missing open it to /dev/null */
-+/* if any standard file descriptor is missing open it to null: */
++++ source-new/setup.c	2018-12-26 18:52:50.070479933 -0700
+@@ -1146,11 +1146,11 @@
+ /* if any standard file descriptor is missing open it to /dev/null */
  void sanitize_stdfds(void)
  {
 -	int fd = open("/dev/null", O_RDWR, 0);
-+	int fd = open("null:", O_RDWR, 0);
++	int fd = open(DEV_NULL, O_RDWR, 0);
  	while (fd != -1 && fd < 2)
  		fd = dup(fd);
  	if (fd == -1)
 -		die_errno("open /dev/null or dup failed");
-+		die_errno("open null: or dup failed");
++		die_errno("open %s or dup failed", DEV_NULL);
  	if (fd > 2)
  		close(fd);
  }
- 
- int daemonize(void)
- {
--#ifdef NO_POSIX_GOODIES
-+#if 1
- 	errno = ENOSYS;
- 	return -1;
- #else
-diff -ru source/sha1_file.c source-new/sha1_file.c
---- source/sha1_file.c	2017-06-04 19:08:11.000000000 -0600
-+++ source-new/sha1_file.c	2018-12-02 16:07:24.792757146 -0700
-@@ -723,7 +723,7 @@
- 		"pack_report: getpagesize()            = %10" SZ_FMT "\n"
- 		"pack_report: core.packedGitWindowSize = %10" SZ_FMT "\n"
- 		"pack_report: core.packedGitLimit      = %10" SZ_FMT "\n",
--		sz_fmt(getpagesize()),
-+		sz_fmt(4096),
- 		sz_fmt(packed_git_window_size),
- 		sz_fmt(packed_git_limit));
- 	fprintf(stderr,
-diff -ru source/strbuf.c source-new/strbuf.c
+@@ -1169,8 +1169,10 @@
+ 		default:
+ 			exit(0);
+ 	}
++#if !defined(__redox__)
+ 	if (setsid() == -1)
+ 		die_errno("setsid failed");
++#endif
+ 	close(0);
+ 	close(1);
+ 	close(2);
+diff -ruw source/strbuf.c source-new/strbuf.c
 --- source/strbuf.c	2017-06-04 19:08:11.000000000 -0600
-+++ source-new/strbuf.c	2018-12-02 16:07:24.792757146 -0700
-@@ -446,6 +446,11 @@
++++ source-new/strbuf.c	2018-12-26 18:53:39.586122270 -0700
+@@ -446,6 +446,13 @@
  	for (;; guessed_len *= 2) {
  		strbuf_grow(sb, guessed_len);
  		if (getcwd(sb->buf, sb->alloc)) {
++#if defined(__redox__)
 +			if (strncmp(sb->buf, "file:", 5) == 0) {
 +			    char *x = strdup(sb->buf);
 +			    strcpy(sb->buf, x+5);
 +			    free(x);
 +			}
++#endif
  			strbuf_setlen(sb, strlen(sb->buf));
  			return 0;
  		}
-diff -ru source/wrapper.c source-new/wrapper.c
---- source/wrapper.c	2017-06-04 19:08:11.000000000 -0600
-+++ source-new/wrapper.c	2018-12-02 16:07:24.792757146 -0700
-@@ -227,6 +227,7 @@
- 	}
- }
- 
-+#if 0
- static int handle_nonblock(int fd, short poll_events, int err)
- {
- 	struct pollfd pfd;
-@@ -244,6 +245,7 @@
- 	poll(&pfd, 1, -1);
- 	return 1;
- }
-+#endif
- 
- /*
-  * xread() is the same a read(), but it automatically restarts read()
-@@ -260,8 +262,6 @@
- 		if (nr < 0) {
- 			if (errno == EINTR)
- 				continue;
--			if (handle_nonblock(fd, POLLIN, errno))
--				continue;
- 		}
- 		return nr;
- 	}
-@@ -282,8 +282,6 @@
- 		if (nr < 0) {
- 			if (errno == EINTR)
- 				continue;
--			if (handle_nonblock(fd, POLLOUT, errno))
--				continue;
- 		}
- 
- 		return nr;
-@@ -653,7 +651,7 @@
- 
- void sleep_millisec(int millisec)
- {
--	poll(NULL, 0, millisec);
-+	//poll(NULL, 0, millisec);
- }
- 
- int xgethostname(char *buf, size_t len)

 	nport = strtoul(port, &ep, 10);
 	if ( ep == port || *ep ) {
 		/* Not numeric */
-		struct servent *se = getservbyname(port,"tcp");
-		if ( !se )
-			die("Unknown port %s", port);
-		nport = se->s_port;
+		die("Unknown port %s", port);
 	}
 
 	if (flags & CONNECT_VERBOSE)
@@ -507,7 +504,7 @@
 	int sockfd = git_tcp_connect_sock(host, flags);
 
 	fd[0] = sockfd;
-	fd[1] = dup(sockfd);
+	fd[1] = sockfd;
 }
 
 
diff -ru source/credential-cache--daemon.c source-new/credential-cache--daemon.c
--- source/credential-cache--daemon.c	2017-06-04 19:08:11.000000000 -0600
+++ source-new/credential-cache--daemon.c	2018-12-02 16:07:24.788757117 -0700
@@ -156,6 +156,7 @@
 	strbuf_release(&action);
 }
 
+#if 0
 static int serve_cache_loop(int fd)
 {
 	struct pollfd pfd;
@@ -256,6 +257,7 @@
 
 	free(path_copy);
 }
+#endif
 
 int cmd_main(int argc, const char **argv)
 {
@@ -274,6 +276,7 @@
 
 	git_config_get_bool("credentialcache.ignoresighup", &ignore_sighup);
 
+#if 0
 	argc = parse_options(argc, argv, NULL, options, usage, 0);
 	socket_path = argv[0];
 
@@ -291,6 +294,9 @@
 
 	serve_cache(socket_path, debug);
 	delete_tempfile(&socket_file);
+#endif
+
+	printf("git-credential-cache--daemon not working on Redox\n");
 
 	return 0;
 }
diff -ru source/daemon.c source-new/daemon.c
--- source/daemon.c	2017-06-04 19:08:11.000000000 -0600
+++ source-new/daemon.c	2018-12-02 16:07:24.788757117 -0700
@@ -71,6 +71,7 @@
 	return hi->ip_address.buf;
 }
 
+#if 0
 static void logreport(int priority, const char *err, va_list params)
 {
 	if (log_syslog) {
@@ -89,13 +90,14 @@
 		fflush(stderr);
 	}
 }
+#endif
 
 __attribute__((format (printf, 1, 2)))
 static void logerror(const char *err, ...)
 {
 	va_list params;
 	va_start(params, err);
-	logreport(LOG_ERR, err, params);
+	//logreport(LOG_ERR, err, params);
 	va_end(params);
 }
 
@@ -106,13 +108,13 @@
 	if (!verbose)
 		return;
 	va_start(params, err);
-	logreport(LOG_INFO, err, params);
+	//logreport(LOG_INFO, err, params);
 	va_end(params);
 }
 
 static void NORETURN daemon_die(const char *err, va_list params)
 {
-	logreport(LOG_ERR, err, params);
+	//logreport(LOG_ERR, err, params);
 	exit(1);
 }
 
@@ -888,8 +890,7 @@
 
 	if (!reuseaddr)
 		return 0;
-	return setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,
-			  &on, sizeof(on));
+	return 0;
 }
 
 struct socketlist {
@@ -901,7 +902,7 @@
 static const char *ip2str(int family, struct sockaddr *sin, socklen_t len)
 {
 #ifdef NO_IPV6
-	static char ip[INET_ADDRSTRLEN];
+	static char ip[1];
 #else
 	static char ip[INET6_ADDRSTRLEN];
 #endif
@@ -980,7 +981,7 @@
 			close(sockfd);
 			continue;	/* not fatal */
 		}
-		if (listen(sockfd, 5) < 0) {
+		if (1) {
 			logerror("Could not listen to %s: %s",
 				 ip2str(ai->ai_family, ai->ai_addr, ai->ai_addrlen),
 				 strerror(errno));
@@ -1042,7 +1043,7 @@
 		return 0;
 	}
 
-	if (listen(sockfd, 5) < 0) {
+	if (0) {
 		logerror("Could not listen to %s: %s",
 			 ip2str(AF_INET, (struct sockaddr *)&sin, sizeof(sin)),
 			 strerror(errno));
@@ -1080,6 +1081,8 @@
 
 static int service_loop(struct socketlist *socklist)
 {
+	die_errno("No daemon support");
+#if 0
 	struct pollfd *pfd;
 	int i;
 
@@ -1116,7 +1119,7 @@
 #endif
 				} ss;
 				socklen_t sslen = sizeof(ss);
-				int incoming = accept(pfd[i].fd, &ss.sa, &sslen);
+				int incoming = -1;
 				if (incoming < 0) {
 					switch (errno) {
 					case EAGAIN:
@@ -1131,6 +1134,7 @@
 			}
 		}
 	}
+#endif
 }
 
 #ifdef NO_POSIX_GOODIES
@@ -1158,7 +1162,7 @@
 static void drop_privileges(struct credentials *cred)
 {
 	if (cred && (initgroups(cred->pass->pw_name, cred->gid) ||
-	    setgid (cred->gid) || setuid(cred->pass->pw_uid)))
+	    1))
 		die("cannot drop privileges");
 }
 
@@ -1174,11 +1178,7 @@
 	if (!group_name)
 		c.gid = c.pass->pw_gid;
 	else {

 }
 
 static void finish_early_output(struct rev_info *rev)
diff -ruw source/common-main.c source-new/common-main.c
--- source/common-main.c	2017-06-04 19:08:11.000000000 -0600
+++ source-new/common-main.c	2018-12-26 18:40:38.447229228 -0700
@@ -15,12 +15,14 @@
  */
 static void restore_sigpipe_to_default(void)
 {
+#if !defined(__redox__)
 	sigset_t unblock;
 
 	sigemptyset(&unblock);
 	sigaddset(&unblock, SIGPIPE);
 	sigprocmask(SIG_UNBLOCK, &unblock, NULL);
 	signal(SIGPIPE, SIG_DFL);
+#endif
 }
 
 int main(int argc, const char **argv)
diff -ruw source/compat/hstrerror.c source-new/compat/hstrerror.c
--- source/compat/hstrerror.c	2017-06-04 19:08:11.000000000 -0600
+++ source-new/compat/hstrerror.c	2018-12-26 18:37:12.495372666 -0700
@@ -5,6 +5,7 @@
 const char *githstrerror(int err)
 {
 	static char buffer[48];
+#if !defined(__redox__)
 	switch (err)
 	{
 	case HOST_NOT_FOUND:
@@ -16,6 +17,7 @@
 	case TRY_AGAIN:
 		return "Non-authoritative \"host not found\", or SERVERFAIL";
 	}
+#endif
 	snprintf(buffer, sizeof(buffer), "Name resolution error %d", err);
 	return buffer;
 }
diff -ruw source/compat/terminal.c source-new/compat/terminal.c
--- source/compat/terminal.c	2017-06-04 19:08:11.000000000 -0600
+++ source-new/compat/terminal.c	2018-12-26 18:39:47.177777683 -0700
@@ -137,6 +137,18 @@
 	return buf.buf;
 }
 
+#elif defined(__redox__)
+
+ssize_t __getline(char **lptr, size_t *n, FILE *fp);
+
+char *git_terminal_prompt(const char *prompt, int echo)
+{
+	char *line = NULL;
+	size_t n = 0;
+	__getline(&line, &n, stdin);
+	return line; // XXX leak
+}
+
 #else
 
 char *git_terminal_prompt(const char *prompt, int echo)
diff -ruw source/connect.c source-new/connect.c
--- source/connect.c	2017-06-04 19:08:11.000000000 -0600
+++ source-new/connect.c	2018-12-26 18:56:40.601235949 -0700
@@ -450,7 +450,7 @@
 
 	he = gethostbyname(host);
 	if (!he)
