1/* Copyright (C) 1991,1993,1996-1999,2000 Free Software Foundation, Inc.
2   This file is part of the GNU C Library.
3
4   The GNU C Library is free software; you can redistribute it and/or
5   modify it under the terms of the GNU Lesser General Public
6   License as published by the Free Software Foundation; either
7   version 2.1 of the License, or (at your option) any later version.
8
9   The GNU C Library is distributed in the hope that it will be useful,
10   but WITHOUT ANY WARRANTY; without even the implied warranty of
11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12   Lesser General Public License for more details.
13
14   You should have received a copy of the GNU Lesser General Public
15   License along with the GNU C Library; if not, write to the Free
16   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17   02111-1307 USA.
18*/
19
20
21#include <stdio_private.h>
22#include <string.h>
23
24
25/** Generate a unique filename in P_tmpdir.
26 *	This function is *not* thread safe!
27 */
28
29char *
30tmpnam (char *s)
31{
32	static char tmpnam_buffer[L_tmpnam];
33
34	/* By using two buffers we manage to be thread safe in the case where S != NULL.  */
35	char tmpbufmem[L_tmpnam];
36	char *tmpbuf = s ?: tmpbufmem;
37
38	/* In the following call we use the buffer pointed to by S if
39	 * non-NULL although we don't know the size.  But we limit the size
40	 * to L_tmpnam characters in any case.
41	 */
42	if (__builtin_expect(__path_search(tmpbuf, L_tmpnam, NULL, NULL, 0), 0))
43		return NULL;
44
45	if (__builtin_expect(__gen_tempname(tmpbuf, __GT_NOCREATE), 0))
46		return NULL;
47
48	if (s == NULL)
49		return (char *)memcpy(tmpnam_buffer, tmpbuf, L_tmpnam);
50
51	return s;
52}
53
54//link_warning (tmpnam, "the use of `tmpnam' is dangerous, better use `mkstemp'")
55