[Toybox] getline(), getdelim() and clearenv() compat (was: Re: [PATCH] toybox compiled on OS X 10.6)

Georgi Chorbadzhiyski gf at unixsol.org
Tue Mar 13 03:16:32 PDT 2012


Around 03/13/2012 11:03 AM, Georgi Chorbadzhiyski scribbled:
> Around 03/13/2012 09:59 AM, Georgi Chorbadzhiyski scribbled:
>> On 13.3.2012 г. 07:10, Rob Landley wrote:
>>> 0006 if you could investigate why posix-2008 functions don't work on
>>> macosx that would be nice. It seems like they _should_, I'd like to
>>> understand why they don't before trying to replace them.
>>
>> I'll look into that today.
> 
> Neither getline(), nor getdelim() exist on Android and OS X. I have
> checked several free software projects and they all provide compat
> version of these two functions.

I have implemented getline(), getdelim() /and clearenv()/ and compile
them only when needed. With these compat functions toysh and xargs can
be compiled unchanged on Android and OS X /I have update android and
osx2 branches @github/.

I'm testing for __APPLE__ and __ANDROID__ and it seems to work.

Android will need compat implementation of forkpty() and definitions
of sethostname(), swapoff() and swapon().

-- 
Georgi Chorbadzhiyski
http://georgi.unixsol.org/
-------------- next part --------------
From fe0e19f337f206f657d7198dd08b278887a27cfd Mon Sep 17 00:00:00 2001
From: Georgi Chorbadzhiyski <gf at unixsol.org>
Date: Tue, 13 Mar 2012 11:57:30 +0200
Subject: [PATCH 1/3] Add getdelim() and getline() portability functions.

---
 lib/lib.c |   67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/lib.h |    9 ++++++++
 2 files changed, 76 insertions(+), 0 deletions(-)

diff --git a/lib/lib.c b/lib/lib.c
index a9827dc..400c4f6 100644
--- a/lib/lib.c
+++ b/lib/lib.c
@@ -900,3 +900,70 @@ char *num_to_sig(int sig)
 		if (signames[i].num == sig) return signames[i].name;
 	return NULL;
 }
+
+#if defined(__APPLE__) || defined(__ANDROID__)
+ssize_t getdelim(char **linep, size_t *np, int delim, FILE *stream)
+{
+	int ch;
+	size_t new_len;
+	ssize_t i = 0;
+	char *line, *new_line;
+
+	// Invalid input
+	if (!linep || !np) {
+		errno = EINVAL;
+		return -1;
+	}
+
+	if (*linep == NULL || *np == 0) {
+		*np = 1024;
+		*linep = calloc(1, *np);
+		if (*linep == NULL)
+			return -1;
+	}
+	line = *linep;
+
+	while ((ch = getc(stream)) != EOF) {
+		if (i > *np) {
+			// Need more space
+			new_len  = *np + 1024;
+			new_line = realloc(*linep, new_len);
+			if (!new_line)
+				return -1;
+			*np    = new_len;
+			*linep = new_line;
+		}
+
+		line[i] = ch;
+		if (ch == delim)
+			break;
+		i += 1;
+	}
+
+	if (i > *np) {
+		// Need more space
+		new_len  = i + 2;
+		new_line = realloc(*linep, new_len);
+		if (!new_line)
+			return -1;
+		*np    = new_len;
+		*linep = new_line;
+	}
+	line[i + 1] = '\0';
+
+	return i > 0 ? i : -1;
+}
+
+ssize_t getline(char **linep, size_t *np, FILE *stream) {
+	return getdelim(linep, np, '\n', stream);
+}
+#endif
+
+#if defined(__APPLE__)
+extern char **environ;
+
+int clearenv(void) {
+	*environ = NULL;
+	return 0;
+}
+#endif
diff --git a/lib/lib.h b/lib/lib.h
index ab10eb7..4b1beed 100644
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -131,3 +131,12 @@ void bunzipStream(int src_fd, int dst_fd);
 
 int sig_to_num(char *pidstr);
 char *num_to_sig(int sig);
+
+#if defined(__APPLE__) || defined(__ANDROID__)
+ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);
+ssize_t getline(char **lineptr, size_t *n, FILE *stream);
+#endif
+
+#if defined(__APPLE__)
+int clearenv(void);
+#endif
-- 
1.7.5.1


More information about the Toybox mailing list