Quoting Stéphane Graber (stgra...@ubuntu.com): > 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>
My only concern here is that you switch on IS_BIONIC in the makefile, but on HAVE_GETLINE in the source. If/when someone uses a libc without HAVE_GETLINE on non-bionic, this won't work quite right. It's something we can straighten out with a later patch, though. Acked-by: Serge E. Hallyn <serge.hal...@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 ------------------------------------------------------------------------------ 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