2 Bacula® - The Network Backup Solution
4 Copyright (C) 2000-2014 Free Software Foundation Europe e.V.
6 The main author of Bacula is Kern Sibbald, with contributions from
7 many others, a complete list can be found in the file AUTHORS.
8 This program is Free Software; you can redistribute it and/or
9 modify it under the terms of version three of the GNU Affero General Public
10 License as published by the Free Software Foundation and included
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU Affero General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23 Bacula® is a registered trademark of Kern Sibbald.
24 The licensor of Bacula is the Free Software Foundation Europe
25 (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26 Switzerland, email:ftf@fsfeurope.org.
29 * Create a file, and reset the modes
31 * Kern Sibbald, November MM
39 #define S_IRWXUGO (S_IRWXU | S_IRWXG | S_IRWXO)
54 static int separate_path_and_file(JCR *jcr, char *fname, char *ofile);
55 static int path_already_seen(JCR *jcr, char *path, int pnl);
59 * Create the file, or the directory
61 * fname is the original filename
62 * ofile is the output filename (may be in a different directory)
64 * Returns: CF_SKIP if file should be skipped
66 * CF_EXTRACT file created and data to restore
67 * CF_CREATED file created no data to restore
69 * Note, we create the file here, except for special files,
70 * we do not set the attributes because we want to first
71 * write the file, then when the writing is done, set the
73 * So, we return with the file descriptor open for normal
77 int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
79 mode_t new_mode, parent_mode;
87 bfd->reparse_point = false;
88 set_portable_backup(bfd);
90 new_mode = attr->statp.st_mode;
91 Dmsg3(200, "type=%d newmode=%x file=%s\n", attr->type, new_mode, attr->ofname);
92 parent_mode = S_IWUSR | S_IXUSR | new_mode;
93 gid = attr->statp.st_gid;
94 uid = attr->statp.st_uid;
96 Dmsg2(400, "Replace=%c %d\n", (char)replace, replace);
97 if (lstat(attr->ofname, &mstatp) == 0) {
100 case REPLACE_IFNEWER:
101 if (attr->statp.st_mtime <= mstatp.st_mtime) {
102 Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Not newer: %s\n"), attr->ofname);
107 case REPLACE_IFOLDER:
108 if (attr->statp.st_mtime >= mstatp.st_mtime) {
109 Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Not older: %s\n"), attr->ofname);
115 /* Set attributes if we created this directory */
116 if (attr->type == FT_DIREND && path_list_lookup(jcr, attr->ofname)) {
119 Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Already exists: %s\n"), attr->ofname);
126 switch (attr->type) {
127 case FT_RAW: /* raw device to be written */
128 case FT_FIFO: /* FIFO to be written to */
129 case FT_LNKSAVED: /* Hard linked, file already saved */
131 case FT_SPEC: /* fifo, ... to be backed up */
132 case FT_REGE: /* empty file */
133 case FT_REG: /* regular file */
135 * Note, we do not delete FT_RAW because these are device files
136 * or FIFOs that should already exist. If we blow it away,
137 * we may blow away a FIFO that is being used to read the
138 * restore data, or we may blow away a partition definition.
140 if (exists && attr->type != FT_RAW && attr->type != FT_FIFO) {
141 /* Get rid of old copy */
142 Dmsg1(400, "unlink %s\n", attr->ofname);
143 if (unlink(attr->ofname) == -1) {
145 Qmsg(jcr, M_ERROR, 0, _("File %s already exists and could not be replaced. ERR=%s.\n"),
146 attr->ofname, be.bstrerror());
151 * Here we do some preliminary work for all the above
152 * types to create the path to the file if it does
153 * not already exist. Below, we will split to
154 * do the file type specific work
156 pnl = separate_path_and_file(jcr, attr->fname, attr->ofname);
162 * If path length is <= 0 we are making a file in the root
163 * directory. Assume that the directory already exists.
167 savechr = attr->ofname[pnl];
168 attr->ofname[pnl] = 0; /* terminate path */
170 if (!path_already_seen(jcr, attr->ofname, pnl)) {
171 Dmsg1(400, "Make path %s\n", attr->ofname);
173 * If we need to make the directory, ensure that it is with
174 * execute bit set (i.e. parent_mode), and preserve what already
175 * exists. Normally, this should do nothing.
177 if (!makepath(attr, attr->ofname, parent_mode, parent_mode, uid, gid, 1)) {
178 Dmsg1(10, "Could not make path. %s\n", attr->ofname);
179 attr->ofname[pnl] = savechr; /* restore full name */
183 attr->ofname[pnl] = savechr; /* restore full name */
186 /* Now we do the specific work for each file type */
190 Dmsg1(100, "Create=%s\n", attr->ofname);
191 flags = O_WRONLY | O_CREAT | O_BINARY | O_EXCL;
192 if (IS_CTG(attr->statp.st_mode)) {
193 flags |= O_CTG; /* set contiguous bit if needed */
196 Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid);
201 if ((bopen(bfd, attr->ofname, flags, S_IRUSR | S_IWUSR)) < 0) {
203 be.set_errno(bfd->berrno);
204 Qmsg2(jcr, M_ERROR, 0, _("Could not create %s: ERR=%s\n"),
205 attr->ofname, be.bstrerror());
206 Dmsg2(100,"Could not create %s: ERR=%s\n", attr->ofname, be.bstrerror());
211 case FT_RAW: /* Bacula raw device e.g. /dev/sda1 */
212 case FT_FIFO: /* Bacula fifo to save data */
214 if (S_ISFIFO(attr->statp.st_mode)) {
215 Dmsg1(400, "Restore fifo: %s\n", attr->ofname);
216 if (mkfifo(attr->ofname, attr->statp.st_mode) != 0 && errno != EEXIST) {
218 Qmsg2(jcr, M_ERROR, 0, _("Cannot make fifo %s: ERR=%s\n"),
219 attr->ofname, be.bstrerror());
222 } else if (S_ISSOCK(attr->statp.st_mode)) {
223 Dmsg1(200, "Skipping restore of socket: %s\n", attr->ofname);
224 #ifdef S_IFDOOR // Solaris high speed RPC mechanism
225 } else if (S_ISDOOR(attr->statp.st_mode)) {
226 Dmsg1(200, "Skipping restore of door file: %s\n", attr->ofname);
228 #ifdef S_IFPORT // Solaris event port for handling AIO
229 } else if (S_ISPORT(attr->statp.st_mode)) {
230 Dmsg1(200, "Skipping restore of event port file: %s\n", attr->ofname);
233 Dmsg1(400, "Restore node: %s\n", attr->ofname);
234 if (mknod(attr->ofname, attr->statp.st_mode, attr->statp.st_rdev) != 0 && errno != EEXIST) {
236 Qmsg2(jcr, M_ERROR, 0, _("Cannot make node %s: ERR=%s\n"),
237 attr->ofname, be.bstrerror());
242 * Here we are going to attempt to restore to a FIFO, which
243 * means that the FIFO must already exist, AND there must
244 * be some process already attempting to read from the
245 * FIFO, so we open it write-only.
247 if (attr->type == FT_RAW || attr->type == FT_FIFO) {
249 Dmsg1(400, "FT_RAW|FT_FIFO %s\n", attr->ofname);
250 flags = O_WRONLY | O_BINARY;
251 /* Timeout open() in 60 seconds */
252 if (attr->type == FT_FIFO) {
253 Dmsg0(400, "Set FIFO timer\n");
254 tid = start_thread_timer(jcr, pthread_self(), 60);
259 Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid);
261 Dmsg2(400, "open %s flags=0x%x\n", attr->ofname, flags);
262 if ((bopen(bfd, attr->ofname, flags, 0)) < 0) {
264 be.set_errno(bfd->berrno);
265 Qmsg2(jcr, M_ERROR, 0, _("Could not open %s: ERR=%s\n"),
266 attr->ofname, be.bstrerror());
267 Dmsg2(400, "Could not open %s: ERR=%s\n", attr->ofname, be.bstrerror());
268 stop_thread_timer(tid);
271 stop_thread_timer(tid);
274 Dmsg1(400, "FT_SPEC %s\n", attr->ofname);
278 Dmsg2(130, "FT_LNK should restore: %s -> %s\n", attr->ofname, attr->olname);
279 if (symlink(attr->olname, attr->ofname) != 0 && errno != EEXIST) {
281 Qmsg3(jcr, M_ERROR, 0, _("Could not symlink %s -> %s: ERR=%s\n"),
282 attr->ofname, attr->olname, be.bstrerror());
287 case FT_LNKSAVED: /* Hard linked, file already saved */
288 Dmsg2(130, "Hard link %s => %s\n", attr->ofname, attr->olname);
289 if (link(attr->olname, attr->ofname) != 0) {
294 * If using BSD user flags, maybe has a file flag
295 * preventing this. So attempt to disable, retry link,
297 * Note that BSD securelevel may prevent disabling flag.
299 if (stat(attr->olname, &s) == 0 && s.st_flags != 0) {
300 if (chflags(attr->olname, 0) == 0) {
301 if (link(attr->olname, attr->ofname) != 0) {
302 /* restore original file flags even when linking failed */
303 if (chflags(attr->olname, s.st_flags) < 0) {
304 Qmsg2(jcr, M_ERROR, 0, _("Could not restore file flags for file %s: ERR=%s\n"),
305 attr->olname, be.bstrerror());
307 #endif /* HAVE_CHFLAGS */
308 Qmsg3(jcr, M_ERROR, 0, _("Could not hard link %s -> %s: ERR=%s\n"),
309 attr->ofname, attr->olname, be.bstrerror());
310 Dmsg3(200, "Could not hard link %s -> %s: ERR=%s\n",
311 attr->ofname, attr->olname, be.bstrerror());
315 /* finally restore original file flags */
316 if (chflags(attr->olname, s.st_flags) < 0) {
317 Qmsg2(jcr, M_ERROR, 0, _("Could not restore file flags for file %s: ERR=%s\n"),
318 attr->olname, be.bstrerror());
321 Qmsg2(jcr, M_ERROR, 0, _("Could not reset file flags for file %s: ERR=%s\n"),
322 attr->olname, be.bstrerror());
325 Qmsg3(jcr, M_ERROR, 0, _("Could not hard link %s -> %s: ERR=%s\n"),
326 attr->ofname, attr->olname, be.bstrerror());
329 #endif /* HAVE_CHFLAGS */
333 } /* End inner switch */
337 Dmsg2(200, "Make dir mode=%o dir=%s\n", new_mode, attr->ofname);
338 if (!makepath(attr, attr->ofname, new_mode, parent_mode, uid, gid, 0)) {
342 * If we are using the Win32 Backup API, we open the
343 * directory so that the security info will be read
346 if (!is_portable_backup(bfd)) {
348 Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid);
350 if ((bopen(bfd, attr->ofname, O_WRONLY|O_BINARY, 0)) < 0) {
352 be.set_errno(bfd->berrno);
353 Qmsg2(jcr, M_ERROR, 0, _("Could not open %s: ERR=%s\n"),
354 attr->ofname, be.bstrerror());
363 Qmsg2(jcr, M_INFO, 0, _("Original file %s have been deleted: type=%d\n"), attr->fname, attr->type);
365 /* The following should not occur */
375 Qmsg2(jcr, M_ERROR, 0, _("Original file %s not saved: type=%d\n"), attr->fname, attr->type);
378 Qmsg2(jcr, M_ERROR, 0, _("Unknown file type %d; not restored: %s\n"), attr->type, attr->fname);
379 Pmsg2(000, "Unknown file type %d; not restored: %s\n", attr->type, attr->fname);
386 * Returns: > 0 index into path where last path char is.
388 * -1 filename is zero length
390 static int separate_path_and_file(JCR *jcr, char *fname, char *ofile)
395 /* Separate pathname and filename */
396 for (q=p=f=ofile; *p; p++) {
397 if (IsPathSeparator(*p)) {
398 f = q; /* possible filename */
403 if (IsPathSeparator(*f)) {
406 *q = 0; /* terminate string */
410 /* The filename length must not be zero here because we
411 * are dealing with a file (i.e. FT_REGE or FT_REG).
413 Jmsg1(jcr, M_ERROR, 0, _("Zero length filename: %s\n"), fname);
421 * Primitive caching of path to prevent recreating a pathname
422 * each time as long as we remain in the same directory.
424 static int path_already_seen(JCR *jcr, char *path, int pnl)
426 if (!jcr->cached_path) {
427 jcr->cached_path = get_pool_memory(PM_FNAME);
429 if (jcr->cached_pnl == pnl && strcmp(path, jcr->cached_path) == 0) {
432 pm_strcpy(jcr->cached_path, path);
433 jcr->cached_pnl = pnl;