]>
git.proxmox.com Git - ceph.git/blob - ceph/src/common/xattr.c
2 * Ceph - scalable distributed file system
4 * Copyright (C) 2011 Stanislav Sedov <stas@FreeBSD.org>
6 * This is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License version 2.1, as published by the Free Software
9 * Foundation. See file COPYING.
12 #if defined(__FreeBSD__)
17 #include <sys/types.h>
18 #include <sys/extattr.h>
19 #elif defined(__linux__)
20 #include <sys/types.h>
21 #include <sys/xattr.h>
23 #include <sys/xattr.h>
25 #error "Your system is not supported!"
28 #include "common/xattr.h"
31 * Sets extended attribute on a file.
32 * Returns 0 on success, -1 on failure.
35 ceph_os_setxattr(const char *path
, const char *name
,
36 const void *value
, size_t size
)
40 #if defined(__FreeBSD__)
41 error
= extattr_set_file(path
, EXTATTR_NAMESPACE_USER
, name
, value
,
45 #elif defined(__linux__)
46 error
= setxattr(path
, name
, value
, size
, 0);
48 error
= setxattr(path
, name
, value
, size
, 0 /* position */, 0);
55 ceph_os_fsetxattr(int fd
, const char *name
, const void *value
,
60 #if defined(__FreeBSD__)
61 error
= extattr_set_fd(fd
, EXTATTR_NAMESPACE_USER
, name
, value
, size
);
64 #elif defined(__linux__)
65 error
= fsetxattr(fd
, name
, value
, size
, 0);
67 error
= fsetxattr(fd
, name
, value
, size
, 0, 0 /* no options should be indentical to Linux */ );
74 ceph_os_getxattr(const char *path
, const char *name
,
75 void *value
, size_t size
)
79 #if defined(__FreeBSD__)
80 if (value
== NULL
|| size
== 0) {
81 error
= extattr_get_file(path
, EXTATTR_NAMESPACE_USER
, name
, value
,
84 error
= extattr_get_file(path
, EXTATTR_NAMESPACE_USER
, name
, NULL
,
91 error
= extattr_get_file(path
, EXTATTR_NAMESPACE_USER
,
96 #elif defined(__linux__)
97 error
= getxattr(path
, name
, value
, size
);
99 error
= getxattr(path
, name
, value
, size
, 0 /* position */, 0);
100 /* ENOATTR and ENODATA have different values */
101 if (error
< 0 && errno
== ENOATTR
)
109 ceph_os_fgetxattr(int fd
, const char *name
, void *value
,
114 #if defined(__FreeBSD__)
115 if (value
== NULL
|| size
== 0) {
116 error
= extattr_get_fd(fd
, EXTATTR_NAMESPACE_USER
, name
, value
,
119 error
= extattr_get_fd(fd
, EXTATTR_NAMESPACE_USER
, name
, NULL
,
126 error
= extattr_get_fd(fd
, EXTATTR_NAMESPACE_USER
,
131 #elif defined(__linux__)
132 error
= fgetxattr(fd
, name
, value
, size
);
133 #elif defined(DARWIN)
134 error
= fgetxattr(fd
, name
, value
, size
, 0, 0 /* no options */);
135 /* ENOATTR and ENODATA have different values */
136 if (error
< 0 && errno
== ENOATTR
)
144 ceph_os_listxattr(const char *path
, char *list
, size_t size
)
148 #if defined(__FreeBSD__)
150 * XXX. The format of the list FreeBSD returns differs
151 * from the Linux ones. We have to perform the conversion. :-(
153 char *newlist
, *p
, *p1
;
156 newlist
= malloc(size
);
157 if (newlist
!= NULL
) {
158 error
= extattr_list_file(path
, EXTATTR_NAMESPACE_USER
,
163 while ((p
- newlist
) < error
) {
164 uint8_t len
= *(uint8_t *)p
;
166 if ((p
+ len
- newlist
) > error
)
180 error
= extattr_list_file(path
, EXTATTR_NAMESPACE_USER
,
183 #elif defined(__linux__)
184 error
= listxattr(path
, list
, size
);
185 #elif defined(DARWIN)
186 error
= listxattr(path
, list
, size
, 0);
193 ceph_os_flistxattr(int fd
, char *list
, size_t size
)
197 #if defined(__FreeBSD__)
199 * XXX. The format of the list FreeBSD returns differs
200 * from the Linux ones. We have to perform the conversion. :-(
202 char *newlist
, *p
, *p1
;
205 newlist
= malloc(size
);
206 if (newlist
!= NULL
) {
207 error
= extattr_list_fd(fd
, EXTATTR_NAMESPACE_USER
,
212 while ((p
- newlist
) < error
) {
213 uint8_t len
= *(uint8_t *)p
;
215 if ((p
+ len
- newlist
) > error
)
229 error
= extattr_list_fd(fd
, EXTATTR_NAMESPACE_USER
,
232 #elif defined(__linux__)
233 error
= flistxattr(fd
, list
, size
);
234 #elif defined(DARWIN)
235 error
= flistxattr(fd
, list
, size
, 0);
242 ceph_os_removexattr(const char *path
, const char *name
)
246 #if defined(__FreeBSD__)
247 error
= extattr_delete_file(path
, EXTATTR_NAMESPACE_USER
, name
);
248 #elif defined(__linux__)
249 error
= removexattr(path
, name
);
250 #elif defined(DARWIN)
251 error
= removexattr(path
, name
, 0);
252 /* ENOATTR and ENODATA have different values */
253 if (error
< 0 && errno
== ENOATTR
)
261 ceph_os_fremovexattr(int fd
, const char *name
)
265 #if defined(__FreeBSD__)
266 error
= extattr_delete_fd(fd
, EXTATTR_NAMESPACE_USER
, name
);
267 #elif defined(__linux__)
268 error
= fremovexattr(fd
, name
);
269 #elif defined(DARWIN)
270 error
= fremovexattr(fd
, name
, 0);
271 /* ENOATTR and ENODATA have different values */
272 if (error
< 0 && errno
== ENOATTR
)