From 4d8d477018ac51a9536103e34368dc11a37e2ed4 Mon Sep 17 00:00:00 2001 From: Guy Harris Date: Sun, 12 Feb 2006 21:52:18 +0000 Subject: Move create_tempfile() to tempfile.c out of util.c. This means dumpcap no longer needs util.c, so it no longer includes routines that use host_ip_af(), so it no longer needs to define its own host_ip_af(). That also means dumpcap.c no longer needs to include . svn path=/trunk/; revision=17278 --- tempfile.c | 161 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 tempfile.c (limited to 'tempfile.c') diff --git a/tempfile.c b/tempfile.c new file mode 100644 index 0000000000..d82a3d3924 --- /dev/null +++ b/tempfile.c @@ -0,0 +1,161 @@ +/* tempfile.c + * Routines to create temporary files + * + * $Id$ + * + * Ethereal - Network traffic analyzer + * By Gerald Combs + * Copyright 1998 Gerald Combs + * + * 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 + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include +#include +#include +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "file_util.h" + +#if GLIB_MAJOR_VERSION > 2 || (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION >= 6) +#include /* available since GLib 2.6 only! */ + +/* GLib2.6 or above, using new wrapper functions */ +#define eth_mkstemp g_mkstemp +#else +#define eth_mkstemp mkstemp +#endif + +/* + * This has to come after the include of , as the include of + * might cause to be included, and if we've + * already included as a result of including , + * we get a bunch of redefinitions. + */ +#ifdef HAVE_WINDOWS_H +#include +#endif + +#include "tempfile.h" + +static const char * +setup_tmpdir(const char *dir) +{ + size_t len = strlen(dir); + char *newdir; + + /* Append path separator if necessary */ + if (len != 0 && dir[len - 1] == G_DIR_SEPARATOR) { + return dir; + } + else { + newdir = g_malloc(len + 2); + strcpy(newdir, dir); + strcat(newdir, G_DIR_SEPARATOR_S); + return newdir; + } +} + +static int +try_tempfile(char *namebuf, int namebuflen, const char *dir, const char *pfx) +{ + static const char suffix[] = "XXXXXXXXXX"; + int namelen = strlen(dir) + strlen(pfx) + sizeof suffix; + int old_umask; + int tmp_fd; + + if (namebuflen < namelen) { + /* Stick in a truncated name, so that if this error is + reported with the file name, you at least get + something. */ + g_snprintf(namebuf, namebuflen, "%s%s%s", dir, pfx, suffix); + errno = ENAMETOOLONG; + return -1; + } + strcpy(namebuf, dir); + strcat(namebuf, pfx); + strcat(namebuf, suffix); + + /* The Single UNIX Specification doesn't say that "mkstemp()" + creates the temporary file with mode rw-------, so we + won't assume that all UNIXes will do so; instead, we set + the umask to 0077 to take away all group and other + permissions, attempt to create the file, and then put + the umask back. */ + old_umask = umask(0077); + tmp_fd = eth_mkstemp(namebuf); + umask(old_umask); + return tmp_fd; +} + +static const char *tmpdir = NULL; +#ifdef _WIN32 +static const char *temp = NULL; +#endif +static const char *E_tmpdir; + +#ifndef P_tmpdir +#define P_tmpdir "/var/tmp" +#endif + +int +create_tempfile(char *namebuf, int namebuflen, const char *pfx) +{ + char *dir; + int fd; + static gboolean initialized; + + if (!initialized) { + if ((dir = getenv("TMPDIR")) != NULL) + tmpdir = setup_tmpdir(dir); +#ifdef _WIN32 + if ((dir = getenv("TEMP")) != NULL) + temp = setup_tmpdir(dir); +#endif + + E_tmpdir = setup_tmpdir(P_tmpdir); + initialized = TRUE; + } + + if (tmpdir != NULL) { + fd = try_tempfile(namebuf, namebuflen, tmpdir, pfx); + if (fd != -1) + return fd; + } + +#ifdef _WIN32 + if (temp != NULL) { + fd = try_tempfile(namebuf, namebuflen, temp, pfx); + if (fd != -1) + return fd; + } +#endif + + fd = try_tempfile(namebuf, namebuflen, E_tmpdir, pfx); + if (fd != -1) + return fd; + + return try_tempfile(namebuf, namebuflen, G_DIR_SEPARATOR_S "tmp", pfx); +} -- cgit v1.2.3