Coverage Report

Created: 2023-11-19 07:08

/src/git/tempfile.h
Line
Count
Source (jump to first uncovered line)
1
#ifndef TEMPFILE_H
2
#define TEMPFILE_H
3
4
#include "list.h"
5
#include "strbuf.h"
6
7
/*
8
 * Handle temporary files.
9
 *
10
 * The tempfile API allows temporary files to be created, deleted, and
11
 * atomically renamed. Temporary files that are still active when the
12
 * program ends are cleaned up automatically. Lockfiles (see
13
 * "lockfile.h") are built on top of this API.
14
 *
15
 *
16
 * Calling sequence
17
 * ----------------
18
 *
19
 * The caller:
20
 *
21
 * * Attempts to create a temporary file by calling
22
 *   `create_tempfile()`. The resources used for the temporary file are
23
 *   managed by the tempfile API.
24
 *
25
 * * Writes new content to the file by either:
26
 *
27
 *   * writing to the `tempfile->fd` file descriptor
28
 *
29
 *   * calling `fdopen_tempfile()` to get a `FILE` pointer for the
30
 *     open file and writing to the file using stdio.
31
 *
32
 *   Note that the file descriptor created by create_tempfile()
33
 *   is marked O_CLOEXEC, so the new contents must be written by
34
 *   the current process, not any spawned one.
35
 *
36
 * When finished writing, the caller can:
37
 *
38
 * * Close the file descriptor and remove the temporary file by
39
 *   calling `delete_tempfile()`.
40
 *
41
 * * Close the temporary file and rename it atomically to a specified
42
 *   filename by calling `rename_tempfile()`. This relinquishes
43
 *   control of the file.
44
 *
45
 * * Close the file descriptor without removing or renaming the
46
 *   temporary file by calling `close_tempfile_gently()`, and later call
47
 *   `delete_tempfile()` or `rename_tempfile()`.
48
 *
49
 * After the temporary file is renamed or deleted, the `tempfile`
50
 * object is no longer valid and should not be reused.
51
 *
52
 * If the program exits before `rename_tempfile()` or
53
 * `delete_tempfile()` is called, an `atexit(3)` handler will close
54
 * and remove the temporary file.
55
 *
56
 * If you need to close the file descriptor yourself, do so by calling
57
 * `close_tempfile_gently()`. You should never call `close(2)` or `fclose(3)`
58
 * yourself, otherwise the `struct tempfile` structure would still
59
 * think that the file descriptor needs to be closed, and a later
60
 * cleanup would result in duplicate calls to `close(2)`. Worse yet,
61
 * if you close and then later open another file descriptor for a
62
 * completely different purpose, then the unrelated file descriptor
63
 * might get closed.
64
 *
65
 *
66
 * Error handling
67
 * --------------
68
 *
69
 * `create_tempfile()` returns an allocated tempfile on success or NULL
70
 * on failure. On errors, `errno` describes the reason for failure.
71
 *
72
 * `rename_tempfile()` and `close_tempfile_gently()` return 0 on success.
73
 * On failure they set `errno` appropriately and return -1.
74
 * `delete_tempfile()` and `rename` (but not `close`) do their best to
75
 * delete the temporary file before returning.
76
 */
77
78
struct tempfile {
79
  volatile struct volatile_list_head list;
80
  volatile int fd;
81
  FILE *volatile fp;
82
  volatile pid_t owner;
83
  struct strbuf filename;
84
  char *directory;
85
};
86
87
/*
88
 * Attempt to create a temporary file at the specified `path`. Return
89
 * a tempfile (whose "fd" member can be used for writing to it), or
90
 * NULL on error. It is an error if a file already exists at that path.
91
 * Note that `mode` will be further modified by the umask, and possibly
92
 * `core.sharedRepository`, so it is not guaranteed to have the given
93
 * mode.
94
 */
95
struct tempfile *create_tempfile_mode(const char *path, int mode);
96
97
static inline struct tempfile *create_tempfile(const char *path)
98
0
{
99
0
  return create_tempfile_mode(path, 0666);
100
0
}
Unexecuted instantiation: add-interactive.c:create_tempfile
Unexecuted instantiation: apply.c:create_tempfile
Unexecuted instantiation: bulk-checkin.c:create_tempfile
Unexecuted instantiation: bundle.c:create_tempfile
Unexecuted instantiation: cache-tree.c:create_tempfile
Unexecuted instantiation: commit-graph.c:create_tempfile
Unexecuted instantiation: commit.c:create_tempfile
Unexecuted instantiation: config.c:create_tempfile
Unexecuted instantiation: diff.c:create_tempfile
Unexecuted instantiation: environment.c:create_tempfile
Unexecuted instantiation: fetch-pack.c:create_tempfile
Unexecuted instantiation: gpg-interface.c:create_tempfile
Unexecuted instantiation: lockfile.c:create_tempfile
Unexecuted instantiation: merge-recursive.c:create_tempfile
Unexecuted instantiation: merge.c:create_tempfile
Unexecuted instantiation: midx.c:create_tempfile
Unexecuted instantiation: object-file.c:create_tempfile
Unexecuted instantiation: path.c:create_tempfile
Unexecuted instantiation: range-diff.c:create_tempfile
Unexecuted instantiation: read-cache.c:create_tempfile
Unexecuted instantiation: refs.c:create_tempfile
Unexecuted instantiation: files-backend.c:create_tempfile
Unexecuted instantiation: packed-backend.c:create_tempfile
Unexecuted instantiation: repository.c:create_tempfile
Unexecuted instantiation: rerere.c:create_tempfile
Unexecuted instantiation: reset.c:create_tempfile
Unexecuted instantiation: send-pack.c:create_tempfile
Unexecuted instantiation: sequencer.c:create_tempfile
Unexecuted instantiation: shallow.c:create_tempfile
Unexecuted instantiation: submodule.c:create_tempfile
Unexecuted instantiation: tempfile.c:create_tempfile
Unexecuted instantiation: trailer.c:create_tempfile
Unexecuted instantiation: upload-pack.c:create_tempfile
Unexecuted instantiation: wt-status.c:create_tempfile
Unexecuted instantiation: unix-stream-server.c:create_tempfile
Unexecuted instantiation: add.c:create_tempfile
Unexecuted instantiation: am.c:create_tempfile
Unexecuted instantiation: checkout-index.c:create_tempfile
Unexecuted instantiation: checkout.c:create_tempfile
Unexecuted instantiation: clone.c:create_tempfile
Unexecuted instantiation: credential-cache--daemon.c:create_tempfile
Unexecuted instantiation: credential-store.c:create_tempfile
Unexecuted instantiation: describe.c:create_tempfile
Unexecuted instantiation: difftool.c:create_tempfile
Unexecuted instantiation: fast-import.c:create_tempfile
Unexecuted instantiation: fetch.c:create_tempfile
Unexecuted instantiation: gc.c:create_tempfile
Unexecuted instantiation: mv.c:create_tempfile
Unexecuted instantiation: pack-objects.c:create_tempfile
Unexecuted instantiation: prune.c:create_tempfile
Unexecuted instantiation: pull.c:create_tempfile
Unexecuted instantiation: read-tree.c:create_tempfile
Unexecuted instantiation: rebase.c:create_tempfile
Unexecuted instantiation: receive-pack.c:create_tempfile
Unexecuted instantiation: repack.c:create_tempfile
Unexecuted instantiation: rev-parse.c:create_tempfile
Unexecuted instantiation: rm.c:create_tempfile
Unexecuted instantiation: sparse-checkout.c:create_tempfile
Unexecuted instantiation: stash.c:create_tempfile
Unexecuted instantiation: update-index.c:create_tempfile
Unexecuted instantiation: git.c:create_tempfile
101
102
/*
103
 * Register an existing file as a tempfile, meaning that it will be
104
 * deleted when the program exits. The tempfile is considered closed,
105
 * but it can be worked with like any other closed tempfile (for
106
 * example, it can be opened using reopen_tempfile()).
107
 */
108
struct tempfile *register_tempfile(const char *path);
109
110
111
/*
112
 * mks_tempfile functions
113
 *
114
 * The following functions attempt to create and open temporary files
115
 * with names derived automatically from a template, in the manner of
116
 * mkstemps(), and arrange for them to be deleted if the program ends
117
 * before they are deleted explicitly. There is a whole family of such
118
 * functions, named according to the following pattern:
119
 *
120
 *     x?mks_tempfile_t?s?m?()
121
 *
122
 * The optional letters have the following meanings:
123
 *
124
 *   x - die if the temporary file cannot be created.
125
 *
126
 *   t - create the temporary file under $TMPDIR (as opposed to
127
 *       relative to the current directory). When these variants are
128
 *       used, template should be the pattern for the filename alone,
129
 *       without a path.
130
 *
131
 *   s - template includes a suffix that is suffixlen characters long.
132
 *
133
 *   m - the temporary file should be created with the specified mode
134
 *       (otherwise, the mode is set to 0600).
135
 *
136
 * None of these functions modify template. If the caller wants to
137
 * know the (absolute) path of the file that was created, it can be
138
 * read from tempfile->filename.
139
 *
140
 * On success, the functions return a tempfile whose "fd" member is open
141
 * for writing the temporary file. On errors, they return NULL and set
142
 * errno appropriately (except for the "x" variants, which die() on
143
 * errors).
144
 */
145
146
/* See "mks_tempfile functions" above. */
147
struct tempfile *mks_tempfile_sm(const char *filename_template,
148
         int suffixlen, int mode);
149
150
/* See "mks_tempfile functions" above. */
151
static inline struct tempfile *mks_tempfile_s(const char *filename_template,
152
                int suffixlen)
153
0
{
154
0
  return mks_tempfile_sm(filename_template, suffixlen, 0600);
155
0
}
Unexecuted instantiation: add-interactive.c:mks_tempfile_s
Unexecuted instantiation: apply.c:mks_tempfile_s
Unexecuted instantiation: bulk-checkin.c:mks_tempfile_s
Unexecuted instantiation: bundle.c:mks_tempfile_s
Unexecuted instantiation: cache-tree.c:mks_tempfile_s
Unexecuted instantiation: commit-graph.c:mks_tempfile_s
Unexecuted instantiation: commit.c:mks_tempfile_s
Unexecuted instantiation: config.c:mks_tempfile_s
Unexecuted instantiation: diff.c:mks_tempfile_s
Unexecuted instantiation: environment.c:mks_tempfile_s
Unexecuted instantiation: fetch-pack.c:mks_tempfile_s
Unexecuted instantiation: gpg-interface.c:mks_tempfile_s
Unexecuted instantiation: lockfile.c:mks_tempfile_s
Unexecuted instantiation: merge-recursive.c:mks_tempfile_s
Unexecuted instantiation: merge.c:mks_tempfile_s
Unexecuted instantiation: midx.c:mks_tempfile_s
Unexecuted instantiation: object-file.c:mks_tempfile_s
Unexecuted instantiation: path.c:mks_tempfile_s
Unexecuted instantiation: range-diff.c:mks_tempfile_s
Unexecuted instantiation: read-cache.c:mks_tempfile_s
Unexecuted instantiation: refs.c:mks_tempfile_s
Unexecuted instantiation: files-backend.c:mks_tempfile_s
Unexecuted instantiation: packed-backend.c:mks_tempfile_s
Unexecuted instantiation: repository.c:mks_tempfile_s
Unexecuted instantiation: rerere.c:mks_tempfile_s
Unexecuted instantiation: reset.c:mks_tempfile_s
Unexecuted instantiation: send-pack.c:mks_tempfile_s
Unexecuted instantiation: sequencer.c:mks_tempfile_s
Unexecuted instantiation: shallow.c:mks_tempfile_s
Unexecuted instantiation: submodule.c:mks_tempfile_s
Unexecuted instantiation: tempfile.c:mks_tempfile_s
Unexecuted instantiation: trailer.c:mks_tempfile_s
Unexecuted instantiation: upload-pack.c:mks_tempfile_s
Unexecuted instantiation: wt-status.c:mks_tempfile_s
Unexecuted instantiation: unix-stream-server.c:mks_tempfile_s
Unexecuted instantiation: add.c:mks_tempfile_s
Unexecuted instantiation: am.c:mks_tempfile_s
Unexecuted instantiation: checkout-index.c:mks_tempfile_s
Unexecuted instantiation: checkout.c:mks_tempfile_s
Unexecuted instantiation: clone.c:mks_tempfile_s
Unexecuted instantiation: credential-cache--daemon.c:mks_tempfile_s
Unexecuted instantiation: credential-store.c:mks_tempfile_s
Unexecuted instantiation: describe.c:mks_tempfile_s
Unexecuted instantiation: difftool.c:mks_tempfile_s
Unexecuted instantiation: fast-import.c:mks_tempfile_s
Unexecuted instantiation: fetch.c:mks_tempfile_s
Unexecuted instantiation: gc.c:mks_tempfile_s
Unexecuted instantiation: mv.c:mks_tempfile_s
Unexecuted instantiation: pack-objects.c:mks_tempfile_s
Unexecuted instantiation: prune.c:mks_tempfile_s
Unexecuted instantiation: pull.c:mks_tempfile_s
Unexecuted instantiation: read-tree.c:mks_tempfile_s
Unexecuted instantiation: rebase.c:mks_tempfile_s
Unexecuted instantiation: receive-pack.c:mks_tempfile_s
Unexecuted instantiation: repack.c:mks_tempfile_s
Unexecuted instantiation: rev-parse.c:mks_tempfile_s
Unexecuted instantiation: rm.c:mks_tempfile_s
Unexecuted instantiation: sparse-checkout.c:mks_tempfile_s
Unexecuted instantiation: stash.c:mks_tempfile_s
Unexecuted instantiation: update-index.c:mks_tempfile_s
Unexecuted instantiation: git.c:mks_tempfile_s
156
157
/* See "mks_tempfile functions" above. */
158
static inline struct tempfile *mks_tempfile_m(const char *filename_template, int mode)
159
0
{
160
0
  return mks_tempfile_sm(filename_template, 0, mode);
161
0
}
Unexecuted instantiation: add-interactive.c:mks_tempfile_m
Unexecuted instantiation: apply.c:mks_tempfile_m
Unexecuted instantiation: bulk-checkin.c:mks_tempfile_m
Unexecuted instantiation: bundle.c:mks_tempfile_m
Unexecuted instantiation: cache-tree.c:mks_tempfile_m
Unexecuted instantiation: commit-graph.c:mks_tempfile_m
Unexecuted instantiation: commit.c:mks_tempfile_m
Unexecuted instantiation: config.c:mks_tempfile_m
Unexecuted instantiation: diff.c:mks_tempfile_m
Unexecuted instantiation: environment.c:mks_tempfile_m
Unexecuted instantiation: fetch-pack.c:mks_tempfile_m
Unexecuted instantiation: gpg-interface.c:mks_tempfile_m
Unexecuted instantiation: lockfile.c:mks_tempfile_m
Unexecuted instantiation: merge-recursive.c:mks_tempfile_m
Unexecuted instantiation: merge.c:mks_tempfile_m
Unexecuted instantiation: midx.c:mks_tempfile_m
Unexecuted instantiation: object-file.c:mks_tempfile_m
Unexecuted instantiation: path.c:mks_tempfile_m
Unexecuted instantiation: range-diff.c:mks_tempfile_m
Unexecuted instantiation: read-cache.c:mks_tempfile_m
Unexecuted instantiation: refs.c:mks_tempfile_m
Unexecuted instantiation: files-backend.c:mks_tempfile_m
Unexecuted instantiation: packed-backend.c:mks_tempfile_m
Unexecuted instantiation: repository.c:mks_tempfile_m
Unexecuted instantiation: rerere.c:mks_tempfile_m
Unexecuted instantiation: reset.c:mks_tempfile_m
Unexecuted instantiation: send-pack.c:mks_tempfile_m
Unexecuted instantiation: sequencer.c:mks_tempfile_m
Unexecuted instantiation: shallow.c:mks_tempfile_m
Unexecuted instantiation: submodule.c:mks_tempfile_m
Unexecuted instantiation: tempfile.c:mks_tempfile_m
Unexecuted instantiation: trailer.c:mks_tempfile_m
Unexecuted instantiation: upload-pack.c:mks_tempfile_m
Unexecuted instantiation: wt-status.c:mks_tempfile_m
Unexecuted instantiation: unix-stream-server.c:mks_tempfile_m
Unexecuted instantiation: add.c:mks_tempfile_m
Unexecuted instantiation: am.c:mks_tempfile_m
Unexecuted instantiation: checkout-index.c:mks_tempfile_m
Unexecuted instantiation: checkout.c:mks_tempfile_m
Unexecuted instantiation: clone.c:mks_tempfile_m
Unexecuted instantiation: credential-cache--daemon.c:mks_tempfile_m
Unexecuted instantiation: credential-store.c:mks_tempfile_m
Unexecuted instantiation: describe.c:mks_tempfile_m
Unexecuted instantiation: difftool.c:mks_tempfile_m
Unexecuted instantiation: fast-import.c:mks_tempfile_m
Unexecuted instantiation: fetch.c:mks_tempfile_m
Unexecuted instantiation: gc.c:mks_tempfile_m
Unexecuted instantiation: mv.c:mks_tempfile_m
Unexecuted instantiation: pack-objects.c:mks_tempfile_m
Unexecuted instantiation: prune.c:mks_tempfile_m
Unexecuted instantiation: pull.c:mks_tempfile_m
Unexecuted instantiation: read-tree.c:mks_tempfile_m
Unexecuted instantiation: rebase.c:mks_tempfile_m
Unexecuted instantiation: receive-pack.c:mks_tempfile_m
Unexecuted instantiation: repack.c:mks_tempfile_m
Unexecuted instantiation: rev-parse.c:mks_tempfile_m
Unexecuted instantiation: rm.c:mks_tempfile_m
Unexecuted instantiation: sparse-checkout.c:mks_tempfile_m
Unexecuted instantiation: stash.c:mks_tempfile_m
Unexecuted instantiation: update-index.c:mks_tempfile_m
Unexecuted instantiation: git.c:mks_tempfile_m
162
163
/* See "mks_tempfile functions" above. */
164
static inline struct tempfile *mks_tempfile(const char *filename_template)
165
0
{
166
0
  return mks_tempfile_sm(filename_template, 0, 0600);
167
0
}
Unexecuted instantiation: add-interactive.c:mks_tempfile
Unexecuted instantiation: apply.c:mks_tempfile
Unexecuted instantiation: bulk-checkin.c:mks_tempfile
Unexecuted instantiation: bundle.c:mks_tempfile
Unexecuted instantiation: cache-tree.c:mks_tempfile
Unexecuted instantiation: commit-graph.c:mks_tempfile
Unexecuted instantiation: commit.c:mks_tempfile
Unexecuted instantiation: config.c:mks_tempfile
Unexecuted instantiation: diff.c:mks_tempfile
Unexecuted instantiation: environment.c:mks_tempfile
Unexecuted instantiation: fetch-pack.c:mks_tempfile
Unexecuted instantiation: gpg-interface.c:mks_tempfile
Unexecuted instantiation: lockfile.c:mks_tempfile
Unexecuted instantiation: merge-recursive.c:mks_tempfile
Unexecuted instantiation: merge.c:mks_tempfile
Unexecuted instantiation: midx.c:mks_tempfile
Unexecuted instantiation: object-file.c:mks_tempfile
Unexecuted instantiation: path.c:mks_tempfile
Unexecuted instantiation: range-diff.c:mks_tempfile
Unexecuted instantiation: read-cache.c:mks_tempfile
Unexecuted instantiation: refs.c:mks_tempfile
Unexecuted instantiation: files-backend.c:mks_tempfile
Unexecuted instantiation: packed-backend.c:mks_tempfile
Unexecuted instantiation: repository.c:mks_tempfile
Unexecuted instantiation: rerere.c:mks_tempfile
Unexecuted instantiation: reset.c:mks_tempfile
Unexecuted instantiation: send-pack.c:mks_tempfile
Unexecuted instantiation: sequencer.c:mks_tempfile
Unexecuted instantiation: shallow.c:mks_tempfile
Unexecuted instantiation: submodule.c:mks_tempfile
Unexecuted instantiation: tempfile.c:mks_tempfile
Unexecuted instantiation: trailer.c:mks_tempfile
Unexecuted instantiation: upload-pack.c:mks_tempfile
Unexecuted instantiation: wt-status.c:mks_tempfile
Unexecuted instantiation: unix-stream-server.c:mks_tempfile
Unexecuted instantiation: add.c:mks_tempfile
Unexecuted instantiation: am.c:mks_tempfile
Unexecuted instantiation: checkout-index.c:mks_tempfile
Unexecuted instantiation: checkout.c:mks_tempfile
Unexecuted instantiation: clone.c:mks_tempfile
Unexecuted instantiation: credential-cache--daemon.c:mks_tempfile
Unexecuted instantiation: credential-store.c:mks_tempfile
Unexecuted instantiation: describe.c:mks_tempfile
Unexecuted instantiation: difftool.c:mks_tempfile
Unexecuted instantiation: fast-import.c:mks_tempfile
Unexecuted instantiation: fetch.c:mks_tempfile
Unexecuted instantiation: gc.c:mks_tempfile
Unexecuted instantiation: mv.c:mks_tempfile
Unexecuted instantiation: pack-objects.c:mks_tempfile
Unexecuted instantiation: prune.c:mks_tempfile
Unexecuted instantiation: pull.c:mks_tempfile
Unexecuted instantiation: read-tree.c:mks_tempfile
Unexecuted instantiation: rebase.c:mks_tempfile
Unexecuted instantiation: receive-pack.c:mks_tempfile
Unexecuted instantiation: repack.c:mks_tempfile
Unexecuted instantiation: rev-parse.c:mks_tempfile
Unexecuted instantiation: rm.c:mks_tempfile
Unexecuted instantiation: sparse-checkout.c:mks_tempfile
Unexecuted instantiation: stash.c:mks_tempfile
Unexecuted instantiation: update-index.c:mks_tempfile
Unexecuted instantiation: git.c:mks_tempfile
168
169
/* See "mks_tempfile functions" above. */
170
struct tempfile *mks_tempfile_tsm(const char *filename_template,
171
          int suffixlen, int mode);
172
173
/* See "mks_tempfile functions" above. */
174
static inline struct tempfile *mks_tempfile_ts(const char *filename_template,
175
                 int suffixlen)
176
0
{
177
0
  return mks_tempfile_tsm(filename_template, suffixlen, 0600);
178
0
}
Unexecuted instantiation: add-interactive.c:mks_tempfile_ts
Unexecuted instantiation: apply.c:mks_tempfile_ts
Unexecuted instantiation: bulk-checkin.c:mks_tempfile_ts
Unexecuted instantiation: bundle.c:mks_tempfile_ts
Unexecuted instantiation: cache-tree.c:mks_tempfile_ts
Unexecuted instantiation: commit-graph.c:mks_tempfile_ts
Unexecuted instantiation: commit.c:mks_tempfile_ts
Unexecuted instantiation: config.c:mks_tempfile_ts
Unexecuted instantiation: diff.c:mks_tempfile_ts
Unexecuted instantiation: environment.c:mks_tempfile_ts
Unexecuted instantiation: fetch-pack.c:mks_tempfile_ts
Unexecuted instantiation: gpg-interface.c:mks_tempfile_ts
Unexecuted instantiation: lockfile.c:mks_tempfile_ts
Unexecuted instantiation: merge-recursive.c:mks_tempfile_ts
Unexecuted instantiation: merge.c:mks_tempfile_ts
Unexecuted instantiation: midx.c:mks_tempfile_ts
Unexecuted instantiation: object-file.c:mks_tempfile_ts
Unexecuted instantiation: path.c:mks_tempfile_ts
Unexecuted instantiation: range-diff.c:mks_tempfile_ts
Unexecuted instantiation: read-cache.c:mks_tempfile_ts
Unexecuted instantiation: refs.c:mks_tempfile_ts
Unexecuted instantiation: files-backend.c:mks_tempfile_ts
Unexecuted instantiation: packed-backend.c:mks_tempfile_ts
Unexecuted instantiation: repository.c:mks_tempfile_ts
Unexecuted instantiation: rerere.c:mks_tempfile_ts
Unexecuted instantiation: reset.c:mks_tempfile_ts
Unexecuted instantiation: send-pack.c:mks_tempfile_ts
Unexecuted instantiation: sequencer.c:mks_tempfile_ts
Unexecuted instantiation: shallow.c:mks_tempfile_ts
Unexecuted instantiation: submodule.c:mks_tempfile_ts
Unexecuted instantiation: tempfile.c:mks_tempfile_ts
Unexecuted instantiation: trailer.c:mks_tempfile_ts
Unexecuted instantiation: upload-pack.c:mks_tempfile_ts
Unexecuted instantiation: wt-status.c:mks_tempfile_ts
Unexecuted instantiation: unix-stream-server.c:mks_tempfile_ts
Unexecuted instantiation: add.c:mks_tempfile_ts
Unexecuted instantiation: am.c:mks_tempfile_ts
Unexecuted instantiation: checkout-index.c:mks_tempfile_ts
Unexecuted instantiation: checkout.c:mks_tempfile_ts
Unexecuted instantiation: clone.c:mks_tempfile_ts
Unexecuted instantiation: credential-cache--daemon.c:mks_tempfile_ts
Unexecuted instantiation: credential-store.c:mks_tempfile_ts
Unexecuted instantiation: describe.c:mks_tempfile_ts
Unexecuted instantiation: difftool.c:mks_tempfile_ts
Unexecuted instantiation: fast-import.c:mks_tempfile_ts
Unexecuted instantiation: fetch.c:mks_tempfile_ts
Unexecuted instantiation: gc.c:mks_tempfile_ts
Unexecuted instantiation: mv.c:mks_tempfile_ts
Unexecuted instantiation: pack-objects.c:mks_tempfile_ts
Unexecuted instantiation: prune.c:mks_tempfile_ts
Unexecuted instantiation: pull.c:mks_tempfile_ts
Unexecuted instantiation: read-tree.c:mks_tempfile_ts
Unexecuted instantiation: rebase.c:mks_tempfile_ts
Unexecuted instantiation: receive-pack.c:mks_tempfile_ts
Unexecuted instantiation: repack.c:mks_tempfile_ts
Unexecuted instantiation: rev-parse.c:mks_tempfile_ts
Unexecuted instantiation: rm.c:mks_tempfile_ts
Unexecuted instantiation: sparse-checkout.c:mks_tempfile_ts
Unexecuted instantiation: stash.c:mks_tempfile_ts
Unexecuted instantiation: update-index.c:mks_tempfile_ts
Unexecuted instantiation: git.c:mks_tempfile_ts
179
180
/* See "mks_tempfile functions" above. */
181
static inline struct tempfile *mks_tempfile_tm(const char *filename_template, int mode)
182
0
{
183
0
  return mks_tempfile_tsm(filename_template, 0, mode);
184
0
}
Unexecuted instantiation: add-interactive.c:mks_tempfile_tm
Unexecuted instantiation: apply.c:mks_tempfile_tm
Unexecuted instantiation: bulk-checkin.c:mks_tempfile_tm
Unexecuted instantiation: bundle.c:mks_tempfile_tm
Unexecuted instantiation: cache-tree.c:mks_tempfile_tm
Unexecuted instantiation: commit-graph.c:mks_tempfile_tm
Unexecuted instantiation: commit.c:mks_tempfile_tm
Unexecuted instantiation: config.c:mks_tempfile_tm
Unexecuted instantiation: diff.c:mks_tempfile_tm
Unexecuted instantiation: environment.c:mks_tempfile_tm
Unexecuted instantiation: fetch-pack.c:mks_tempfile_tm
Unexecuted instantiation: gpg-interface.c:mks_tempfile_tm
Unexecuted instantiation: lockfile.c:mks_tempfile_tm
Unexecuted instantiation: merge-recursive.c:mks_tempfile_tm
Unexecuted instantiation: merge.c:mks_tempfile_tm
Unexecuted instantiation: midx.c:mks_tempfile_tm
Unexecuted instantiation: object-file.c:mks_tempfile_tm
Unexecuted instantiation: path.c:mks_tempfile_tm
Unexecuted instantiation: range-diff.c:mks_tempfile_tm
Unexecuted instantiation: read-cache.c:mks_tempfile_tm
Unexecuted instantiation: refs.c:mks_tempfile_tm
Unexecuted instantiation: files-backend.c:mks_tempfile_tm
Unexecuted instantiation: packed-backend.c:mks_tempfile_tm
Unexecuted instantiation: repository.c:mks_tempfile_tm
Unexecuted instantiation: rerere.c:mks_tempfile_tm
Unexecuted instantiation: reset.c:mks_tempfile_tm
Unexecuted instantiation: send-pack.c:mks_tempfile_tm
Unexecuted instantiation: sequencer.c:mks_tempfile_tm
Unexecuted instantiation: shallow.c:mks_tempfile_tm
Unexecuted instantiation: submodule.c:mks_tempfile_tm
Unexecuted instantiation: tempfile.c:mks_tempfile_tm
Unexecuted instantiation: trailer.c:mks_tempfile_tm
Unexecuted instantiation: upload-pack.c:mks_tempfile_tm
Unexecuted instantiation: wt-status.c:mks_tempfile_tm
Unexecuted instantiation: unix-stream-server.c:mks_tempfile_tm
Unexecuted instantiation: add.c:mks_tempfile_tm
Unexecuted instantiation: am.c:mks_tempfile_tm
Unexecuted instantiation: checkout-index.c:mks_tempfile_tm
Unexecuted instantiation: checkout.c:mks_tempfile_tm
Unexecuted instantiation: clone.c:mks_tempfile_tm
Unexecuted instantiation: credential-cache--daemon.c:mks_tempfile_tm
Unexecuted instantiation: credential-store.c:mks_tempfile_tm
Unexecuted instantiation: describe.c:mks_tempfile_tm
Unexecuted instantiation: difftool.c:mks_tempfile_tm
Unexecuted instantiation: fast-import.c:mks_tempfile_tm
Unexecuted instantiation: fetch.c:mks_tempfile_tm
Unexecuted instantiation: gc.c:mks_tempfile_tm
Unexecuted instantiation: mv.c:mks_tempfile_tm
Unexecuted instantiation: pack-objects.c:mks_tempfile_tm
Unexecuted instantiation: prune.c:mks_tempfile_tm
Unexecuted instantiation: pull.c:mks_tempfile_tm
Unexecuted instantiation: read-tree.c:mks_tempfile_tm
Unexecuted instantiation: rebase.c:mks_tempfile_tm
Unexecuted instantiation: receive-pack.c:mks_tempfile_tm
Unexecuted instantiation: repack.c:mks_tempfile_tm
Unexecuted instantiation: rev-parse.c:mks_tempfile_tm
Unexecuted instantiation: rm.c:mks_tempfile_tm
Unexecuted instantiation: sparse-checkout.c:mks_tempfile_tm
Unexecuted instantiation: stash.c:mks_tempfile_tm
Unexecuted instantiation: update-index.c:mks_tempfile_tm
Unexecuted instantiation: git.c:mks_tempfile_tm
185
186
/* See "mks_tempfile functions" above. */
187
static inline struct tempfile *mks_tempfile_t(const char *filename_template)
188
0
{
189
0
  return mks_tempfile_tsm(filename_template, 0, 0600);
190
0
}
Unexecuted instantiation: add-interactive.c:mks_tempfile_t
Unexecuted instantiation: apply.c:mks_tempfile_t
Unexecuted instantiation: bulk-checkin.c:mks_tempfile_t
Unexecuted instantiation: bundle.c:mks_tempfile_t
Unexecuted instantiation: cache-tree.c:mks_tempfile_t
Unexecuted instantiation: commit-graph.c:mks_tempfile_t
Unexecuted instantiation: commit.c:mks_tempfile_t
Unexecuted instantiation: config.c:mks_tempfile_t
Unexecuted instantiation: diff.c:mks_tempfile_t
Unexecuted instantiation: environment.c:mks_tempfile_t
Unexecuted instantiation: fetch-pack.c:mks_tempfile_t
Unexecuted instantiation: gpg-interface.c:mks_tempfile_t
Unexecuted instantiation: lockfile.c:mks_tempfile_t
Unexecuted instantiation: merge-recursive.c:mks_tempfile_t
Unexecuted instantiation: merge.c:mks_tempfile_t
Unexecuted instantiation: midx.c:mks_tempfile_t
Unexecuted instantiation: object-file.c:mks_tempfile_t
Unexecuted instantiation: path.c:mks_tempfile_t
Unexecuted instantiation: range-diff.c:mks_tempfile_t
Unexecuted instantiation: read-cache.c:mks_tempfile_t
Unexecuted instantiation: refs.c:mks_tempfile_t
Unexecuted instantiation: files-backend.c:mks_tempfile_t
Unexecuted instantiation: packed-backend.c:mks_tempfile_t
Unexecuted instantiation: repository.c:mks_tempfile_t
Unexecuted instantiation: rerere.c:mks_tempfile_t
Unexecuted instantiation: reset.c:mks_tempfile_t
Unexecuted instantiation: send-pack.c:mks_tempfile_t
Unexecuted instantiation: sequencer.c:mks_tempfile_t
Unexecuted instantiation: shallow.c:mks_tempfile_t
Unexecuted instantiation: submodule.c:mks_tempfile_t
Unexecuted instantiation: tempfile.c:mks_tempfile_t
Unexecuted instantiation: trailer.c:mks_tempfile_t
Unexecuted instantiation: upload-pack.c:mks_tempfile_t
Unexecuted instantiation: wt-status.c:mks_tempfile_t
Unexecuted instantiation: unix-stream-server.c:mks_tempfile_t
Unexecuted instantiation: add.c:mks_tempfile_t
Unexecuted instantiation: am.c:mks_tempfile_t
Unexecuted instantiation: checkout-index.c:mks_tempfile_t
Unexecuted instantiation: checkout.c:mks_tempfile_t
Unexecuted instantiation: clone.c:mks_tempfile_t
Unexecuted instantiation: credential-cache--daemon.c:mks_tempfile_t
Unexecuted instantiation: credential-store.c:mks_tempfile_t
Unexecuted instantiation: describe.c:mks_tempfile_t
Unexecuted instantiation: difftool.c:mks_tempfile_t
Unexecuted instantiation: fast-import.c:mks_tempfile_t
Unexecuted instantiation: fetch.c:mks_tempfile_t
Unexecuted instantiation: gc.c:mks_tempfile_t
Unexecuted instantiation: mv.c:mks_tempfile_t
Unexecuted instantiation: pack-objects.c:mks_tempfile_t
Unexecuted instantiation: prune.c:mks_tempfile_t
Unexecuted instantiation: pull.c:mks_tempfile_t
Unexecuted instantiation: read-tree.c:mks_tempfile_t
Unexecuted instantiation: rebase.c:mks_tempfile_t
Unexecuted instantiation: receive-pack.c:mks_tempfile_t
Unexecuted instantiation: repack.c:mks_tempfile_t
Unexecuted instantiation: rev-parse.c:mks_tempfile_t
Unexecuted instantiation: rm.c:mks_tempfile_t
Unexecuted instantiation: sparse-checkout.c:mks_tempfile_t
Unexecuted instantiation: stash.c:mks_tempfile_t
Unexecuted instantiation: update-index.c:mks_tempfile_t
Unexecuted instantiation: git.c:mks_tempfile_t
191
192
/* See "mks_tempfile functions" above. */
193
struct tempfile *xmks_tempfile_m(const char *filename_template, int mode);
194
195
/* See "mks_tempfile functions" above. */
196
static inline struct tempfile *xmks_tempfile(const char *filename_template)
197
0
{
198
0
  return xmks_tempfile_m(filename_template, 0600);
199
0
}
Unexecuted instantiation: add-interactive.c:xmks_tempfile
Unexecuted instantiation: apply.c:xmks_tempfile
Unexecuted instantiation: bulk-checkin.c:xmks_tempfile
Unexecuted instantiation: bundle.c:xmks_tempfile
Unexecuted instantiation: cache-tree.c:xmks_tempfile
Unexecuted instantiation: commit-graph.c:xmks_tempfile
Unexecuted instantiation: commit.c:xmks_tempfile
Unexecuted instantiation: config.c:xmks_tempfile
Unexecuted instantiation: diff.c:xmks_tempfile
Unexecuted instantiation: environment.c:xmks_tempfile
Unexecuted instantiation: fetch-pack.c:xmks_tempfile
Unexecuted instantiation: gpg-interface.c:xmks_tempfile
Unexecuted instantiation: lockfile.c:xmks_tempfile
Unexecuted instantiation: merge-recursive.c:xmks_tempfile
Unexecuted instantiation: merge.c:xmks_tempfile
Unexecuted instantiation: midx.c:xmks_tempfile
Unexecuted instantiation: object-file.c:xmks_tempfile
Unexecuted instantiation: path.c:xmks_tempfile
Unexecuted instantiation: range-diff.c:xmks_tempfile
Unexecuted instantiation: read-cache.c:xmks_tempfile
Unexecuted instantiation: refs.c:xmks_tempfile
Unexecuted instantiation: files-backend.c:xmks_tempfile
Unexecuted instantiation: packed-backend.c:xmks_tempfile
Unexecuted instantiation: repository.c:xmks_tempfile
Unexecuted instantiation: rerere.c:xmks_tempfile
Unexecuted instantiation: reset.c:xmks_tempfile
Unexecuted instantiation: send-pack.c:xmks_tempfile
Unexecuted instantiation: sequencer.c:xmks_tempfile
Unexecuted instantiation: shallow.c:xmks_tempfile
Unexecuted instantiation: submodule.c:xmks_tempfile
Unexecuted instantiation: tempfile.c:xmks_tempfile
Unexecuted instantiation: trailer.c:xmks_tempfile
Unexecuted instantiation: upload-pack.c:xmks_tempfile
Unexecuted instantiation: wt-status.c:xmks_tempfile
Unexecuted instantiation: unix-stream-server.c:xmks_tempfile
Unexecuted instantiation: add.c:xmks_tempfile
Unexecuted instantiation: am.c:xmks_tempfile
Unexecuted instantiation: checkout-index.c:xmks_tempfile
Unexecuted instantiation: checkout.c:xmks_tempfile
Unexecuted instantiation: clone.c:xmks_tempfile
Unexecuted instantiation: credential-cache--daemon.c:xmks_tempfile
Unexecuted instantiation: credential-store.c:xmks_tempfile
Unexecuted instantiation: describe.c:xmks_tempfile
Unexecuted instantiation: difftool.c:xmks_tempfile
Unexecuted instantiation: fast-import.c:xmks_tempfile
Unexecuted instantiation: fetch.c:xmks_tempfile
Unexecuted instantiation: gc.c:xmks_tempfile
Unexecuted instantiation: mv.c:xmks_tempfile
Unexecuted instantiation: pack-objects.c:xmks_tempfile
Unexecuted instantiation: prune.c:xmks_tempfile
Unexecuted instantiation: pull.c:xmks_tempfile
Unexecuted instantiation: read-tree.c:xmks_tempfile
Unexecuted instantiation: rebase.c:xmks_tempfile
Unexecuted instantiation: receive-pack.c:xmks_tempfile
Unexecuted instantiation: repack.c:xmks_tempfile
Unexecuted instantiation: rev-parse.c:xmks_tempfile
Unexecuted instantiation: rm.c:xmks_tempfile
Unexecuted instantiation: sparse-checkout.c:xmks_tempfile
Unexecuted instantiation: stash.c:xmks_tempfile
Unexecuted instantiation: update-index.c:xmks_tempfile
Unexecuted instantiation: git.c:xmks_tempfile
200
201
/*
202
 * Attempt to create a temporary directory in $TMPDIR and to create and
203
 * open a file in that new directory. Derive the directory name from the
204
 * template in the manner of mkdtemp(). Arrange for directory and file
205
 * to be deleted if the program exits before they are deleted
206
 * explicitly. On success return a tempfile whose "filename" member
207
 * contains the full path of the file and its "fd" member is open for
208
 * writing the file. On error return NULL and set errno appropriately.
209
 */
210
struct tempfile *mks_tempfile_dt(const char *directory_template,
211
         const char *filename);
212
213
/*
214
 * Associate a stdio stream with the temporary file (which must still
215
 * be open). Return `NULL` (*without* deleting the file) on error. The
216
 * stream is closed automatically when `close_tempfile_gently()` is called or
217
 * when the file is deleted or renamed.
218
 */
219
FILE *fdopen_tempfile(struct tempfile *tempfile, const char *mode);
220
221
static inline int is_tempfile_active(struct tempfile *tempfile)
222
488k
{
223
488k
  return !!tempfile;
224
488k
}
Unexecuted instantiation: add-interactive.c:is_tempfile_active
Unexecuted instantiation: apply.c:is_tempfile_active
Unexecuted instantiation: bulk-checkin.c:is_tempfile_active
Unexecuted instantiation: bundle.c:is_tempfile_active
Unexecuted instantiation: cache-tree.c:is_tempfile_active
Unexecuted instantiation: commit-graph.c:is_tempfile_active
Unexecuted instantiation: commit.c:is_tempfile_active
Unexecuted instantiation: config.c:is_tempfile_active
Unexecuted instantiation: diff.c:is_tempfile_active
Unexecuted instantiation: environment.c:is_tempfile_active
Unexecuted instantiation: fetch-pack.c:is_tempfile_active
Unexecuted instantiation: gpg-interface.c:is_tempfile_active
Unexecuted instantiation: lockfile.c:is_tempfile_active
Unexecuted instantiation: merge-recursive.c:is_tempfile_active
Unexecuted instantiation: merge.c:is_tempfile_active
Unexecuted instantiation: midx.c:is_tempfile_active
Unexecuted instantiation: object-file.c:is_tempfile_active
Unexecuted instantiation: path.c:is_tempfile_active
Unexecuted instantiation: range-diff.c:is_tempfile_active
Unexecuted instantiation: read-cache.c:is_tempfile_active
Unexecuted instantiation: refs.c:is_tempfile_active
Unexecuted instantiation: files-backend.c:is_tempfile_active
packed-backend.c:is_tempfile_active
Line
Count
Source
222
257k
{
223
257k
  return !!tempfile;
224
257k
}
Unexecuted instantiation: repository.c:is_tempfile_active
Unexecuted instantiation: rerere.c:is_tempfile_active
Unexecuted instantiation: reset.c:is_tempfile_active
Unexecuted instantiation: send-pack.c:is_tempfile_active
Unexecuted instantiation: sequencer.c:is_tempfile_active
Unexecuted instantiation: shallow.c:is_tempfile_active
Unexecuted instantiation: submodule.c:is_tempfile_active
tempfile.c:is_tempfile_active
Line
Count
Source
222
231k
{
223
231k
  return !!tempfile;
224
231k
}
Unexecuted instantiation: trailer.c:is_tempfile_active
Unexecuted instantiation: upload-pack.c:is_tempfile_active
Unexecuted instantiation: wt-status.c:is_tempfile_active
Unexecuted instantiation: unix-stream-server.c:is_tempfile_active
Unexecuted instantiation: add.c:is_tempfile_active
Unexecuted instantiation: am.c:is_tempfile_active
Unexecuted instantiation: checkout-index.c:is_tempfile_active
Unexecuted instantiation: checkout.c:is_tempfile_active
Unexecuted instantiation: clone.c:is_tempfile_active
Unexecuted instantiation: credential-cache--daemon.c:is_tempfile_active
Unexecuted instantiation: credential-store.c:is_tempfile_active
Unexecuted instantiation: describe.c:is_tempfile_active
Unexecuted instantiation: difftool.c:is_tempfile_active
Unexecuted instantiation: fast-import.c:is_tempfile_active
Unexecuted instantiation: fetch.c:is_tempfile_active
Unexecuted instantiation: gc.c:is_tempfile_active
Unexecuted instantiation: mv.c:is_tempfile_active
Unexecuted instantiation: pack-objects.c:is_tempfile_active
Unexecuted instantiation: prune.c:is_tempfile_active
Unexecuted instantiation: pull.c:is_tempfile_active
Unexecuted instantiation: read-tree.c:is_tempfile_active
Unexecuted instantiation: rebase.c:is_tempfile_active
Unexecuted instantiation: receive-pack.c:is_tempfile_active
Unexecuted instantiation: repack.c:is_tempfile_active
Unexecuted instantiation: rev-parse.c:is_tempfile_active
Unexecuted instantiation: rm.c:is_tempfile_active
Unexecuted instantiation: sparse-checkout.c:is_tempfile_active
Unexecuted instantiation: stash.c:is_tempfile_active
Unexecuted instantiation: update-index.c:is_tempfile_active
Unexecuted instantiation: git.c:is_tempfile_active
225
226
/*
227
 * Return the path of the lockfile. The return value is a pointer to a
228
 * field within the lock_file object and should not be freed.
229
 */
230
const char *get_tempfile_path(struct tempfile *tempfile);
231
232
int get_tempfile_fd(struct tempfile *tempfile);
233
FILE *get_tempfile_fp(struct tempfile *tempfile);
234
235
/*
236
 * If the temporary file is still open, close it (and the file pointer
237
 * too, if it has been opened using `fdopen_tempfile()`) without
238
 * deleting the file. Return 0 upon success. On failure to `close(2)`,
239
 * return a negative value. Usually `delete_tempfile()` or `rename_tempfile()`
240
 * should eventually be called regardless of whether `close_tempfile_gently()`
241
 * succeeds.
242
 */
243
int close_tempfile_gently(struct tempfile *tempfile);
244
245
/*
246
 * Re-open a temporary file that has been closed using
247
 * `close_tempfile_gently()` but not yet deleted or renamed. This can be used
248
 * to implement a sequence of operations like the following:
249
 *
250
 * * Create temporary file.
251
 *
252
 * * Write new contents to file, then `close_tempfile_gently()` to cause the
253
 *   contents to be written to disk.
254
 *
255
 * * Pass the name of the temporary file to another program to allow
256
 *   it (and nobody else) to inspect or even modify the file's
257
 *   contents.
258
 *
259
 * * `reopen_tempfile()` to reopen the temporary file, truncating the existing
260
 *   contents. Write out the new contents.
261
 *
262
 * * `rename_tempfile()` to move the file to its permanent location.
263
 */
264
int reopen_tempfile(struct tempfile *tempfile);
265
266
/*
267
 * Close the file descriptor and/or file pointer and remove the
268
 * temporary file associated with `tempfile`. It is a NOOP to call
269
 * `delete_tempfile()` for a `tempfile` object that has already been
270
 * deleted or renamed.
271
 */
272
void delete_tempfile(struct tempfile **tempfile_p);
273
274
/*
275
 * Close the file descriptor and/or file pointer if they are still
276
 * open, and atomically rename the temporary file to `path`. `path`
277
 * must be on the same filesystem as the lock file. Return 0 on
278
 * success. On failure, delete the temporary file and return -1, with
279
 * `errno` set to the value from the failing call to `close(2)` or
280
 * `rename(2)`. It is a bug to call `rename_tempfile()` for a
281
 * `tempfile` object that is not currently active.
282
 */
283
int rename_tempfile(struct tempfile **tempfile_p, const char *path);
284
285
#endif /* TEMPFILE_H */