[lxc-devel] [PATCH 04/24] Support both getline and fgetln
Stéphane Graber
stgraber at ubuntu.com
Wed Jan 9 15:29:20 UTC 2013
On 01/08/2013 01:03 PM, Serge Hallyn wrote:
> Quoting Stéphane Graber (stgraber at 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 <stgraber at 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.hallyn at 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 at lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/lxc-devel
--
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 901 bytes
Desc: OpenPGP digital signature
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20130109/ea1fe339/attachment.pgp>
More information about the lxc-devel
mailing list