]>
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>
22 #elif defined(__APPLE__)
24 #include <sys/xattr.h>
26 #error "Your system is not supported!"
29 #include "common/xattr.h"
32 * Sets extended attribute on a file.
33 * Returns 0 on success, -1 on failure.
36 ceph_os_setxattr(const char *path
, const char *name
,
37 const void *value
, size_t size
)
41 #if defined(__FreeBSD__)
42 error
= extattr_set_file(path
, EXTATTR_NAMESPACE_USER
, name
, value
,
46 #elif defined(__linux__)
47 error
= setxattr(path
, name
, value
, size
, 0);
48 #elif defined(__APPLE__)
49 error
= setxattr(path
, name
, value
, size
, 0 /* position */, 0);
56 ceph_os_fsetxattr(int fd
, const char *name
, const void *value
,
61 #if defined(__FreeBSD__)
62 error
= extattr_set_fd(fd
, EXTATTR_NAMESPACE_USER
, name
, value
, size
);
65 #elif defined(__linux__)
66 error
= fsetxattr(fd
, name
, value
, size
, 0);
67 #elif defined(__APPLE__)
68 error
= fsetxattr(fd
, name
, value
, size
, 0, 0 /* no options should be identical to Linux */ );
75 ceph_os_getxattr(const char *path
, const char *name
,
76 void *value
, size_t size
)
80 #if defined(__FreeBSD__)
81 if (value
== NULL
|| size
== 0) {
82 error
= extattr_get_file(path
, EXTATTR_NAMESPACE_USER
, name
, value
,
85 error
= extattr_get_file(path
, EXTATTR_NAMESPACE_USER
, name
, NULL
,
92 error
= extattr_get_file(path
, EXTATTR_NAMESPACE_USER
,
97 #elif defined(__linux__)
98 error
= getxattr(path
, name
, value
, size
);
99 #elif defined(__APPLE__)
100 error
= getxattr(path
, name
, value
, size
, 0 /* position */, 0);
101 /* ENOATTR and ENODATA have different values */
102 if (error
< 0 && errno
== ENOATTR
)
110 ceph_os_fgetxattr(int fd
, const char *name
, void *value
,
115 #if defined(__FreeBSD__)
116 if (value
== NULL
|| size
== 0) {
117 error
= extattr_get_fd(fd
, EXTATTR_NAMESPACE_USER
, name
, value
,
120 error
= extattr_get_fd(fd
, EXTATTR_NAMESPACE_USER
, name
, NULL
,
127 error
= extattr_get_fd(fd
, EXTATTR_NAMESPACE_USER
,
132 #elif defined(__linux__)
133 error
= fgetxattr(fd
, name
, value
, size
);
134 #elif defined(__APPLE__)
135 error
= fgetxattr(fd
, name
, value
, size
, 0, 0 /* no options */);
136 /* ENOATTR and ENODATA have different values */
137 if (error
< 0 && errno
== ENOATTR
)
145 ceph_os_listxattr(const char *path
, char *list
, size_t size
)
149 #if defined(__FreeBSD__)
151 * XXX. The format of the list FreeBSD returns differs
152 * from the Linux ones. We have to perform the conversion. :-(
154 char *newlist
, *p
, *p1
;
157 newlist
= malloc(size
);
158 if (newlist
!= NULL
) {
159 error
= extattr_list_file(path
, EXTATTR_NAMESPACE_USER
,
164 while ((p
- newlist
) < error
) {
165 uint8_t len
= *(uint8_t *)p
;
167 if ((p
+ len
- newlist
) > error
)
181 error
= extattr_list_file(path
, EXTATTR_NAMESPACE_USER
,
184 #elif defined(__linux__)
185 error
= listxattr(path
, list
, size
);
186 #elif defined(__APPLE__)
187 error
= listxattr(path
, list
, size
, 0);
194 ceph_os_flistxattr(int fd
, char *list
, size_t size
)
198 #if defined(__FreeBSD__)
200 * XXX. The format of the list FreeBSD returns differs
201 * from the Linux ones. We have to perform the conversion. :-(
203 char *newlist
, *p
, *p1
;
206 newlist
= malloc(size
);
207 if (newlist
!= NULL
) {
208 error
= extattr_list_fd(fd
, EXTATTR_NAMESPACE_USER
,
213 while ((p
- newlist
) < error
) {
214 uint8_t len
= *(uint8_t *)p
;
216 if ((p
+ len
- newlist
) > error
)
230 error
= extattr_list_fd(fd
, EXTATTR_NAMESPACE_USER
,
233 #elif defined(__linux__)
234 error
= flistxattr(fd
, list
, size
);
235 #elif defined(__APPLE__)
236 error
= flistxattr(fd
, list
, size
, 0);
243 ceph_os_removexattr(const char *path
, const char *name
)
247 #if defined(__FreeBSD__)
248 error
= extattr_delete_file(path
, EXTATTR_NAMESPACE_USER
, name
);
249 #elif defined(__linux__)
250 error
= removexattr(path
, name
);
251 #elif defined(__APPLE__)
252 error
= removexattr(path
, name
, 0);
253 /* ENOATTR and ENODATA have different values */
254 if (error
< 0 && errno
== ENOATTR
)
262 ceph_os_fremovexattr(int fd
, const char *name
)
266 #if defined(__FreeBSD__)
267 error
= extattr_delete_fd(fd
, EXTATTR_NAMESPACE_USER
, name
);
268 #elif defined(__linux__)
269 error
= fremovexattr(fd
, name
);
270 #elif defined(__APPLE__)
271 error
= fremovexattr(fd
, name
, 0);
272 /* ENOATTR and ENODATA have different values */
273 if (error
< 0 && errno
== ENOATTR
)