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