From 1b3e13870e80a69d1275bc8e6984022a8a0b10ea Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Mon, 24 Jul 2006 16:43:01 +0000 Subject: [PATCH] New module 'tmpdir'. --- ChangeLog | 5 ++ MODULES.html.sh | 1 + lib/ChangeLog | 5 ++ lib/tmpdir.c | 157 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/tmpdir.h | 27 ++++++++++ m4/ChangeLog | 4 ++ m4/tmpdir.m4 | 12 +++++ modules/tmpdir | 26 ++++++++++ 8 files changed, 237 insertions(+) create mode 100644 lib/tmpdir.c create mode 100644 lib/tmpdir.h create mode 100644 m4/tmpdir.m4 create mode 100644 modules/tmpdir diff --git a/ChangeLog b/ChangeLog index 9cd2ddabd..d5c732219 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2006-07-24 Bruno Haible + + * modules/tmpdir: New file. + * MODULES.html.sh (File system functions): Add it. + 2006-07-23 Eric Blake * modules/stdio-safer (Files): Add tmpfile-safer.c. diff --git a/MODULES.html.sh b/MODULES.html.sh index 56f26c4cb..9708d3272 100755 --- a/MODULES.html.sh +++ b/MODULES.html.sh @@ -1901,6 +1901,7 @@ func_all_modules () func_module save-cwd func_module savedir func_module stat-time + func_module tmpdir func_module unlinkdir func_module utimecmp func_module utimens diff --git a/lib/ChangeLog b/lib/ChangeLog index 8d69684b0..8d74da1d5 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,8 @@ +2006-07-24 Bruno Haible + + * tmpdir.h: New file, from GNU gettext. + * tmpdir.c: New file, from GNU gettext. + 2006-07-23 Bruno Haible * gl_anylinked_list2.h (ASYNCSAFE): New macro. diff --git a/lib/tmpdir.c b/lib/tmpdir.c new file mode 100644 index 000000000..89818dc15 --- /dev/null +++ b/lib/tmpdir.c @@ -0,0 +1,157 @@ +/* Copyright (C) 1999, 2001-2002, 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 51 Franklin Street, + Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* Extracted from sysdeps/posix/tempname.c. */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +/* Specification. */ +#include "tmpdir.h" + +#include +#include +#include + +#include +#ifndef __set_errno +# define __set_errno(Val) errno = (Val) +#endif + +#include +#ifndef P_tmpdir +# define P_tmpdir "/tmp" +#endif + +#include +#if !defined S_ISDIR && defined S_IFDIR +# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) +#endif +#if !S_IRUSR && S_IREAD +# define S_IRUSR S_IREAD +#endif +#if !S_IRUSR +# define S_IRUSR 00400 +#endif +#if !S_IWUSR && S_IWRITE +# define S_IWUSR S_IWRITE +#endif +#if !S_IWUSR +# define S_IWUSR 00200 +#endif +#if !S_IXUSR && S_IEXEC +# define S_IXUSR S_IEXEC +#endif +#if !S_IXUSR +# define S_IXUSR 00100 +#endif + +#if _LIBC +# define struct_stat64 struct stat64 +#else +# define struct_stat64 struct stat +# define __xstat64(version, path, buf) stat (path, buf) +#endif + +#if ! (HAVE___SECURE_GETENV || _LIBC) +# define __secure_getenv getenv +#endif + +/* Pathname support. + ISSLASH(C) tests whether C is a directory separator character. + */ +#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__ + /* Win32, Cygwin, OS/2, DOS */ +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +#else + /* Unix */ +# define ISSLASH(C) ((C) == '/') +#endif + + +/* Return nonzero if DIR is an existent directory. */ +static bool +direxists (const char *dir) +{ + struct_stat64 buf; + return __xstat64 (_STAT_VER, dir, &buf) == 0 && S_ISDIR (buf.st_mode); +} + +/* Path search algorithm, for tmpnam, tmpfile, etc. If DIR is + non-null and exists, uses it; otherwise uses the first of $TMPDIR, + P_tmpdir, /tmp that exists. Copies into TMPL a template suitable + for use with mk[s]temp. Will fail (-1) if DIR is non-null and + doesn't exist, none of the searched dirs exists, or there's not + enough space in TMPL. */ +int +path_search (char *tmpl, size_t tmpl_len, const char *dir, const char *pfx, + bool try_tmpdir) +{ + const char *d; + size_t dlen, plen; + + if (!pfx || !pfx[0]) + { + pfx = "file"; + plen = 4; + } + else + { + plen = strlen (pfx); + if (plen > 5) + plen = 5; + } + + if (try_tmpdir) + { + d = __secure_getenv ("TMPDIR"); + if (d != NULL && direxists (d)) + dir = d; + else if (dir != NULL && direxists (dir)) + /* nothing */ ; + else + dir = NULL; + } + if (dir == NULL) + { + if (direxists (P_tmpdir)) + dir = P_tmpdir; + else if (strcmp (P_tmpdir, "/tmp") != 0 && direxists ("/tmp")) + dir = "/tmp"; + else + { + __set_errno (ENOENT); + return -1; + } + } + + dlen = strlen (dir); + while (dlen >= 1 && ISSLASH (dir[dlen - 1])) + dlen--; /* remove trailing slashes */ + + /* check we have room for "${dir}/${pfx}XXXXXX\0" */ + if (tmpl_len < dlen + 1 + plen + 6 + 1) + { + __set_errno (EINVAL); + return -1; + } + + sprintf (tmpl, "%.*s/%.*sXXXXXX", (int) dlen, dir, (int) plen, pfx); + return 0; +} diff --git a/lib/tmpdir.h b/lib/tmpdir.h new file mode 100644 index 000000000..454e5cc18 --- /dev/null +++ b/lib/tmpdir.h @@ -0,0 +1,27 @@ +/* Determine a temporary directory. + Copyright (C) 2001-2002 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 2, 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, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include +#include + +/* Path search algorithm, for tmpnam, tmpfile, etc. If DIR is + non-null and exists, uses it; otherwise uses the first of $TMPDIR, + P_tmpdir, /tmp that exists. Copies into TMPL a template suitable + for use with mk[s]temp. Will fail (-1) if DIR is non-null and + doesn't exist, none of the searched dirs exists, or there's not + enough space in TMPL. */ +extern int path_search (char *tmpl, size_t tmpl_len, const char *dir, const char *pfx, bool try_tmpdir); diff --git a/m4/ChangeLog b/m4/ChangeLog index 098a77c2f..d60b6bcb9 100644 --- a/m4/ChangeLog +++ b/m4/ChangeLog @@ -1,3 +1,7 @@ +2006-07-24 Bruno Haible + + * tmpdir.m4: New file, from GNU gettext. + 2006-07-23 Eric Blake * stdio-safer.m4 (gl_STDIO_SAFER): Add tmpfile-safer.c. diff --git a/m4/tmpdir.m4 b/m4/tmpdir.m4 new file mode 100644 index 000000000..b06402e3e --- /dev/null +++ b/m4/tmpdir.m4 @@ -0,0 +1,12 @@ +# tmpdir.m4 serial 2 (gettext-0.15) +dnl Copyright (C) 2001-2002, 2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +# Prerequisites for lib/tmpdir.c + +AC_DEFUN([gt_TMPDIR], +[ + AC_CHECK_FUNCS(__secure_getenv) +]) diff --git a/modules/tmpdir b/modules/tmpdir new file mode 100644 index 000000000..bc228d14a --- /dev/null +++ b/modules/tmpdir @@ -0,0 +1,26 @@ +Description: +Determine a temporary directory. + +Files: +lib/tmpdir.h +lib/tmpdir.c +m4/tmpdir.m4 + +Depends-on: +stdbool + +configure.ac: +gt_TMPDIR + +Makefile.am: +lib_SOURCES += tmpdir.h tmpdir.c + +Include: +"tmpdir.h" + +License: +GPL + +Maintainer: +Bruno Haible + -- 2.11.0