2 * Create a file, and reset the modes
4 * Kern Sibbald, November MM
10 Bacula® - The Network Backup Solution
12 Copyright (C) 2000-2006 Free Software Foundation Europe e.V.
14 The main author of Bacula is Kern Sibbald, with contributions from
15 many others, a complete list can be found in the file AUTHORS.
16 This program is Free Software; you can redistribute it and/or
17 modify it under the terms of version two of the GNU General Public
18 License as published by the Free Software Foundation plus additions
19 that are listed in the file LICENSE.
21 This program is distributed in the hope that it will be useful, but
22 WITHOUT ANY WARRANTY; without even the implied warranty of
23 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
24 General Public License for more details.
26 You should have received a copy of the GNU General Public License
27 along with this program; if not, write to the Free Software
28 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
31 Bacula® is a registered trademark of John Walker.
32 The licensor of Bacula is the Free Software Foundation Europe
33 (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
34 Switzerland, email:ftf@fsfeurope.org.
41 #define S_IRWXUGO (S_IRWXU | S_IRWXG | S_IRWXO)
49 static int separate_path_and_file(JCR *jcr, char *fname, char *ofile);
50 static int path_already_seen(JCR *jcr, char *path, int pnl);
54 * Create the file, or the directory
56 * fname is the original filename
57 * ofile is the output filename (may be in a different directory)
59 * Returns: CF_SKIP if file should be skipped
61 * CF_EXTRACT file created and data to restore
62 * CF_CREATED file created no data to restore
64 * Note, we create the file here, except for special files,
65 * we do not set the attributes because we want to first
66 * write the file, then when the writing is done, set the
68 * So, we return with the file descriptor open for normal
72 int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
74 int new_mode, parent_mode, mode;
81 if (is_win32_stream(attr->data_stream)) {
82 set_win32_backup(bfd);
84 set_portable_backup(bfd);
87 new_mode = attr->statp.st_mode;
88 Dmsg3(200, "type=%d newmode=%x file=%s\n", attr->type, new_mode, attr->ofname);
89 parent_mode = S_IWUSR | S_IXUSR | new_mode;
90 gid = attr->statp.st_gid;
91 uid = attr->statp.st_uid;
94 if (!bfd->use_backup_api) {
95 // eliminate invalid windows filename characters from foreign filenames
96 char *ch = (char *)attr->ofname;
97 if (ch[0] != 0 && ch[1] != 0) {
116 Dmsg2(400, "Replace=%c %d\n", (char)replace, replace);
117 if (lstat(attr->ofname, &mstatp) == 0) {
120 case REPLACE_IFNEWER:
121 if (attr->statp.st_mtime <= mstatp.st_mtime) {
122 Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Not newer: %s\n"), attr->ofname);
127 case REPLACE_IFOLDER:
128 if (attr->statp.st_mtime >= mstatp.st_mtime) {
129 Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Not older: %s\n"), attr->ofname);
135 Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Already exists: %s\n"), attr->ofname);
142 switch (attr->type) {
143 case FT_RAW: /* raw device to be written */
144 case FT_FIFO: /* FIFO to be written to */
145 case FT_LNKSAVED: /* Hard linked, file already saved */
147 case FT_SPEC: /* fifo, ... to be backed up */
148 case FT_REGE: /* empty file */
149 case FT_REG: /* regular file */
151 * Note, we do not delete FT_RAW because these are device files
152 * or FIFOs that should already exist. If we blow it away,
153 * we may blow away a FIFO that is being used to read the
154 * restore data, or we may blow away a partition definition.
156 if (exists && attr->type != FT_RAW && attr->type != FT_FIFO) {
157 /* Get rid of old copy */
158 if (unlink(attr->ofname) == -1) {
160 Qmsg(jcr, M_ERROR, 0, _("File %s already exists and could not be replaced. ERR=%s.\n"),
161 attr->ofname, be.strerror());
162 /* Continue despite error */
166 * Here we do some preliminary work for all the above
167 * types to create the path to the file if it does
168 * not already exist. Below, we will split to
169 * do the file type specific work
171 pnl = separate_path_and_file(jcr, attr->fname, attr->ofname);
177 * If path length is <= 0 we are making a file in the root
178 * directory. Assume that the directory already exists.
182 savechr = attr->ofname[pnl];
183 attr->ofname[pnl] = 0; /* terminate path */
185 if (!path_already_seen(jcr, attr->ofname, pnl)) {
186 Dmsg1(100, "Make path %s\n", attr->ofname);
188 * If we need to make the directory, ensure that it is with
189 * execute bit set (i.e. parent_mode), and preserve what already
190 * exists. Normally, this should do nothing.
192 if (make_path(jcr, attr->ofname, parent_mode, parent_mode, uid, gid, 1, NULL) != 0) {
193 Dmsg1(10, "Could not make path. %s\n", attr->ofname);
194 attr->ofname[pnl] = savechr; /* restore full name */
198 attr->ofname[pnl] = savechr; /* restore full name */
201 /* Now we do the specific work for each file type */
205 Dmsg1(100, "Create file %s\n", attr->ofname);
206 mode = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY; /* O_NOFOLLOW; */
207 if (IS_CTG(attr->statp.st_mode)) {
208 mode |= O_CTG; /* set contiguous bit if needed */
210 Dmsg1(50, "Create file: %s\n", attr->ofname);
212 Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid);
217 if ((bopen(bfd, attr->ofname, mode, S_IRUSR | S_IWUSR)) < 0) {
219 be.set_errno(bfd->berrno);
220 Qmsg2(jcr, M_ERROR, 0, _("Could not create %s: ERR=%s\n"),
221 attr->ofname, be.strerror());
226 #ifndef HAVE_WIN32 // none of these exists on MS Windows
227 case FT_RAW: /* Bacula raw device e.g. /dev/sda1 */
228 case FT_FIFO: /* Bacula fifo to save data */
230 if (S_ISFIFO(attr->statp.st_mode)) {
231 Dmsg1(200, "Restore fifo: %s\n", attr->ofname);
232 if (mkfifo(attr->ofname, attr->statp.st_mode) != 0 && errno != EEXIST) {
234 Qmsg2(jcr, M_ERROR, 0, _("Cannot make fifo %s: ERR=%s\n"),
235 attr->ofname, be.strerror());
238 } else if(S_ISSOCK(attr->statp.st_mode)) {
239 Dmsg1(200, "Skipping restore of socket: %s\n", attr->ofname);
241 Dmsg1(200, "Restore node: %s\n", attr->ofname);
242 if (mknod(attr->ofname, attr->statp.st_mode, attr->statp.st_rdev) != 0 && errno != EEXIST) {
244 Qmsg2(jcr, M_ERROR, 0, _("Cannot make node %s: ERR=%s\n"),
245 attr->ofname, be.strerror());
249 if (attr->type == FT_RAW || attr->type == FT_FIFO) {
251 Dmsg1(200, "FT_RAW|FT_FIFO %s\n", attr->ofname);
252 mode = O_WRONLY | O_BINARY;
253 /* Timeout open() in 60 seconds */
254 if (attr->type == FT_FIFO) {
255 Dmsg0(200, "Set FIFO timer\n");
256 tid = start_thread_timer(pthread_self(), 60);
261 Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid);
263 Dmsg2(200, "open %s mode=0x%x\n", attr->ofname, mode);
264 if ((bopen(bfd, attr->ofname, mode, 0)) < 0) {
266 be.set_errno(bfd->berrno);
267 Qmsg2(jcr, M_ERROR, 0, _("Could not open %s: ERR=%s\n"),
268 attr->ofname, be.strerror());
269 stop_thread_timer(tid);
272 stop_thread_timer(tid);
275 Dmsg1(200, "FT_SPEC %s\n", attr->ofname);
279 Dmsg2(130, "FT_LNK should restore: %s -> %s\n", attr->ofname, attr->olname);
280 if (symlink(attr->olname, attr->ofname) != 0 && errno != EEXIST) {
282 Qmsg3(jcr, M_ERROR, 0, _("Could not symlink %s -> %s: ERR=%s\n"),
283 attr->ofname, attr->olname, be.strerror());
288 case FT_LNKSAVED: /* Hard linked, file already saved */
289 Dmsg2(130, "Hard link %s => %s\n", attr->ofname, attr->olname);
290 if (link(attr->olname, attr->ofname) != 0) {
296 * If using BSD user flags, maybe has a file flag
297 * preventing this. So attempt to disable, retry link,
299 * Note that BSD securelevel may prevent disabling flag.
302 if (stat(attr->olname, &s) == 0 && s.st_flags != 0) {
303 if (chflags(attr->olname, 0) == 0) {
304 if (link(attr->olname, attr->ofname) != 0) {
305 /* restore original file flags even when linking failed */
306 if (chflags(attr->olname, s.st_flags) < 0) {
307 Qmsg2(jcr, M_ERROR, 0, _("Could not restore file flags for file %s: ERR=%s\n"),
308 attr->olname, be.strerror());
310 #endif /* HAVE_CHFLAGS */
311 Qmsg3(jcr, M_ERROR, 0, _("Could not hard link %s -> %s: ERR=%s\n"),
312 attr->ofname, attr->olname, be.strerror());
316 /* finally restore original file flags */
317 if (chflags(attr->olname, s.st_flags) < 0) {
318 Qmsg2(jcr, M_ERROR, 0, _("Could not restore file flags for file %s: ERR=%s\n"),
319 attr->olname, be.strerror());
322 Qmsg2(jcr, M_ERROR, 0, _("Could not reset file flags for file %s: ERR=%s\n"),
323 attr->olname, be.strerror());
326 Qmsg3(jcr, M_ERROR, 0, _("Could not hard link %s -> %s: ERR=%s\n"),
327 attr->ofname, attr->olname, be.strerror());
330 #endif /* HAVE_CHFLAGS */
335 } /* End inner switch */
339 Dmsg2(200, "Make dir mode=%o dir=%s\n", new_mode, attr->ofname);
340 if (make_path(jcr, attr->ofname, new_mode, parent_mode, uid, gid, 0, NULL) != 0) {
344 * If we are using the Win32 Backup API, we open the
345 * directory so that the security info will be read
348 if (!is_portable_backup(bfd)) {
350 Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid);
352 if ((bopen(bfd, attr->ofname, O_WRONLY|O_BINARY, 0)) < 0) {
354 be.set_errno(bfd->berrno);
356 /* Check for trying to create a drive, if so, skip */
357 if (attr->ofname[1] == ':' &&
358 IsPathSeparator(attr->ofname[2]) &&
359 attr->ofname[3] == '\0') {
363 Qmsg2(jcr, M_ERROR, 0, _("Could not open %s: ERR=%s\n"),
364 attr->ofname, be.strerror());
372 /* The following should not occur */
382 Qmsg2(jcr, M_ERROR, 0, _("Original file %s not saved: type=%d\n"), attr->fname, attr->type);
385 Qmsg2(jcr, M_ERROR, 0, _("Unknown file type %d; not restored: %s\n"), attr->type, attr->fname);
392 * Returns: > 0 index into path where last path char is.
394 * -1 filename is zero length
396 static int separate_path_and_file(JCR *jcr, char *fname, char *ofile)
401 /* Separate pathname and filename */
402 for (q=p=f=ofile; *p; p++) {
404 if (IsPathSeparator(*p)) {
406 if (IsPathSeparator(p[1])) {
410 *q++ = *p; /* copy data */
412 if (IsPathSeparator(*p)) {
413 f = q; /* possible filename */
419 if (IsPathSeparator(*f)) {
422 *q = 0; /* terminate string */
426 /* The filename length must not be zero here because we
427 * are dealing with a file (i.e. FT_REGE or FT_REG).
429 Jmsg1(jcr, M_ERROR, 0, _("Zero length filename: %s\n"), fname);
437 * Primitive caching of path to prevent recreating a pathname
438 * each time as long as we remain in the same directory.
440 static int path_already_seen(JCR *jcr, char *path, int pnl)
442 if (!jcr->cached_path) {
443 jcr->cached_path = get_pool_memory(PM_FNAME);
445 if (jcr->cached_pnl == pnl && strcmp(path, jcr->cached_path) == 0) {
448 pm_strcpy(jcr->cached_path, path);
449 jcr->cached_pnl = pnl;