conformtest: Allow time.h inclusion from semaphore.h for XOPEN2K.
[glibc.git] / support / temp_file.c
blob5950aec06b628080dd7373775db0b3cd9707448e
1 /* Temporary file handling for tests.
2 Copyright (C) 1998-2017 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <http://www.gnu.org/licenses/>. */
19 /* This is required to get an mkstemp which can create large files on
20 some 32-bit platforms. */
21 #define _FILE_OFFSET_BITS 64
23 #include <support/temp_file.h>
24 #include <support/temp_file-internal.h>
25 #include <support/support.h>
27 #include <paths.h>
28 #include <search.h>
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <string.h>
33 /* List of temporary files. */
34 static struct temp_name_list
36 struct qelem q;
37 char *name;
38 } *temp_name_list;
40 /* Location of the temporary files. Set by the test skeleton via
41 support_set_test_dir. The string is not be freed. */
42 static const char *test_dir = _PATH_TMP;
44 void
45 add_temp_file (const char *name)
47 struct temp_name_list *newp
48 = (struct temp_name_list *) xcalloc (sizeof (*newp), 1);
49 char *newname = strdup (name);
50 if (newname != NULL)
52 newp->name = newname;
53 if (temp_name_list == NULL)
54 temp_name_list = (struct temp_name_list *) &newp->q;
55 else
56 insque (newp, temp_name_list);
58 else
59 free (newp);
62 int
63 create_temp_file (const char *base, char **filename)
65 char *fname;
66 int fd;
68 fname = (char *) xmalloc (strlen (test_dir) + 1 + strlen (base)
69 + sizeof ("XXXXXX"));
70 strcpy (stpcpy (stpcpy (stpcpy (fname, test_dir), "/"), base), "XXXXXX");
72 fd = mkstemp (fname);
73 if (fd == -1)
75 printf ("cannot open temporary file '%s': %m\n", fname);
76 free (fname);
77 return -1;
80 add_temp_file (fname);
81 if (filename != NULL)
82 *filename = fname;
83 else
84 free (fname);
86 return fd;
89 /* Helper functions called by the test skeleton follow. */
91 void
92 support_set_test_dir (const char *path)
94 test_dir = path;
97 void
98 support_delete_temp_files (void)
100 while (temp_name_list != NULL)
102 /* For some tests, the temporary file removal runs multiple
103 times (in the parent processes and the subprocess), so do not
104 report a failed removal attempt. */
105 (void) remove (temp_name_list->name);
106 free (temp_name_list->name);
108 struct temp_name_list *next
109 = (struct temp_name_list *) temp_name_list->q.q_forw;
110 free (temp_name_list);
111 temp_name_list = next;
115 void
116 support_print_temp_files (FILE *f)
118 if (temp_name_list != NULL)
120 struct temp_name_list *n;
121 fprintf (f, "temp_files=(\n");
122 for (n = temp_name_list;
123 n != NULL;
124 n = (struct temp_name_list *) n->q.q_forw)
125 fprintf (f, " '%s'\n", n->name);
126 fprintf (f, ")\n");