On 01/08/2013 01:03 PM, Serge Hallyn wrote: > 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>
Fixed the Makefile.am and pushed with your ack. Thanks. >> --- >> 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 -- Stéphane Graber Ubuntu developer http://www.ubuntu.com
signature.asc
Description: OpenPGP digital signature
------------------------------------------------------------------------------ Master Java SE, Java EE, Eclipse, Spring, Hibernate, JavaScript, jQuery and much more. Keep your Java skills current with LearnJavaNow - 200+ hours of step-by-step video tutorials by Java experts. SALE $49.99 this month only -- learn more at: http://p.sf.net/sfu/learnmore_122612
_______________________________________________ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel