From 25148dfa57d7dea44929d522812e964dad345a3e Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Wed, 7 Oct 2009 10:39:29 -0600 Subject: [PATCH] xreadlinkat: new module * modules/xreadlinkat: New module. * lib/xreadlinkat.c (xreadlinkat): New file. * lib/xreadlink.h (xreadlinkat): Declare it. * MODULES.html.sh (File system functions): Mention it. Signed-off-by: Eric Blake --- ChangeLog | 6 ++++++ MODULES.html.sh | 1 + lib/xreadlink.h | 7 ++++++- lib/xreadlinkat.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ modules/xreadlinkat | 25 +++++++++++++++++++++++++ 5 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 lib/xreadlinkat.c create mode 100644 modules/xreadlinkat diff --git a/ChangeLog b/ChangeLog index 0ac3c88e0..7a831c7c4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2009-10-07 Eric Blake + xreadlinkat: new module + * modules/xreadlinkat: New module. + * lib/xreadlinkat.c (xreadlinkat): New file. + * lib/xreadlink.h (xreadlinkat): Declare it. + * MODULES.html.sh (File system functions): Mention it. + areadlinkat: new module * lib/at-func.c (FUNC_FAIL): New define. (AT_FUNC_NAME, VALIDATE_FLAG): Use it rather than raw -1. diff --git a/MODULES.html.sh b/MODULES.html.sh index b418ab621..4f164ef20 100755 --- a/MODULES.html.sh +++ b/MODULES.html.sh @@ -2495,6 +2495,7 @@ func_all_modules () func_module write-any-file func_module xgetcwd func_module xreadlink + func_module xreadlinkat func_end_table element="File system as inode set" diff --git a/lib/xreadlink.h b/lib/xreadlink.h index 3eda90f6f..2a27689f3 100644 --- a/lib/xreadlink.h +++ b/lib/xreadlink.h @@ -1,6 +1,7 @@ /* Reading symbolic links without size limitation. - Copyright (C) 2001, 2003, 2004, 2007 Free Software Foundation, Inc. + Copyright (C) 2001, 2003, 2004, 2007, 2009 Free Software + Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,3 +21,7 @@ #include extern char *xreadlink (char const *filename); + +#if GNULIB_XREADLINKAT +extern char *xreadlinkat (int fd, char const *filename); +#endif diff --git a/lib/xreadlinkat.c b/lib/xreadlinkat.c new file mode 100644 index 000000000..471fc2ca1 --- /dev/null +++ b/lib/xreadlinkat.c @@ -0,0 +1,46 @@ +/* xreadlinkat.c -- readlink wrapper to return the link name in malloc'd storage + + Copyright (C) 2001, 2003-2007, 2009 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering , + and Bruno Haible , + and Eric Blake . */ + +#include + +/* Specification. */ +#include "xreadlink.h" + +#include + +#include "areadlink.h" +#include "xalloc.h" + +/* Call readlinkat to get the symbolic link value of FILENAME relative to FD. + Return a pointer to that NUL-terminated string in malloc'd storage. + If readlinkat fails, return NULL and set errno (although failure to + change directory will issue a diagnostic and exit). + If realloc fails, or if the link value is longer than SIZE_MAX :-), + give a diagnostic and exit. */ + +char * +xreadlinkat (int fd, char const *filename) +{ + char *result = areadlinkat (fd, filename); + if (result == NULL && errno == ENOMEM) + xalloc_die (); + return result; +} diff --git a/modules/xreadlinkat b/modules/xreadlinkat new file mode 100644 index 000000000..81f87de47 --- /dev/null +++ b/modules/xreadlinkat @@ -0,0 +1,25 @@ +Description: +Reading symbolic links without size limitation, relative to fd. + +Files: +lib/xreadlink.h +lib/xreadlinkat.c + +Depends-on: +areadlinkat +xalloc + +configure.ac: +gl_MODULE_INDICATOR([xreadlinkat]) + +Makefile.am: +lib_SOURCES += xreadlinkat.c + +Include: +"xreadlink.h" + +License: +GPL + +Maintainer: +Jim Meyering, Eric Blake -- 2.11.0