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 <stgra...@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 ------------------------------------------------------------------------------ Master SQL Server Development, Administration, T-SQL, SSAS, SSIS, SSRS and more. Get SQL Server skills now (including 2012) with LearnDevNow - 200+ hours of step-by-step video tutorials by Microsoft MVPs and experts. SALE $99.99 this month only - learn more at: http://p.sf.net/sfu/learnmore_122512 _______________________________________________ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel