Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Freebsd xattr #17

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
148 changes: 69 additions & 79 deletions src/native/sys-xattr.cc
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,10 @@
//

#ifdef EA_BSD
#include<array>
#include<stdlib.h>
#include<string>


struct BsdNamespaceInfo {
const char *name;
Expand All @@ -125,43 +129,42 @@ static int bsd_check_flags (int32_t flags)
// On FreeBSD, we need to convert "user.blah" into namespace 1 and attribute
// name "blah", or maybe "6.blah" into namespace 6 attribute "blah"
static int
bsd_handle_nsprefix (const char *name, char **_name, int *namespace)
bsd_handle_nsprefix (std::string name, std::string & attribute_name, int & namespace_num)
{
int i;
gchar **components = g_strsplit (name, ".", 2);
const size_t delimpos = name.find(".");
const std::string ns = name.substr(0, delimpos);

// Find namespace number from textual representation
for (i = 0; i < G_N_ELEMENTS(bsd_extattr_namespaces); i++)
if (strcmp (bsd_extattr_namespaces[i].name, components[0]) == 0) {
*namespace = bsd_extattr_namespaces[i].value;
for (size_t i = 0; i < std::size(bsd_extattr_namespaces); i++)
if (strcmp (bsd_extattr_namespaces[i].name, ns.c_str()) == 0) {
namespace_num = bsd_extattr_namespaces[i].value;
break;
}

if (*namespace == 0) {
if (namespace_num == 0) {
// Perhaps they specified the namespace number themselves..?
char *endptr;
*namespace = (int) strtol (components[0], &endptr, 10);
namespace_num = (int) strtol (ns.c_str(), &endptr, 10);
if (*endptr != '\0')
return -1;
}

*_name = g_strdup (components[1]);
g_strfreev (components);
//By doing the substring at the moment we want to assign, we save a memcopy
attribute_name = name.substr(delimpos+1);
return 0;
}

static void
init_attrlists (char *attrlists[])
{
memset (attrlists, 0, G_N_ELEMENTS(bsd_extattr_namespaces) * sizeof(char*));
memset (attrlists, 0, std::size(bsd_extattr_namespaces) * sizeof(char*));
}

static void
free_attrlists (char *attrlists[])
{
int i;
for (i = 0; i < G_N_ELEMENTS(bsd_extattr_namespaces); i++)
g_free (attrlists[i]);
for (size_t i = 0; i < std::size(bsd_extattr_namespaces); i++)
free (attrlists[i]);
}

// Counts the number of attributes in the result of a
Expand Down Expand Up @@ -221,7 +224,6 @@ static char
static ssize_t
bsd_combine_lists (char *attrlists[], char *dest, size_t dest_size_needed, size_t dest_size)
{
int i;
if (!dest)
return dest_size_needed;

Expand All @@ -230,7 +232,7 @@ bsd_combine_lists (char *attrlists[], char *dest, size_t dest_size_needed, size_
return -1;
}

for (i = 0; i < G_N_ELEMENTS(bsd_extattr_namespaces); i++)
for (size_t i = 0; i < std::size(bsd_extattr_namespaces); i++)
if (attrlists[i])
dest = bsd_convert_list (bsd_extattr_namespaces[i].name, attrlists[i], strlen (attrlists[i]), dest);

Expand All @@ -241,21 +243,20 @@ static mph_ssize_t
bsd_listxattr (const char *path, void *list, mph_size_t size)
{
size_t full_size = 0;
int i;
char *attrlists[G_N_ELEMENTS(bsd_extattr_namespaces)];
char *attrlists[std::size(bsd_extattr_namespaces)];

init_attrlists (attrlists);
for (i = 0; i < G_N_ELEMENTS(bsd_extattr_namespaces); i++) {
for (size_t i = 0; i < std::size(bsd_extattr_namespaces); i++) {
size_t buf_size;
int num_attrs;

buf_size = (size_t) extattr_list_file (path, i + 1, nullptr, 0);
if (buf_size == -1)
if (buf_size == (size_t)-1)
continue;

attrlists[i] = g_malloc0 (buf_size + 1);
attrlists[i] = (char*)calloc(buf_size + 1, 1);
buf_size = (size_t) extattr_list_file (path, i + 1, attrlists[i], buf_size);
if (buf_size == -1)
if (buf_size == (size_t)-1)
continue;

num_attrs = count_num_attrs(attrlists[i], buf_size);
Expand All @@ -271,21 +272,20 @@ static mph_ssize_t
bsd_llistxattr (const char *path, void *list, mph_size_t size)
{
size_t full_size = 0;
int i;
char *attrlists[G_N_ELEMENTS(bsd_extattr_namespaces)];
char *attrlists[std::size(bsd_extattr_namespaces)];

init_attrlists (attrlists);
for (i = 0; i < G_N_ELEMENTS(bsd_extattr_namespaces); i++) {
for (size_t i = 0; i < std::size(bsd_extattr_namespaces); i++) {
size_t buf_size;
int num_attrs;

buf_size = (size_t) extattr_list_link (path, i + 1, nullptr, 0);
if (buf_size == -1)
if (buf_size == (size_t)-1)
continue;

attrlists[i] = g_malloc0 (buf_size + 1);
attrlists[i] = (char*)calloc(buf_size + 1, 1);
buf_size = (size_t) extattr_list_link (path, i + 1, attrlists[i], buf_size);
if (buf_size == -1)
if (buf_size == (size_t)-1)
continue;

num_attrs = count_num_attrs(attrlists[i], buf_size);
Expand All @@ -301,21 +301,20 @@ static mph_ssize_t
bsd_flistxattr (int fd, void *list, mph_size_t size)
{
size_t full_size = 0;
int i;
char *attrlists[G_N_ELEMENTS(bsd_extattr_namespaces)];
char *attrlists[std::size(bsd_extattr_namespaces)];

init_attrlists (attrlists);
for (i = 0; i < G_N_ELEMENTS(bsd_extattr_namespaces); i++) {
for (size_t i = 0; i < std::size(bsd_extattr_namespaces); i++) {
size_t buf_size;
int num_attrs;

buf_size = (size_t) extattr_list_fd (fd, i + 1, nullptr, 0);
if (buf_size == -1)
if (buf_size == (size_t)-1)
continue;

attrlists[i] = g_malloc0 (buf_size + 1);
attrlists[i] = (char*)calloc(buf_size + 1, 1);
buf_size = (size_t) extattr_list_fd (fd, i + 1, attrlists[i], buf_size);
if (buf_size == -1)
if (buf_size == (size_t)-1)
continue;

num_attrs = count_num_attrs(attrlists[i], buf_size);
Expand Down Expand Up @@ -355,14 +354,13 @@ Mono_Posix_Syscall_setxattr (const char *path, const char *name, unsigned char *
}
#else /* EA_UNIX */
{
char *_name;
int namespace;
std::string _name;
int namespace_num;
if (bsd_check_flags (flags) == -1)
return -1;
if (bsd_handle_nsprefix (name, &_name, &namespace) == -1)
if (bsd_handle_nsprefix (name, _name, namespace_num) == -1)
return -1;
ret = extattr_set_file (path, namespace, _name, value, (size_t) size);
g_free (_name);
ret = extattr_set_file (path, namespace_num, _name.c_str(), value, (size_t) size);
}
#endif /* EA_UNIX */

Expand All @@ -388,14 +386,13 @@ Mono_Posix_Syscall_lsetxattr (const char *path, const char *name, unsigned char
}
#else /* EA_UNIX */
{
char *_name;
int namespace;
std::string _name;
int namespace_num;
if (bsd_check_flags (flags) == -1)
return -1;
if (bsd_handle_nsprefix (name, &_name, &namespace) == -1)
if (bsd_handle_nsprefix (name, _name, namespace_num) == -1)
return -1;
ret = extattr_set_link (path, namespace, _name, value, (size_t) size);
g_free (_name);
ret = extattr_set_link (path, namespace_num, _name.c_str(), value, (size_t) size);
}
#endif /* EA_UNIX */

Expand Down Expand Up @@ -425,14 +422,13 @@ Mono_Posix_Syscall_fsetxattr (int fd, const char *name, unsigned char *value, mp
}
#else /* EA_UNIX */
{
char *_name;
int namespace;
std::string _name;
int namespace_num;
if (bsd_check_flags (flags) == -1)
return -1;
if (bsd_handle_nsprefix (name, &_name, &namespace) == -1)
if (bsd_handle_nsprefix (name, _name, namespace_num) == -1)
return -1;
ret = extattr_set_fd (fd, namespace, _name, value, (size_t) size);
g_free (_name);
ret = extattr_set_fd (fd, namespace_num, _name.c_str(), value, (size_t) size);
}
#endif /* EA_UNIX */

Expand All @@ -456,12 +452,11 @@ Mono_Posix_Syscall_getxattr (const char *path, const char *name, unsigned char *
#endif /* __APPLE__ */
#else /* EA_UNIX */
{
char *_name;
int namespace;
if (bsd_handle_nsprefix (name, &_name, &namespace) == -1)
std::string _name;
int namespace_num;
if (bsd_handle_nsprefix (name, _name, namespace_num) == -1)
return -1;
ret = extattr_get_file (path, namespace, _name, value, (size_t) size);
g_free (_name);
ret = extattr_get_file (path, namespace_num, _name.c_str(), value, (size_t) size);
}
#endif /* EA_UNIX */

Expand All @@ -482,12 +477,11 @@ Mono_Posix_Syscall_lgetxattr (const char *path, const char *name, unsigned char
ret = lgetxattr (path, name, value, (size_t) size);
#else /* EA_UNIX */
{
char *_name;
int namespace;
if (bsd_handle_nsprefix (name, &_name, &namespace) == -1)
std::string _name;
int namespace_num;
if (bsd_handle_nsprefix (name, _name, namespace_num) == -1)
return -1;
ret = extattr_get_link (path, namespace, _name, value, (size_t) size);
g_free (_name);
ret = extattr_get_link (path, namespace_num, _name.c_str(), value, (size_t) size);
}
#endif /* EA_UNIX */

Expand All @@ -512,12 +506,11 @@ Mono_Posix_Syscall_fgetxattr (int fd, const char *name, unsigned char *value, mp
#endif /* __APPLE__ */
#else /* EA_UNIX */
{
char *_name;
int namespace;
if (bsd_handle_nsprefix (name, &_name, &namespace) == -1)
std::string _name;
int namespace_num;
if (bsd_handle_nsprefix (name, _name, namespace_num) == -1)
return -1;
ret = extattr_get_fd (fd, namespace, _name, value, (size_t) size);
g_free (_name);
ret = extattr_get_fd (fd, namespace_num, _name.c_str(), value, (size_t) size);
}
#endif /* EA_UNIX */

Expand Down Expand Up @@ -589,12 +582,11 @@ Mono_Posix_Syscall_removexattr (const char *path, const char *name)
#endif /* __APPLE__ */
#else /* EA_UNIX */
{
char *_name;
int namespace;
if (bsd_handle_nsprefix (name, &_name, &namespace) == -1)
std::string _name;
int namespace_num;
if (bsd_handle_nsprefix (name, _name, namespace_num) == -1)
return -1;
ret = extattr_delete_file (path, namespace, _name);
g_free (_name);
ret = extattr_delete_file (path, namespace_num, _name.c_str());
}
#endif /* EA_UNIX */

Expand All @@ -611,12 +603,11 @@ Mono_Posix_Syscall_lremovexattr (const char *path, const char *name)
ret = lremovexattr (path, name);
#else /* EA_UNIX */
{
char *_name;
int namespace;
if (bsd_handle_nsprefix (name, &_name, &namespace) == -1)
std::string _name;
int namespace_num;
if (bsd_handle_nsprefix (name, _name, namespace_num) == -1)
return -1;
ret = extattr_delete_link (path, namespace, _name);
g_free (_name);
ret = extattr_delete_link (path, namespace_num, _name.c_str());
}
#endif /* EA_UNIX */

Expand All @@ -637,12 +628,11 @@ Mono_Posix_Syscall_fremovexattr (int fd, const char *name)
#endif /* __APPLE__ */
#else /* EA_UNIX */
{
char *_name;
int namespace;
if (bsd_handle_nsprefix (name, &_name, &namespace) == -1)
std::string _name;
int namespace_num;
if (bsd_handle_nsprefix (name, _name, namespace_num) == -1)
return -1;
ret = extattr_delete_fd (fd, namespace, _name);
g_free (_name);
ret = extattr_delete_fd (fd, namespace_num, _name.c_str());
}
#endif /* EA_UNIX */

Expand Down