#endif
static int separate_path_and_file(JCR *jcr, char *fname, char *ofile);
-static int path_already_seen(char *path, int pnl);
+static int path_already_seen(JCR *jcr, char *path, int pnl);
/*
* files.
*
*/
-int create_file(JCR *jcr, ATTR *attr, BFILE *ofd, int replace)
+int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
{
int new_mode, parent_mode, mode;
uid_t uid;
bool exists = false;
struct stat mstatp;
- binit(ofd);
+ if (is_win32_stream(attr->data_stream)) {
+ set_win32_backup(bfd);
+ } else {
+ set_portable_backup(bfd);
+ }
+
new_mode = attr->statp.st_mode;
Dmsg2(300, "newmode=%x file=%s\n", new_mode, attr->ofname);
parent_mode = S_IWUSR | S_IXUSR | new_mode;
savechr = attr->ofname[pnl];
attr->ofname[pnl] = 0; /* terminate path */
- if (!path_already_seen(attr->ofname, pnl)) {
+ if (!path_already_seen(jcr, attr->ofname, pnl)) {
Dmsg1(50, "Make path %s\n", attr->ofname);
/*
* If we need to make the directory, ensure that it is with
* exists. Normally, this should do nothing.
*/
if (make_path(jcr, attr->ofname, parent_mode, parent_mode, uid, gid, 1, NULL) != 0) {
- Dmsg1(0, "Could not make path. %s\n", attr->ofname);
+ Dmsg1(10, "Could not make path. %s\n", attr->ofname);
+ attr->ofname[pnl] = savechr; /* restore full name */
return CF_ERROR;
}
}
mode |= O_CTG; /* set contiguous bit if needed */
}
Dmsg1(50, "Create file: %s\n", attr->ofname);
- if ((bopen(ofd, attr->ofname, mode, S_IRUSR | S_IWUSR)) < 0) {
+ if (is_bopen(bfd)) {
+ Jmsg1(jcr, M_ERROR, 0, "bpkt already open fid=%d\n", bfd->fid);
+ }
+ if ((bopen(bfd, attr->ofname, mode, S_IRUSR | S_IWUSR)) < 0) {
Jmsg2(jcr, M_ERROR, 0, _("Could not create %s: ERR=%s\n"),
- attr->ofname, berror(ofd));
+ attr->ofname, berror(bfd));
return CF_ERROR;
}
return CF_EXTRACT;
} else {
tid = NULL;
}
- if ((bopen(ofd, attr->ofname, mode, 0)) < 0) {
+ if (is_bopen(bfd)) {
+ Jmsg1(jcr, M_ERROR, 0, "bpkt already open fid=%d\n", bfd->fid);
+ }
+ if ((bopen(bfd, attr->ofname, mode, 0)) < 0) {
Jmsg2(jcr, M_ERROR, 0, _("Could not open %s: ERR=%s\n"),
- attr->ofname, berror(ofd));
+ attr->ofname, berror(bfd));
stop_thread_timer(tid);
return CF_ERROR;
}
* directory so that the security info will be read
* and saved.
*/
- if (is_win32_backup()) {
- if ((bopen(ofd, attr->ofname, O_WRONLY|O_BINARY, 0)) < 0) {
+ if (!is_portable_backup(bfd)) {
+ if (is_bopen(bfd)) {
+ Jmsg1(jcr, M_ERROR, 0, "bpkt already open fid=%d\n", bfd->fid);
+ }
+ if ((bopen(bfd, attr->ofname, O_WRONLY|O_BINARY, 0)) < 0) {
Jmsg2(jcr, M_ERROR, 0, _("Could not open %s: ERR=%s\n"),
- attr->ofname, berror(ofd));
+ attr->ofname, berror(bfd));
return CF_ERROR;
}
return CF_EXTRACT;
return pnl;
}
-static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
-
/*
* Primitive caching of path to prevent recreating a pathname
* each time as long as we remain in the same directory.
*/
-static int path_already_seen(char *path, int pnl)
+static int path_already_seen(JCR *jcr, char *path, int pnl)
{
- static int cached_pnl = 0;
- static char cached_path[1000];
-
- P(mutex);
- if (cached_pnl == pnl && strcmp(path, cached_path) == 0) {
- V(mutex);
- return 1;
+ if (!jcr->cached_path) {
+ jcr->cached_path = get_pool_memory(PM_FNAME);
}
- if (pnl < (int)(sizeof(cached_path)-1)) {
- strcpy(cached_path, path);
- cached_pnl = pnl;
+ if (jcr->cached_pnl == pnl && strcmp(path, jcr->cached_path) == 0) {
+ return 1;
}
- V(mutex);
+ pm_strcpy(&jcr->cached_path, path);
+ jcr->cached_pnl = pnl;
return 0;
}