imported everything from my branch (which is slightly harmless).
[mono.git] / support / sys-xattr.c
1 /*
2  * <sys/xattr.h> wrapper functions.
3  *
4  * Authors:
5  *   Daniel Drake (dsd@gentoo.org)
6  *
7  * Copyright (C) 2005 Daniel Drake
8  */
9
10 #include <config.h>
11
12 #ifdef HAVE_SYS_XATTR_H
13
14 #include <sys/types.h>
15 #include <sys/xattr.h>
16 #include <unistd.h>
17 #include <fcntl.h>
18 #include <errno.h>
19
20 #include "map.h"
21 #include "mph.h"
22
23 G_BEGIN_DECLS
24
25 gint32
26 Mono_Posix_Syscall_setxattr (const char *path, const char *name, void *value, mph_size_t size, gint32 flags)
27 {
28         int _flags;
29         mph_return_if_size_t_overflow (size);
30
31         if (Mono_Posix_FromXattrFlags (flags, &_flags) == -1)
32                 return -1;
33
34 #if __APPLE__
35         return setxattr (path, name, value, size, 0, _flags);
36 #else
37         return setxattr (path, name, value, size, _flags);
38 #endif
39 }
40
41 #if !__APPLE__
42 gint32
43 Mono_Posix_Syscall_lsetxattr (const char *path, const char *name, void *value, mph_size_t size, gint32 flags)
44 {
45         int _flags;
46         mph_return_if_size_t_overflow (size);
47
48         if (Mono_Posix_FromXattrFlags (flags, &_flags) == -1)
49                 return -1;
50
51         return lsetxattr (path, name, value, size, _flags);
52 }
53 #endif
54
55 gint32
56 Mono_Posix_Syscall_fsetxattr (int fd, const char *name, void *value, mph_size_t size, gint32 flags)
57 {
58         int _flags;
59         mph_return_if_size_t_overflow (size);
60
61         if (Mono_Posix_FromXattrFlags (flags, &_flags) == -1)
62                 return -1;
63
64 #if __APPLE__
65         return fsetxattr (fd, name, value, (size_t) size, 0, _flags);
66 #else
67         return fsetxattr (fd, name, value, (size_t) size, _flags);
68 #endif
69
70 }
71
72 mph_ssize_t
73 Mono_Posix_Syscall_getxattr (const char *path, const char *name, void *value, mph_size_t size)
74 {
75         mph_return_if_size_t_overflow (size);
76 #if __APPLE__
77         return getxattr (path, name, value, (size_t) size, 0, 0);
78 #else
79         return getxattr (path, name, value, (size_t) size);
80 #endif
81 }
82
83 #if !__APPLE__
84 mph_ssize_t
85 Mono_Posix_Syscall_lgetxattr (const char *path, const char *name, void *value, mph_size_t size)
86 {
87         mph_return_if_size_t_overflow (size);
88         return lgetxattr (path, name, value, (size_t) size);
89 }
90 #endif
91
92 mph_ssize_t
93 Mono_Posix_Syscall_fgetxattr (int fd, const char *name, void *value, mph_size_t size)
94 {
95         mph_return_if_size_t_overflow (size);
96 #if __APPLE__
97         return fgetxattr (fd, name, value, (size_t) size, 0, 0);
98 #else
99         return fgetxattr (fd, name, value, (size_t) size);
100 #endif
101 }
102
103 mph_ssize_t
104 Mono_Posix_Syscall_listxattr (const char *path, void *list, mph_size_t size)
105 {
106         mph_return_if_size_t_overflow (size);
107 #if __APPLE__
108         return listxattr (path, (char *) list, (size_t) size, 0);
109 #else
110         return listxattr (path, (char *) list, (size_t) size);
111 #endif
112 }
113
114 #if !__APPLE__
115 mph_ssize_t
116 Mono_Posix_Syscall_llistxattr (const char *path, void *list, mph_size_t size)
117 {
118         mph_return_if_size_t_overflow (size);
119         return llistxattr (path, (char *) list, (size_t) size);
120 }
121 #endif
122
123 mph_ssize_t
124 Mono_Posix_Syscall_flistxattr (int fd, void *list, mph_size_t size)
125 {
126         mph_return_if_size_t_overflow (size);
127 #if __APPLE__
128         return flistxattr (fd, (char *) list, (size_t) size, 0);
129 #else
130         return flistxattr (fd, (char *) list, (size_t) size);
131 #endif
132 }
133
134 G_END_DECLS
135
136 #endif /* def HAVE_ATTR_XATTR_H */
137
138 /*
139  * vim: noexpandtab
140  */