better tests
[pspp] / src / data / make-file.h
1 /* PSPP - a program for statistical analysis.
2    Copyright (C) 2004, 2010 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 #ifndef MAKE_FILE_H
18 #define MAKE_FILE_H
19
20 #include <stdbool.h>
21 #include <stdio.h>
22 #include <sys/types.h>
23
24 struct file_handle;
25
26 /* Prepares to atomically replace a (potentially) existing file
27    by a new file., by creating a temporary file with the given
28    PERMISSIONS bits.
29
30    Special files are an exception: they are not atomically
31    replaced but simply opened for writing.
32
33    If successful, stores a stream for it opened according to MODE (which should be
34    "w" or "wb") in *FP.  Returns a ticket that can be used to
35    commit or abort the file replacement.  If neither action has
36    yet been taken, program termination via signal will cause
37    all resources to be released.  The return value must not be
38    explicitly freed.
39
40    The caller is responsible for closing *FP */
41
42 struct replace_file *replace_file_start (const struct file_handle *fh,
43                                          const char *mode, mode_t permissions,
44                                          FILE **fp);
45
46 /* Commits or aborts the replacement of a (potentially) existing
47    file by a new file, using the ticket returned by
48    replace_file_start.  Returns success. */
49 bool replace_file_commit (struct replace_file *);
50 bool replace_file_abort (struct replace_file *);
51
52 #endif /* make-file.h */