Line data Source code
1 : #include "../burp.h"
2 : #include "../alloc.h"
3 : #include "../bfile.h"
4 : #include "../cmd.h"
5 : #include "../conf.h"
6 : #include "../log.h"
7 : #include "acl.h"
8 : #include "cvss.h"
9 : #include "extrameta.h"
10 : #include "xattr.h"
11 :
12 0 : int has_extrameta(const char *path, enum cmd cmd, enum protocol protocol,
13 : int enable_acl, int enable_xattr)
14 : {
15 : #if defined(WIN32_VSS)
16 : return 1;
17 : #endif
18 : // FIX THIS: extra meta not supported in protocol2
19 0 : if(protocol==PROTO_2) return 0;
20 : #if defined(HAVE_LINUX_OS) || \
21 : defined(HAVE_FREEBSD_OS) || \
22 : defined(HAVE_NETBSD_OS)
23 :
24 : #ifdef HAVE_ACL
25 0 : if(enable_acl && has_acl(path, cmd)) return 1;
26 : #endif
27 : #endif
28 : #if defined(HAVE_LINUX_OS) || \
29 : defined(HAVE_FREEBSD_OS) || \
30 : defined(HAVE_NETBSD_OS) || \
31 : defined(HAVE_DARWIN_OS)
32 : #ifdef HAVE_XATTR
33 0 : if(enable_xattr && has_xattr(path)) return 1;
34 : #endif
35 : #endif
36 0 : return 0;
37 : }
38 :
39 0 : int get_extrameta(struct asfd *asfd,
40 : BFILE *bfd,
41 : struct sbuf *sb,
42 : char **extrameta,
43 : size_t *elen,
44 : struct cntr *cntr)
45 : {
46 : #if defined (WIN32_VSS)
47 : if(get_vss(bfd, sb, extrameta, elen)) return -1;
48 : #endif
49 : // Important to do xattr directly after acl, because xattr is excluding
50 : // some entries if acls were set.
51 : #if defined(HAVE_LINUX_OS) || \
52 : defined(HAVE_FREEBSD_OS) || \
53 : defined(HAVE_NETBSD_OS)
54 : #ifdef HAVE_ACL
55 0 : if(get_acl(asfd, sb, extrameta, elen, cntr)) return -1;
56 : #endif
57 : #endif
58 : #if defined(HAVE_LINUX_OS) || \
59 : defined(HAVE_FREEBSD_OS) || \
60 : defined(HAVE_NETBSD_OS) || \
61 : defined(HAVE_DARWIN_OS)
62 : #ifdef HAVE_XATTR
63 0 : if(get_xattr(asfd, sb->path.buf, extrameta, elen, cntr)) return -1;
64 : #endif
65 : #endif
66 0 : return 0;
67 : }
68 :
69 0 : int set_extrameta(struct asfd *asfd,
70 : BFILE *bfd,
71 : const char *path,
72 : struct sbuf *sb,
73 : const char *extrameta,
74 : size_t metalen,
75 : struct cntr *cntr)
76 : {
77 0 : size_t l=0;
78 0 : char cmdtmp='\0';
79 0 : unsigned int s=0;
80 0 : const char *metadata=NULL;
81 0 : int errors=0;
82 :
83 0 : metadata=extrameta;
84 0 : l=metalen;
85 0 : while(l>0)
86 : {
87 0 : char *m=NULL;
88 0 : if((sscanf(metadata, "%c%08X", &cmdtmp, &s))!=2)
89 : {
90 : logw(asfd, cntr,
91 : "sscanf of metadata failed for %s: %s\n",
92 0 : path, metadata);
93 0 : return -1;
94 : }
95 0 : metadata+=9;
96 0 : l-=9;
97 0 : if(!(m=(char *)malloc_w(s+1, __func__)))
98 : return -1;
99 0 : memcpy(m, metadata, s);
100 0 : m[s]='\0';
101 :
102 0 : metadata+=s;
103 0 : l-=s;
104 :
105 0 : switch(cmdtmp)
106 : {
107 : #if defined(HAVE_WIN32)
108 : case META_VSS:
109 : if(set_vss(bfd, m, s)) errors++;
110 : break;
111 : #endif
112 : #if defined(HAVE_LINUX_OS) || \
113 : defined(HAVE_FREEBSD_OS) || \
114 : defined(HAVE_NETBSD_OS)
115 : #ifdef HAVE_ACL
116 : case META_ACCESS_ACL:
117 0 : if(set_acl(asfd, path, sb, m, s, cmdtmp, cntr))
118 0 : errors++;
119 : break;
120 : case META_DEFAULT_ACL:
121 0 : if(set_acl(asfd, path, sb, m, s, cmdtmp, cntr))
122 0 : errors++;
123 : break;
124 : #endif
125 : #endif
126 : #if defined(HAVE_LINUX_OS) || \
127 : defined(HAVE_DARWIN_OS)
128 : #ifdef HAVE_XATTR
129 : case META_XATTR:
130 0 : if(set_xattr(asfd,
131 0 : path, m, s, cmdtmp, cntr))
132 0 : errors++;
133 : break;
134 : #endif
135 : #endif
136 : #if defined(HAVE_FREEBSD_OS) || \
137 : defined(HAVE_NETBSD_OS)
138 : #ifdef HAVE_XATTR
139 : case META_XATTR_BSD:
140 : if(set_xattr(asfd,
141 : path, m, s, cmdtmp, cntr))
142 : errors++;
143 : break;
144 : #endif
145 : #endif
146 : default:
147 0 : logp("unknown metadata: %c\n", cmdtmp);
148 : logw(asfd, cntr,
149 0 : "unknown metadata: %c\n", cmdtmp);
150 0 : errors++;
151 0 : break;
152 :
153 : }
154 0 : free_w(&m);
155 : }
156 :
157 : return errors;
158 : }
|