2 * Create a file, and reset the modes
4 * Kern Sibbald, November MM
10 Copyright (C) 2000-2006 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 Dmsg3(200, "type=%d newmode=%x file=%s\n", attr->type, 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_RAW: /* raw device to be written */
108 case FT_FIFO: /* FIFO to be written to */
109 case FT_LNKSAVED: /* Hard linked, file already saved */
111 case FT_SPEC: /* fifo, ... to be backed up */
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 && attr->type != FT_FIFO) {
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);
181 if ((bopen(bfd, attr->ofname, mode, S_IRUSR | S_IWUSR)) < 0) {
183 be.set_errno(bfd->berrno);
184 Qmsg2(jcr, M_ERROR, 0, _("Could not create %s: ERR=%s\n"),
185 attr->ofname, be.strerror());
190 #ifndef HAVE_WIN32 // none of these exists on MS Windows
191 case FT_RAW: /* Bacula raw device e.g. /dev/sda1 */
192 case FT_FIFO: /* Bacula fifo to save data */
194 if (S_ISFIFO(attr->statp.st_mode)) {
195 Dmsg1(200, "Restore fifo: %s\n", attr->ofname);
196 if (mkfifo(attr->ofname, attr->statp.st_mode) != 0 && errno != EEXIST) {
198 Qmsg2(jcr, M_ERROR, 0, _("Cannot make fifo %s: ERR=%s\n"),
199 attr->ofname, be.strerror());
202 } else if(S_ISSOCK(attr->statp.st_mode)) {
203 Dmsg1(200, "Skipping restore of socket: %s\n", attr->ofname);
205 Dmsg1(200, "Restore node: %s\n", attr->ofname);
206 if (mknod(attr->ofname, attr->statp.st_mode, attr->statp.st_rdev) != 0 && errno != EEXIST) {
208 Qmsg2(jcr, M_ERROR, 0, _("Cannot make node %s: ERR=%s\n"),
209 attr->ofname, be.strerror());
213 if (attr->type == FT_RAW || attr->type == FT_FIFO) {
215 Dmsg1(200, "FT_RAW|FT_FIFO %s\n", attr->ofname);
216 mode = O_WRONLY | O_BINARY;
217 /* Timeout open() in 60 seconds */
218 if (attr->type == FT_FIFO) {
219 Dmsg0(200, "Set FIFO timer\n");
220 tid = start_thread_timer(pthread_self(), 60);
225 Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid);
227 Dmsg2(200, "open %s mode=0x%x\n", attr->ofname, mode);
228 if ((bopen(bfd, attr->ofname, mode, 0)) < 0) {
230 be.set_errno(bfd->berrno);
231 Qmsg2(jcr, M_ERROR, 0, _("Could not open %s: ERR=%s\n"),
232 attr->ofname, be.strerror());
233 stop_thread_timer(tid);
236 stop_thread_timer(tid);
239 Dmsg1(200, "FT_SPEC %s\n", attr->ofname);
243 Dmsg2(130, "FT_LNK should restore: %s -> %s\n", attr->ofname, attr->olname);
244 if (symlink(attr->olname, attr->ofname) != 0 && errno != EEXIST) {
246 Qmsg3(jcr, M_ERROR, 0, _("Could not symlink %s -> %s: ERR=%s\n"),
247 attr->ofname, attr->olname, be.strerror());
252 case FT_LNKSAVED: /* Hard linked, file already saved */
253 Dmsg2(130, "Hard link %s => %s\n", attr->ofname, attr->olname);
254 if (link(attr->olname, attr->ofname) != 0) {
256 Qmsg3(jcr, M_ERROR, 0, _("Could not hard link %s -> %s: ERR=%s\n"),
257 attr->ofname, attr->olname, be.strerror());
262 } /* End inner switch */
266 Dmsg2(200, "Make dir mode=%o dir=%s\n", new_mode, attr->ofname);
267 if (make_path(jcr, attr->ofname, new_mode, parent_mode, uid, gid, 0, NULL) != 0) {
271 * If we are using the Win32 Backup API, we open the
272 * directory so that the security info will be read
275 if (!is_portable_backup(bfd)) {
277 Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid);
279 if ((bopen(bfd, attr->ofname, O_WRONLY|O_BINARY, 0)) < 0) {
281 be.set_errno(bfd->berrno);
283 /* Check for trying to create a drive, if so, skip */
284 if (attr->ofname[1] == ':' && attr->ofname[2] == '/' && attr->ofname[3] == 0) {
288 Qmsg2(jcr, M_ERROR, 0, _("Could not open %s: ERR=%s\n"),
289 attr->ofname, be.strerror());
297 /* The following should not occur */
307 Qmsg2(jcr, M_ERROR, 0, _("Original file %s not saved: type=%d\n"), attr->fname, attr->type);
310 Qmsg2(jcr, M_ERROR, 0, _("Unknown file type %d; not restored: %s\n"), attr->type, attr->fname);
317 * Returns: > 0 index into path where last path char is.
319 * -1 filename is zero length
321 static int separate_path_and_file(JCR *jcr, char *fname, char *ofile)
326 /* Separate pathname and filename */
327 for (p=f=ofile; *p; p++) {
329 f = p; /* possible filename */
338 /* The filename length must not be zero here because we
339 * are dealing with a file (i.e. FT_REGE or FT_REG).
341 Qmsg1(jcr, M_ERROR, 0, _("Zero length filename: %s\n"), fname);
349 * Primitive caching of path to prevent recreating a pathname
350 * each time as long as we remain in the same directory.
352 static int path_already_seen(JCR *jcr, char *path, int pnl)
354 if (!jcr->cached_path) {
355 jcr->cached_path = get_pool_memory(PM_FNAME);
357 if (jcr->cached_pnl == pnl && strcmp(path, jcr->cached_path) == 0) {
360 pm_strcpy(&jcr->cached_path, path);
361 jcr->cached_pnl = pnl;