File: tempnam.c

package info (click to toggle)
af 2.4.3-3
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 2,968 kB
  • ctags: 3,006
  • sloc: ansic: 31,528; makefile: 389; sh: 71
file content (91 lines) | stat: -rw-r--r-- 2,637 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/* Tempnam.c - Get a temporary file name.
   Copyright (C) 1992, 1996, 1997 Malc Arnold.

   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., 675 Mass Ave, Cambridge, MA 02139, USA.  */


#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>

#ifdef HAVE_STRING_H
#include <string.h>
#else /* ! HAVE_STRING_H */
#include <strings.h>
#endif /* ! HAVE_STRING_H */

/****************************************************************************/
/* RCS info. */

#ifndef lint
static char *RcsId = "$Id: tempnam.c,v 2.1 1997/09/07 00:35:35 malc Exp $";
#endif /* ! lint */

/****************************************************************************/
/*LINTLIBRARY*/
/****************************************************************************/
/* Global function declarations */

extern char *malloc(), *getenv(), *mktemp();
extern int stat(), access();
extern void free();

/****************************************************************************/
/* The template for use with mktemp */

#define TFILETEMPLATE	"%s%c%sXXXXXX"

/****************************************************************************/
char *tempnam(tmp_dir, tmp_prefix)
char *tmp_dir, *tmp_prefix;
{
	/*
	 * Return an allocated string containing a unique file name.
	 * Only a partial implementation - relies on tmp_dir being
	 * correctly defined.
	 */

	char *dir, *tfile;
	struct stat buf;

	/* Use TMPDIR if defined and valid */

	if ((dir = getenv("TMPDIR")) == NULL
	    || stat(dir, &buf) < 0 || (buf.st_mode & S_IFMT) != S_IFDIR
	    || !access(dir, 03)) {
		/* TMPDIR not defined or valid; use the default */

			dir = tmp_dir;
	}

	/* Make the template for mktemp */

	if ((tfile = malloc(strlen(dir) + strlen(tmp_prefix) + 8)) == NULL) {
		return(NULL);
	}
	(void) sprintf(tfile, TFILETEMPLATE, dir, '/', tmp_prefix);

	/* Now call mktemp and check for error */

	if (mktemp(tfile) != tfile) {
		free(tfile);
		tfile = NULL;
	}

	/* Return the file name */

	return(tfile);
}
/****************************************************************************/