Test both compressed and uncompressed system files with very long
[pspp] / src / data / make-file.c
1 /* PSPP - a program for statistical analysis.
2    Copyright (C) 2004 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8
9    This program 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
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>. */
16
17 #include <config.h>
18 #include <assert.h>
19 #include <stdlib.h>
20 #include <string.h>
21 #include <errno.h>
22 #include <stdio.h>
23 #include "file-name.h"
24 #include "make-file.h"
25 #include <libpspp/message.h>
26 #include <libpspp/alloc.h>
27
28 #include "gettext.h"
29 #define _(msgid) gettext (msgid)
30
31 /* Non ansi compilers may set this */
32 #ifndef P_tmpdir
33 #define P_tmpdir "/tmp"
34 #endif
35
36 /* Creates a temporary file and stores its name in *FILE_NAME and
37    a file descriptor for it in *FD.  Returns success.  Caller is
38    responsible for freeing *FILE_NAME. */
39 int
40 make_temp_file (int *fd, char **file_name)
41 {
42   const char *parent_dir;
43
44   assert (file_name != NULL);
45   assert (fd != NULL);
46
47   if (getenv ("TMPDIR") != NULL)
48     parent_dir = getenv ("TMPDIR");
49   else
50     parent_dir = P_tmpdir;
51
52   *file_name = xmalloc (strlen (parent_dir) + 32);
53   sprintf (*file_name, "%s/psppXXXXXX", parent_dir);
54   *fd = mkstemp (*file_name);
55   if (*fd < 0)
56     {
57       msg (ME, _("%s: Creating temporary file: %s."),
58            *file_name, strerror (errno));
59       free (*file_name);
60       *file_name = NULL;
61       return 0;
62     }
63   return 1;
64 }
65
66
67 /* Creates a temporary file and stores its name in *FILE_NAME and
68    a file stream for it in *FP.  Returns success.  Caller is
69    responsible for freeing *FILE_NAME and for closing *FP */
70 int
71 make_unique_file_stream (FILE **fp, char **file_name)
72 {
73   static int serial = 0;
74   const char *parent_dir;
75
76
77   /* FIXME:
78      Need to check for pre-existing file name.
79      Need also to pass in the directory instead of using /tmp
80   */
81
82   assert (file_name != NULL);
83   assert (fp != NULL);
84
85   if (getenv ("TMPDIR") != NULL)
86     parent_dir = getenv ("TMPDIR");
87   else
88     parent_dir = P_tmpdir;
89
90   *file_name = xmalloc (strlen (parent_dir) + 32);
91
92
93   sprintf (*file_name, "%s/pspp%d.png", parent_dir, serial++);
94
95   *fp = fopen(*file_name, "w");
96
97   if (! *fp )
98     {
99       msg (ME, _("%s: Creating file: %s."), *file_name, strerror (errno));
100       free (*file_name);
101       *file_name = NULL;
102       return 0;
103     }
104
105   return 1;
106 }
107
108
109
110