[lxc-devel] [PATCH 04/24] Support both getline and fgetln

Stéphane Graber stgraber at ubuntu.com
Tue Jan 8 17:02:54 UTC 2013


Some libc implementations don't have the getline function but instead
have an equivalent fgetln function.

Add code to detect both and use whatever is available.

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 configure.ac          |  3 +++
 src/include/getline.c | 31 +++++++++++++++++++++++++++++++
 src/include/getline.h |  6 ++++++
 src/lxc/Makefile.am   | 10 ++++++++++
 src/lxc/attach.c      |  8 ++++++++
 src/lxc/parse.c       |  8 ++++++++
 6 files changed, 66 insertions(+)
 create mode 100644 src/include/getline.c
 create mode 100644 src/include/getline.h

diff --git a/configure.ac b/configure.ac
index 564df0e..50e64ff 100644
--- a/configure.ac
+++ b/configure.ac
@@ -216,6 +216,9 @@ AC_CHECK_DECLS([PR_CAPBSET_DROP], [], [], [#include <sys/prctl.h>])
 # Check for optional headers
 AC_CHECK_HEADERS([sys/signalfd.h])
 
+# Check for some functions
+AC_CHECK_FUNCS([getline fgetln])
+
 # Check for some standard binaries
 AC_PROG_GCC_TRADITIONAL
 AC_PROG_SED
diff --git a/src/include/getline.c b/src/include/getline.c
new file mode 100644
index 0000000..d4117cb
--- /dev/null
+++ b/src/include/getline.c
@@ -0,0 +1,31 @@
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/*
+ * Emulate glibc getline() via BSD fgetln().
+ * Note that outsize is not changed unless memory is allocated.
+ */
+ssize_t
+getline(char **outbuf, size_t *outsize, FILE *fp)
+{
+    size_t len;
+    char *buf;
+    buf = fgetln(fp, &len);
+
+    if (buf == NULL)
+        return (-1);
+
+    /* Assumes realloc() accepts NULL for ptr (C99) */
+    if (*outbuf == NULL || *outsize < len + 1) {
+        void *tmp = realloc(*outbuf, len + 1);
+        if (tmp == NULL)
+            return (-1);
+        *outbuf = tmp;
+        *outsize = len + 1;
+    }
+    memcpy(*outbuf, buf, len);
+    (*outbuf)[len] = '\0';
+    return (len);
+}
diff --git a/src/include/getline.h b/src/include/getline.h
new file mode 100644
index 0000000..b030d7a
--- /dev/null
+++ b/src/include/getline.h
@@ -0,0 +1,6 @@
+#ifndef _getline_h
+#define _getline_h
+
+extern ssize_t getline(char **outbuf, size_t *outsize, FILE *fp);
+
+#endif
diff --git a/src/lxc/Makefile.am b/src/lxc/Makefile.am
index bf675f9..23b6772 100644
--- a/src/lxc/Makefile.am
+++ b/src/lxc/Makefile.am
@@ -17,6 +17,11 @@ pkginclude_HEADERS = \
 		lxccontainer.h \
 		lxclock.h
 
+if IS_BIONIC
+pkginclude_HEADERS += \
+	../include/getline.h
+endif
+
 sodir=$(libdir)
 # use PROGRAMS to avoid complains from automake
 so_PROGRAMS = liblxc.so
@@ -61,6 +66,11 @@ liblxc_so_SOURCES = \
 	lxclock.h lxclock.c \
 	lxccontainer.c lxccontainer.h
 
+if IS_BIONIC
+liblxc_so_SOURCES += \
+	../include/getline.c ../include/getline.h
+endif
+
 AM_CFLAGS=-I$(top_srcdir)/src \
 	-DLXCROOTFSMOUNT=\"$(LXCROOTFSMOUNT)\" \
 	-DLXCPATH=\"$(LXCPATH)\" \
diff --git a/src/lxc/attach.c b/src/lxc/attach.c
index ec0e083..9b7efbc 100644
--- a/src/lxc/attach.c
+++ b/src/lxc/attach.c
@@ -31,6 +31,7 @@
 #include <sys/param.h>
 #include <sys/prctl.h>
 #include <sys/mount.h>
+#include <sys/syscall.h>
 #include <linux/unistd.h>
 
 #if !HAVE_DECL_PR_CAPBSET_DROP
@@ -56,6 +57,13 @@ int setns(int fd, int nstype)
 #endif
 }
 
+/* Define getline() if missing from the C library */
+#ifndef HAVE_GETLINE
+#ifdef HAVE_FGETLN
+#include <../include/getline.h>
+#endif
+#endif
+
 struct lxc_proc_context_info *lxc_proc_get_context_info(pid_t pid)
 {
 	struct lxc_proc_context_info *info = calloc(1, sizeof(*info));
diff --git a/src/lxc/parse.c b/src/lxc/parse.c
index 10510c9..b074b04 100644
--- a/src/lxc/parse.c
+++ b/src/lxc/parse.c
@@ -29,8 +29,16 @@
 #include <dirent.h>
 
 #include "parse.h"
+#include "config.h"
 #include <lxc/log.h>
 
+/* Define getline() if missing from the C library */
+#ifndef HAVE_GETLINE
+#ifdef HAVE_FGETLN
+#include <../include/getline.h>
+#endif
+#endif
+
 lxc_log_define(lxc_parse, lxc);
 
 static int dir_filter(const struct dirent *dirent)
-- 
1.8.0





More information about the lxc-devel mailing list