[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