2 * Create a file, and reset the modes
4 * Kern Sibbald, November MM
10 Copyright (C) 2000-2005 Kern Sibbald
12 This program is free software; you can redistribute it and/or
13 modify it under the terms of the GNU General Public License
14 version 2 as amended with additional clauses defined in the
15 file LICENSE in the main source directory.
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 the file LICENSE for additional details.
28 #define S_IRWXUGO (S_IRWXU | S_IRWXG | S_IRWXO)
36 static int separate_path_and_file(JCR *jcr, char *fname, char *ofile);
37 static int path_already_seen(JCR *jcr, char *path, int pnl);
41 * Create the file, or the directory
43 * fname is the original filename
44 * ofile is the output filename (may be in a different directory)
46 * Returns: CF_SKIP if file should be skipped
48 * CF_EXTRACT file created and data to restore
49 * CF_CREATED file created no data to restore
51 * Note, we create the file here, except for special files,
52 * we do not set the attributes because we want to first
53 * write the file, then when the writing is done, set the
55 * So, we return with the file descriptor open for normal
59 int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
61 int new_mode, parent_mode, mode;
68 if (is_win32_stream(attr->data_stream)) {
69 set_win32_backup(bfd);
71 set_portable_backup(bfd);
74 new_mode = attr->statp.st_mode;
75 Dmsg2(300, "newmode=%x file=%s\n", new_mode, attr->ofname);
76 parent_mode = S_IWUSR | S_IXUSR | new_mode;
77 gid = attr->statp.st_gid;
78 uid = attr->statp.st_uid;
80 Dmsg2(400, "Replace=%c %d\n", (char)replace, replace);
81 if (lstat(attr->ofname, &mstatp) == 0) {
85 if (attr->statp.st_mtime <= mstatp.st_mtime) {
86 Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Not newer: %s\n"), attr->ofname);
92 if (attr->statp.st_mtime >= mstatp.st_mtime) {
93 Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Not older: %s\n"), attr->ofname);
99 Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Already exists: %s\n"), attr->ofname);
106 switch (attr->type) {
107 case FT_LNKSAVED: /* Hard linked, file already saved */
112 case FT_REGE: /* empty file */
113 case FT_REG: /* regular file */
115 * Note, we do not delete FT_RAW because these are device files
116 * or FIFOs that should already exist. If we blow it away,
117 * we may blow away a FIFO that is being used to read the
118 * restore data, or we may blow away a partition definition.
120 if (exists && attr->type != FT_RAW) {
121 /* Get rid of old copy */
122 if (unlink(attr->ofname) == -1) {
124 Qmsg(jcr, M_ERROR, 0, _("File %s already exists and could not be replaced. ERR=%s.\n"),
125 attr->ofname, be.strerror());
126 /* Continue despite error */
130 * Here we do some preliminary work for all the above
131 * types to create the path to the file if it does
132 * not already exist. Below, we will split to
133 * do the file type specific work
135 pnl = separate_path_and_file(jcr, attr->fname, attr->ofname);
141 * If path length is <= 0 we are making a file in the root
142 * directory. Assume that the directory already exists.
146 savechr = attr->ofname[pnl];
147 attr->ofname[pnl] = 0; /* terminate path */
149 if (!path_already_seen(jcr, attr->ofname, pnl)) {
150 Dmsg1(100, "Make path %s\n", attr->ofname);
152 * If we need to make the directory, ensure that it is with
153 * execute bit set (i.e. parent_mode), and preserve what already
154 * exists. Normally, this should do nothing.
156 if (make_path(jcr, attr->ofname, parent_mode, parent_mode, uid, gid, 1, NULL) != 0) {
157 Dmsg1(10, "Could not make path. %s\n", attr->ofname);
158 attr->ofname[pnl] = savechr; /* restore full name */
162 attr->ofname[pnl] = savechr; /* restore full name */
165 /* Now we do the specific work for each file type */
169 Dmsg1(100, "Create file %s\n", attr->ofname);
170 mode = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY; /* O_NOFOLLOW; */
171 if (IS_CTG(attr->statp.st_mode)) {
172 mode |= O_CTG; /* set contiguous bit if needed */
174 Dmsg1(50, "Create file: %s\n", attr->ofname);
176 Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid);
180 * If the open fails, we attempt to cd into the directory
181 * and create the file with a relative path rather than
182 * the full absolute path. This is for Win32 where
183 * path names may be too long to create.
185 if ((bopen(bfd, attr->ofname, mode, S_IRUSR | S_IWUSR)) < 0) {
188 Dmsg2(000, "bopen failed errno=%d: ERR=%s\n", bfd->berrno,
189 be.strerror(bfd->berrno));
190 if (strlen(attr->ofname) > 250) { /* Microsoft limitation */
193 struct saved_cwd cwd;
194 savechr = attr->ofname[pnl];
195 attr->ofname[pnl] = 0; /* terminate path */
196 Dmsg1(000, "Do chdir %s\n", attr->ofname);
197 if (save_cwd(&cwd) != 0) {
198 Qmsg0(jcr, M_ERROR, 0, _("Could not save_dirn"));
199 attr->ofname[pnl] = savechr;
203 while ((e = strchr(p, '/'))) {
207 Qmsg2(jcr, M_ERROR, 0, _("Could not chdir to %s: ERR=%s\n"),
208 attr->ofname, be.strerror());
209 restore_cwd(&cwd, NULL, NULL);
211 attr->ofname[pnl] = savechr;
220 Qmsg2(jcr, M_ERROR, 0, _("Could not chdir to %s: ERR=%s\n"),
221 attr->ofname, be.strerror());
222 restore_cwd(&cwd, NULL, NULL);
224 attr->ofname[pnl] = savechr;
227 attr->ofname[pnl] = savechr;
228 Dmsg1(000, "Do open %s\n", &attr->ofname[pnl+1]);
229 if ((bopen(bfd, &attr->ofname[pnl+1], mode, S_IRUSR | S_IWUSR)) < 0) {
234 restore_cwd(&cwd, NULL, NULL);
236 if (stat == CF_EXTRACT) {
240 Qmsg2(jcr, M_ERROR, 0, _("Could not create %s: ERR=%s\n"),
241 attr->ofname, be.strerror(bfd->berrno));
245 #ifndef HAVE_WIN32 // none of these exists on MS Windows
246 case FT_RAW: /* Bacula raw device e.g. /dev/sda1 */
247 case FT_FIFO: /* Bacula fifo to save data */
249 if (S_ISFIFO(attr->statp.st_mode)) {
250 Dmsg1(200, "Restore fifo: %s\n", attr->ofname);
251 if (mkfifo(attr->ofname, attr->statp.st_mode) != 0 && errno != EEXIST) {
253 Qmsg2(jcr, M_ERROR, 0, _("Cannot make fifo %s: ERR=%s\n"),
254 attr->ofname, be.strerror());
257 } else if(S_ISSOCK(attr->statp.st_mode)) {
258 Dmsg1(200, "Skipping restore of socket: %s\n", attr->ofname);
260 Dmsg1(200, "Restore node: %s\n", attr->ofname);
261 if (mknod(attr->ofname, attr->statp.st_mode, attr->statp.st_rdev) != 0 && errno != EEXIST) {
263 Qmsg2(jcr, M_ERROR, 0, _("Cannot make node %s: ERR=%s\n"),
264 attr->ofname, be.strerror());
268 if (attr->type == FT_RAW || attr->type == FT_FIFO) {
270 Dmsg1(200, "FT_RAW|FT_FIFO %s\n", attr->ofname);
271 mode = O_WRONLY | O_BINARY;
272 /* Timeout open() in 60 seconds */
273 if (attr->type == FT_FIFO) {
274 tid = start_thread_timer(pthread_self(), 60);
279 Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid);
281 if ((bopen(bfd, attr->ofname, mode, 0)) < 0) {
283 be.set_errno(bfd->berrno);
284 Qmsg2(jcr, M_ERROR, 0, _("Could not open %s: ERR=%s\n"),
285 attr->ofname, be.strerror());
286 stop_thread_timer(tid);
289 stop_thread_timer(tid);
292 Dmsg1(200, "FT_SPEC %s\n", attr->ofname);
296 Dmsg2(130, "FT_LNK should restore: %s -> %s\n", attr->ofname, attr->olname);
297 if (symlink(attr->olname, attr->ofname) != 0 && errno != EEXIST) {
299 Qmsg3(jcr, M_ERROR, 0, _("Could not symlink %s -> %s: ERR=%s\n"),
300 attr->ofname, attr->olname, be.strerror());
305 case FT_LNKSAVED: /* Hard linked, file already saved */
306 Dmsg2(130, "Hard link %s => %s\n", attr->ofname, attr->olname);
307 if (link(attr->olname, attr->ofname) != 0) {
309 Qmsg3(jcr, M_ERROR, 0, _("Could not hard link %s -> %s: ERR=%s\n"),
310 attr->ofname, attr->olname, be.strerror());
315 } /* End inner switch */
319 Dmsg2(200, "Make dir mode=%o dir=%s\n", new_mode, attr->ofname);
320 if (make_path(jcr, attr->ofname, new_mode, parent_mode, uid, gid, 0, NULL) != 0) {
324 * If we are using the Win32 Backup API, we open the
325 * directory so that the security info will be read
328 if (!is_portable_backup(bfd)) {
330 Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid);
332 if ((bopen(bfd, attr->ofname, O_WRONLY|O_BINARY, 0)) < 0) {
334 be.set_errno(bfd->berrno);
336 /* Check for trying to create a drive, if so, skip */
337 if (attr->ofname[1] == ':' && attr->ofname[2] == '/' && attr->ofname[3] == 0) {
341 Qmsg2(jcr, M_ERROR, 0, _("Could not open %s: ERR=%s\n"),
342 attr->ofname, be.strerror());
350 /* The following should not occur */
360 Qmsg2(jcr, M_ERROR, 0, _("Original file %s not saved: type=%d\n"), attr->fname, attr->type);
363 Qmsg2(jcr, M_ERROR, 0, _("Unknown file type %d; not restored: %s\n"), attr->type, attr->fname);
370 * Returns: > 0 index into path where last path char is.
372 * -1 filename is zero length
374 static int separate_path_and_file(JCR *jcr, char *fname, char *ofile)
379 /* Separate pathname and filename */
380 for (p=f=ofile; *p; p++) {
382 f = p; /* possible filename */
391 /* The filename length must not be zero here because we
392 * are dealing with a file (i.e. FT_REGE or FT_REG).
394 Qmsg1(jcr, M_ERROR, 0, _("Zero length filename: %s\n"), fname);
402 * Primitive caching of path to prevent recreating a pathname
403 * each time as long as we remain in the same directory.
405 static int path_already_seen(JCR *jcr, char *path, int pnl)
407 if (!jcr->cached_path) {
408 jcr->cached_path = get_pool_memory(PM_FNAME);
410 if (jcr->cached_pnl == pnl && strcmp(path, jcr->cached_path) == 0) {
413 pm_strcpy(&jcr->cached_path, path);
414 jcr->cached_pnl = pnl;