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 */ |