*
*/
/*
- Copyright (C) 2000-2003 Kern Sibbald and John Walker
+ Copyright (C) 2000-2004 Kern Sibbald and John Walker
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
#include "bacula.h"
#include "find.h"
-#ifdef HAVE_CYGWIN
+#if defined(HAVE_CYGWIN) || defined(HAVE_WIN32)
/* Forward referenced subroutines */
-static
-int set_win32_attributes(JCR *jcr, ATTR *attr, BFILE *ofd);
+static int set_win32_attributes(JCR *jcr, ATTR *attr, BFILE *ofd);
void unix_name_to_win32(POOLMEM **win32_name, char *name);
void win_error(JCR *jcr, char *prefix, POOLMEM *ofile);
HANDLE bget_handle(BFILE *bfd);
int stream;
/* Note, no sparse option for win32_data */
- if (is_win32_backup()) {
+ if (!is_portable_backup(&ff_pkt->bfd)) {
stream = STREAM_WIN32_DATA;
ff_pkt->flags &= ~FO_SPARSE;
} else if (ff_pkt->flags & FO_SPARSE) {
*p++ = ' ';
p += to_base64((int64_t)statp->st_size, p);
*p++ = ' ';
+#ifndef HAVE_MINGW
p += to_base64((int64_t)statp->st_blksize, p);
*p++ = ' ';
p += to_base64((int64_t)statp->st_blocks, p);
*p++ = ' ';
+#else
+ p += to_base64((int64_t)0, p); /* output place holder */
+ *p++ = ' ';
+ p += to_base64((int64_t)0, p); /* output place holder */
+ *p++ = ' ';
+#endif
p += to_base64((int64_t)statp->st_atime, p);
*p++ = ' ';
p += to_base64((int64_t)statp->st_mtime, p);
p += from_base64(&val, p);
statp->st_size = val;
p++;
+#ifndef HAVE_MINGW
p += from_base64(&val, p);
statp->st_blksize = val;
p++;
p += from_base64(&val, p);
statp->st_blocks = val;
p++;
+#else
+ p += from_base64(&val, p);
+// statp->st_blksize = val;
+ p++;
+ p += from_base64(&val, p);
+// statp->st_blocks = val;
+ p++;
+#endif
p += from_base64(&val, p);
statp->st_atime = val;
p++;
return (int)val;
}
+/* Decode a LinkFI field of encoded stat packet */
+int32_t decode_LinkFI(char *buf, struct stat *statp)
+{
+ char *p = buf;
+ int64_t val;
+
+ skip_nonspaces(&p); /* st_dev */
+ p++; /* skip space */
+ skip_nonspaces(&p); /* st_ino */
+ p++;
+ p += from_base64(&val, p);
+ statp->st_mode = val; /* st_mode */
+ p++;
+ skip_nonspaces(&p); /* st_nlink */
+ p++;
+ skip_nonspaces(&p); /* st_uid */
+ p++;
+ skip_nonspaces(&p); /* st_gid */
+ p++;
+ skip_nonspaces(&p); /* st_rdev */
+ p++;
+ skip_nonspaces(&p); /* st_size */
+ p++;
+ skip_nonspaces(&p); /* st_blksize */
+ p++;
+ skip_nonspaces(&p); /* st_blocks */
+ p++;
+ skip_nonspaces(&p); /* st_atime */
+ p++;
+ skip_nonspaces(&p); /* st_mtime */
+ p++;
+ skip_nonspaces(&p); /* st_ctime */
+
+ /* Optional FileIndex of hard linked file data */
+ if (*p == ' ' || (*p != 0 && *(p+1) == ' ')) {
+ p++;
+ p += from_base64(&val, p);
+ return (int32_t)val;
+ }
+ return 0;
+}
+
/*
* Set file modes, permissions and times
*
mode_t old_mask;
int stat = 1;
-#ifdef HAVE_CYGWIN
+#if defined(HAVE_CYGWIN) || defined(HAVE_WIN32)
if (attr->stream == STREAM_UNIX_ATTRIBUTES_EX &&
set_win32_attributes(jcr, attr, ofd)) {
+ if (is_bopen(ofd)) {
+ bclose(ofd);
+ }
+ pm_strcpy(&attr->ofname, "*none*");
+ return 1;
+ }
+ if (attr->data_stream == STREAM_WIN32_DATA ||
+ attr->data_stream == STREAM_WIN32_GZIP_DATA) {
+ if (is_bopen(ofd)) {
+ bclose(ofd);
+ }
+ pm_strcpy(&attr->ofname, "*none*");
return 1;
}
+
+
/*
* If Windows stuff failed, e.g. attempt to restore Unix file
* to Windows, simply fall through and we will do it the
if (attr->type == FT_LNK) {
/* Change owner of link, not of real file */
if (lchown(attr->ofname, attr->statp.st_uid, attr->statp.st_gid) < 0) {
- Jmsg2(jcr, M_WARNING, 0, _("Unable to set file owner %s: ERR=%s\n"),
+ Jmsg2(jcr, M_ERROR, 0, _("Unable to set file owner %s: ERR=%s\n"),
attr->ofname, strerror(errno));
stat = 0;
}
} else {
if (chown(attr->ofname, attr->statp.st_uid, attr->statp.st_gid) < 0) {
- Jmsg2(jcr, M_WARNING, 0, _("Unable to set file owner %s: ERR=%s\n"),
+ Jmsg2(jcr, M_ERROR, 0, _("Unable to set file owner %s: ERR=%s\n"),
attr->ofname, strerror(errno));
stat = 0;
}
if (chmod(attr->ofname, attr->statp.st_mode) < 0) {
- Jmsg2(jcr, M_WARNING, 0, _("Unable to set file modes %s: ERR=%s\n"),
+ Jmsg2(jcr, M_ERROR, 0, _("Unable to set file modes %s: ERR=%s\n"),
attr->ofname, strerror(errno));
stat = 0;
}
/* FreeBSD user flags */
#ifdef HAVE_CHFLAGS
if (chflags(attr->ofname, attr->statp.st_flags) < 0) {
- Jmsg2(jcr, M_WARNING, 0, _("Unable to set file flags %s: ERR=%s\n"),
+ Jmsg2(jcr, M_ERROR, 0, _("Unable to set file flags %s: ERR=%s\n"),
attr->ofname, strerror(errno));
stat = 0;
}
stat = 0;
}
}
+ pm_strcpy(&attr->ofname, "*none*");
umask(old_mask);
return stat;
}
/* */
/*=============================================================*/
-#ifndef HAVE_CYGWIN
+#if !defined(HAVE_CYGWIN) && !defined(HAVE_WIN32)
/*
* It is possible to piggyback additional data e.g. ACLs on
/* */
/*=============================================================*/
-#ifdef HAVE_CYGWIN
+#if defined(HAVE_CYGWIN) || defined(HAVE_WIN32)
int encode_attribsEx(JCR *jcr, char *attribsEx, FF_PKT *ff_pkt)
{
attribsEx[0] = 0; /* no extended attributes */
- if (!p_GetFileAttributesEx) {
+ if (!p_GetFileAttributesEx) {
return STREAM_UNIX_ATTRIBUTES;
}
* Returns: 1 on success
* 0 on failure
*/
-static
-int set_win32_attributes(JCR *jcr, ATTR *attr, BFILE *ofd)
+static int set_win32_attributes(JCR *jcr, ATTR *attr, BFILE *ofd)
{
char *p = attr->attrEx;
int64_t val;
ULARGE_INTEGER li;
POOLMEM *win32_ofile;
+ if (!p_GetFileAttributesEx) {
+ return 0;
+ }
+
if (!p || !*p) { /* we should have attributes */
Dmsg2(100, "Attributes missing. of=%s ofd=%d\n", attr->ofname, ofd->fid);
if (is_bopen(ofd)) {
/* At this point, we have reconstructed the WIN32_FILE_ATTRIBUTE_DATA pkt */
-
if (!is_bopen(ofd)) {
Dmsg1(100, "File not open: %s\n", attr->ofname);
bopen(ofd, attr->ofname, O_WRONLY|O_BINARY, 0); /* attempt to open the file */
NULL);
Dmsg3(100, "Error in %s on file %s: ERR=%s\n", prefix, win32_ofile, msg);
strip_trailing_junk(msg);
- Jmsg(jcr, M_INFO, 0, _("Error in %s file %s: ERR=%s\n"), prefix, win32_ofile, msg);
+ Jmsg(jcr, M_ERROR, 0, _("Error in %s file %s: ERR=%s\n"), prefix, win32_ofile, msg);
LocalFree(msg);
}
NULL);
strip_trailing_junk(msg);
if (jcr) {
- Jmsg2(jcr, M_INFO, 0, _("Error in %s: ERR=%s\n"), prefix, msg);
+ Jmsg2(jcr, M_ERROR, 0, _("Error in %s: ERR=%s\n"), prefix, msg);
} else {
MessageBox(NULL, msg, prefix, MB_OK);
}