]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/findlib/attribs.c
Update doc
[bacula/bacula] / bacula / src / findlib / attribs.c
index 9e192c0d01afc5e8c47bf1ea3826c743e035adba..d73622e8219021ec98032db14a641b5cfd7b291f 100755 (executable)
@@ -9,7 +9,7 @@
  *
  */
 /*
-   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
@@ -31,7 +31,7 @@
 #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);
@@ -117,10 +117,17 @@ void encode_stat(char *buf, FF_PKT *ff_pkt, int data_stream)
    *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);
@@ -174,12 +181,21 @@ int decode_stat(char *buf, struct stat *statp, int32_t *LinkFI)
    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++;
@@ -220,6 +236,48 @@ int decode_stat(char *buf, struct stat *statp, int32_t *LinkFI)
    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
  *
@@ -235,22 +293,25 @@ int set_attributes(JCR *jcr, ATTR *attr, BFILE *ofd)
    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 (attr->stream == STREAM_UNIX_ATTRIBUTES_EX &&
-       set_win32_attributes(jcr, attr, ofd)) {
-      if (is_bopen(ofd)) {
-        bclose(ofd); 
-      }
-      return 1;
-   }
+
    /*
     * If Windows stuff failed, e.g. attempt to restore Unix file
     *  to Windows, simply fall through and we will do it the    
@@ -307,6 +368,7 @@ int set_attributes(JCR *jcr, ATTR *attr, BFILE *ofd)
         stat = 0;
       }
    }
+   pm_strcpy(&attr->ofname, "*none*");
    umask(old_mask);
    return stat;
 }
@@ -318,7 +380,7 @@ int set_attributes(JCR *jcr, ATTR *attr, BFILE *ofd)
 /*                                                            */
 /*=============================================================*/
 
-#ifndef HAVE_CYGWIN
+#if !defined(HAVE_CYGWIN) && !defined(HAVE_WIN32)
     
 /*
  * It is possible to piggyback additional data e.g. ACLs on
@@ -345,7 +407,7 @@ int encode_attribsEx(JCR *jcr, char *attribsEx, FF_PKT *ff_pkt)
 /*                                                            */
 /*=============================================================*/
 
-#ifdef HAVE_CYGWIN
+#if defined(HAVE_CYGWIN) || defined(HAVE_WIN32)
 
 int encode_attribsEx(JCR *jcr, char *attribsEx, FF_PKT *ff_pkt)
 {
@@ -416,6 +478,10 @@ static int set_win32_attributes(JCR *jcr, ATTR *attr, BFILE *ofd)
    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)) {
@@ -498,7 +564,7 @@ void win_error(JCR *jcr, char *prefix, POOLMEM *win32_ofile)
                 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);
 }
 
@@ -515,7 +581,7 @@ void win_error(JCR *jcr, char *prefix, DWORD lerror)
                 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);
    }