[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