2 Bacula® - The Network Backup Solution
4 Copyright (C) 2000-2007 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 two of the GNU General Public
10 License as published by the Free Software Foundation plus additions
11 that are listed in the file LICENSE.
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 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 John Walker.
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
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 Dmsg1(400, "unlink %s\n", attr->ofname);
159 if (unlink(attr->ofname) == -1) {
161 Qmsg(jcr, M_ERROR, 0, _("File %s already exists and could not be replaced. ERR=%s.\n"),
162 attr->ofname, be.bstrerror());
163 /* Continue despite error */
167 * Here we do some preliminary work for all the above
168 * types to create the path to the file if it does
169 * not already exist. Below, we will split to
170 * do the file type specific work
172 pnl = separate_path_and_file(jcr, attr->fname, attr->ofname);
178 * If path length is <= 0 we are making a file in the root
179 * directory. Assume that the directory already exists.
183 savechr = attr->ofname[pnl];
184 attr->ofname[pnl] = 0; /* terminate path */
186 if (!path_already_seen(jcr, attr->ofname, pnl)) {
187 Dmsg1(400, "Make path %s\n", attr->ofname);
189 * If we need to make the directory, ensure that it is with
190 * execute bit set (i.e. parent_mode), and preserve what already
191 * exists. Normally, this should do nothing.
193 if (make_path(jcr, attr->ofname, parent_mode, parent_mode, uid, gid, 1, NULL) != 0) {
194 Dmsg1(10, "Could not make path. %s\n", attr->ofname);
195 attr->ofname[pnl] = savechr; /* restore full name */
199 attr->ofname[pnl] = savechr; /* restore full name */
202 /* Now we do the specific work for each file type */
206 Dmsg1(100, "Create file %s\n", attr->ofname);
207 mode = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY; /* O_NOFOLLOW; */
208 if (IS_CTG(attr->statp.st_mode)) {
209 mode |= O_CTG; /* set contiguous bit if needed */
211 Dmsg1(50, "Create file: %s\n", attr->ofname);
213 Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid);
218 if ((bopen(bfd, attr->ofname, mode, S_IRUSR | S_IWUSR)) < 0) {
220 be.set_errno(bfd->berrno);
221 Qmsg2(jcr, M_ERROR, 0, _("Could not create %s: ERR=%s\n"),
222 attr->ofname, be.bstrerror());
227 #ifndef HAVE_WIN32 // none of these exists on MS Windows
228 case FT_RAW: /* Bacula raw device e.g. /dev/sda1 */
229 case FT_FIFO: /* Bacula fifo to save data */
231 if (S_ISFIFO(attr->statp.st_mode)) {
232 Dmsg1(400, "Restore fifo: %s\n", attr->ofname);
233 if (mkfifo(attr->ofname, attr->statp.st_mode) != 0 && errno != EEXIST) {
235 Qmsg2(jcr, M_ERROR, 0, _("Cannot make fifo %s: ERR=%s\n"),
236 attr->ofname, be.bstrerror());
239 } else if (S_ISSOCK(attr->statp.st_mode)) {
240 Dmsg1(200, "Skipping restore of socket: %s\n", attr->ofname);
241 #ifdef S_IFDOOR // Solaris high speed RPC mechanism
242 } else if (S_ISDOOR(attr->statp.st_mode)) {
243 Dmsg1(200, "Skipping restore of door file: %s\n", attr->ofname);
245 #ifdef S_IFPORT // Solaris event port for handling AIO
246 } else if (S_ISPORT(attr->statp.st_mode)) {
247 Dmsg1(200, "Skipping restore of event port file: %s\n", attr->ofname);
250 Dmsg1(400, "Restore node: %s\n", attr->ofname);
251 if (mknod(attr->ofname, attr->statp.st_mode, attr->statp.st_rdev) != 0 && errno != EEXIST) {
253 Qmsg2(jcr, M_ERROR, 0, _("Cannot make node %s: ERR=%s\n"),
254 attr->ofname, be.bstrerror());
259 * Here we are going to attempt to restore to a FIFO, which
260 * means that the FIFO must already exist, AND there must
261 * be some process already attempting to read from the
262 * FIFO, so we open it write-only.
264 if (attr->type == FT_RAW || attr->type == FT_FIFO) {
266 Dmsg1(400, "FT_RAW|FT_FIFO %s\n", attr->ofname);
267 mode = O_WRONLY | O_BINARY;
268 /* Timeout open() in 60 seconds */
269 if (attr->type == FT_FIFO) {
270 Dmsg0(400, "Set FIFO timer\n");
271 tid = start_thread_timer(pthread_self(), 60);
276 Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid);
278 Dmsg2(400, "open %s mode=0x%x\n", attr->ofname, mode);
279 if ((bopen(bfd, attr->ofname, mode, 0)) < 0) {
281 be.set_errno(bfd->berrno);
282 Qmsg2(jcr, M_ERROR, 0, _("Could not open %s: ERR=%s\n"),
283 attr->ofname, be.bstrerror());
284 Dmsg2(400, "Could not open %s: ERR=%s\n", attr->ofname, be.bstrerror());
285 stop_thread_timer(tid);
288 stop_thread_timer(tid);
291 Dmsg1(400, "FT_SPEC %s\n", attr->ofname);
295 Dmsg2(130, "FT_LNK should restore: %s -> %s\n", attr->ofname, attr->olname);
296 if (symlink(attr->olname, attr->ofname) != 0 && errno != EEXIST) {
298 Qmsg3(jcr, M_ERROR, 0, _("Could not symlink %s -> %s: ERR=%s\n"),
299 attr->ofname, attr->olname, be.bstrerror());
304 case FT_LNKSAVED: /* Hard linked, file already saved */
305 Dmsg2(130, "Hard link %s => %s\n", attr->ofname, attr->olname);
306 if (link(attr->olname, attr->ofname) != 0) {
312 * If using BSD user flags, maybe has a file flag
313 * preventing this. So attempt to disable, retry link,
315 * Note that BSD securelevel may prevent disabling flag.
318 if (stat(attr->olname, &s) == 0 && s.st_flags != 0) {
319 if (chflags(attr->olname, 0) == 0) {
320 if (link(attr->olname, attr->ofname) != 0) {
321 /* restore original file flags even when linking failed */
322 if (chflags(attr->olname, s.st_flags) < 0) {
323 Qmsg2(jcr, M_ERROR, 0, _("Could not restore file flags for file %s: ERR=%s\n"),
324 attr->olname, be.bstrerror());
326 #endif /* HAVE_CHFLAGS */
327 Qmsg3(jcr, M_ERROR, 0, _("Could not hard link %s -> %s: ERR=%s\n"),
328 attr->ofname, attr->olname, be.bstrerror());
332 /* finally restore original file flags */
333 if (chflags(attr->olname, s.st_flags) < 0) {
334 Qmsg2(jcr, M_ERROR, 0, _("Could not restore file flags for file %s: ERR=%s\n"),
335 attr->olname, be.bstrerror());
338 Qmsg2(jcr, M_ERROR, 0, _("Could not reset file flags for file %s: ERR=%s\n"),
339 attr->olname, be.bstrerror());
342 Qmsg3(jcr, M_ERROR, 0, _("Could not hard link %s -> %s: ERR=%s\n"),
343 attr->ofname, attr->olname, be.bstrerror());
346 #endif /* HAVE_CHFLAGS */
351 } /* End inner switch */
355 Dmsg2(200, "Make dir mode=%o dir=%s\n", new_mode, attr->ofname);
356 if (make_path(jcr, attr->ofname, new_mode, parent_mode, uid, gid, 0, NULL) != 0) {
360 * If we are using the Win32 Backup API, we open the
361 * directory so that the security info will be read
364 if (!is_portable_backup(bfd)) {
366 Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid);
368 if ((bopen(bfd, attr->ofname, O_WRONLY|O_BINARY, 0)) < 0) {
370 be.set_errno(bfd->berrno);
372 /* Check for trying to create a drive, if so, skip */
373 if (attr->ofname[1] == ':' &&
374 IsPathSeparator(attr->ofname[2]) &&
375 attr->ofname[3] == '\0') {
379 Qmsg2(jcr, M_ERROR, 0, _("Could not open %s: ERR=%s\n"),
380 attr->ofname, be.bstrerror());
388 /* The following should not occur */
398 Qmsg2(jcr, M_ERROR, 0, _("Original file %s not saved: type=%d\n"), attr->fname, attr->type);
401 Qmsg2(jcr, M_ERROR, 0, _("Unknown file type %d; not restored: %s\n"), attr->type, attr->fname);
408 * Returns: > 0 index into path where last path char is.
410 * -1 filename is zero length
412 static int separate_path_and_file(JCR *jcr, char *fname, char *ofile)
417 /* Separate pathname and filename */
418 for (q=p=f=ofile; *p; p++) {
420 if (IsPathSeparator(*p)) {
422 if (IsPathSeparator(p[1])) {
426 *q++ = *p; /* copy data */
428 if (IsPathSeparator(*p)) {
429 f = q; /* possible filename */
435 if (IsPathSeparator(*f)) {
438 *q = 0; /* terminate string */
442 /* The filename length must not be zero here because we
443 * are dealing with a file (i.e. FT_REGE or FT_REG).
445 Jmsg1(jcr, M_ERROR, 0, _("Zero length filename: %s\n"), fname);
453 * Primitive caching of path to prevent recreating a pathname
454 * each time as long as we remain in the same directory.
456 static int path_already_seen(JCR *jcr, char *path, int pnl)
458 if (!jcr->cached_path) {
459 jcr->cached_path = get_pool_memory(PM_FNAME);
461 if (jcr->cached_pnl == pnl && strcmp(path, jcr->cached_path) == 0) {
464 pm_strcpy(jcr->cached_path, path);
465 jcr->cached_pnl = pnl;