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)