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) {
292 Qmsg3(jcr, M_ERROR, 0, _("Could not hard link %s -> %s: ERR=%s\n"),
293 attr->ofname, attr->olname, be.strerror());
298 } /* End inner switch */
302 Dmsg2(200, "Make dir mode=%o dir=%s\n", new_mode, attr->ofname);
303 if (make_path(jcr, attr->ofname, new_mode, parent_mode, uid, gid, 0, NULL) != 0) {
307 * If we are using the Win32 Backup API, we open the
308 * directory so that the security info will be read
311 if (!is_portable_backup(bfd)) {
313 Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid);
315 if ((bopen(bfd, attr->ofname, O_WRONLY|O_BINARY, 0)) < 0) {
317 be.set_errno(bfd->berrno);
319 /* Check for trying to create a drive, if so, skip */
320 if (attr->ofname[1] == ':' &&
321 IsPathSeparator(attr->ofname[2]) &&
322 attr->ofname[3] == '\0') {
326 Qmsg2(jcr, M_ERROR, 0, _("Could not open %s: ERR=%s\n"),
327 attr->ofname, be.strerror());
335 /* The following should not occur */
345 Qmsg2(jcr, M_ERROR, 0, _("Original file %s not saved: type=%d\n"), attr->fname, attr->type);
348 Qmsg2(jcr, M_ERROR, 0, _("Unknown file type %d; not restored: %s\n"), attr->type, attr->fname);
355 * Returns: > 0 index into path where last path char is.
357 * -1 filename is zero length
359 static int separate_path_and_file(JCR *jcr, char *fname, char *ofile)
364 /* Separate pathname and filename */
365 for (q=p=f=ofile; *p; p++) {
367 if (IsPathSeparator(*p)) {
369 if (IsPathSeparator(p[1])) {
373 *q++ = *p; /* copy data */
375 if (IsPathSeparator(*p)) {
376 f = q; /* possible filename */
382 if (IsPathSeparator(*f)) {
385 *q = 0; /* terminate string */
389 /* The filename length must not be zero here because we
390 * are dealing with a file (i.e. FT_REGE or FT_REG).
392 Jmsg1(jcr, M_ERROR, 0, _("Zero length filename: %s\n"), fname);
400 * Primitive caching of path to prevent recreating a pathname
401 * each time as long as we remain in the same directory.
403 static int path_already_seen(JCR *jcr, char *path, int pnl)
405 if (!jcr->cached_path) {
406 jcr->cached_path = get_pool_memory(PM_FNAME);
408 if (jcr->cached_pnl == pnl && strcmp(path, jcr->cached_path) == 0) {
411 pm_strcpy(jcr->cached_path, path);
412 jcr->cached_pnl = pnl;