xalloc.h-instead-of-alloc.h.patch from patch #6230.
[pspp-builds.git] / 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
27 #include "xalloc.h"
28
29 #include "gettext.h"
30 #define _(msgid) gettext (msgid)
31
32 /* Non ansi compilers may set this */
33 #ifndef P_tmpdir
34 #define P_tmpdir "/tmp"
35 #endif
36
37 /* Creates a temporary file and stores its name in *FILE_NAME and
38    a file descriptor for it in *FD.  Returns success.  Caller is
39    responsible for freeing *FILE_NAME. */
40 int
41 make_temp_file (int *fd, char **file_name)
42 {
43   const char *parent_dir;
44
45   assert (file_name != NULL);
46   assert (fd != NULL);
47
48   if (getenv ("TMPDIR") != NULL)
49     parent_dir = getenv ("TMPDIR");
50   else
51     parent_dir = P_tmpdir;
52
53   *file_name = xmalloc (strlen (parent_dir) + 32);
54   sprintf (*file_name, "%s/psppXXXXXX", parent_dir);
55   *fd = mkstemp (*file_name);
56   if (*fd < 0)
57     {
58       msg (ME, _("%s: Creating temporary file: %s."),
59            *file_name, strerror (errno));
60       free (*file_name);
61       *file_name = NULL;
62       return 0;
63     }
64   return 1;
65 }
66
67
68 /* Creates a temporary file and stores its name in *FILE_NAME and
69    a file stream for it in *FP.  Returns success.  Caller is
70    responsible for freeing *FILE_NAME and for closing *FP */
71 int
72 make_unique_file_stream (FILE **fp, char **file_name)
73 {
74   static int serial = 0;
75   const char *parent_dir;
76
77
78   /* FIXME:
79      Need to check for pre-existing file name.
80      Need also to pass in the directory instead of using /tmp
81   */
82
83   assert (file_name != NULL);
84   assert (fp != NULL);
85
86   if (getenv ("TMPDIR") != NULL)
87     parent_dir = getenv ("TMPDIR");
88   else
89     parent_dir = P_tmpdir;
90
91   *file_name = xmalloc (strlen (parent_dir) + 32);
92
93
94   sprintf (*file_name, "%s/pspp%d.png", parent_dir, serial++);
95
96   *fp = fopen(*file_name, "w");
97
98   if (! *fp )
99     {
100       msg (ME, _("%s: Creating file: %s."), *file_name, strerror (errno));
101       free (*file_name);
102       *file_name = NULL;
103       return 0;
104     }
105
106   return 1;
107 }
108
109
110
111