The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

#include "extattr_os.h"
#ifdef EXTATTR_MACOSX
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "flags.h"
int
macosx_setxattr (const char *path,
const char *attrname,
const char *attrvalue,
const size_t slen,
struct hv *flags)
{
int ok = 1;
File_ExtAttr_setflags_t setflags = 0;
int xflags = 0;
int ret = -1;
setflags = File_ExtAttr_flags2setflags(flags);
switch (setflags)
{
case SET_CREATEIFNEEDED: break;
case SET_CREATE: xflags |= XATTR_CREATE; break;
case SET_REPLACE: xflags |= XATTR_REPLACE; break;
}
if (!File_ExtAttr_valid_default_namespace(flags))
{
errno = EOPNOTSUPP;
ret = -errno;
ok = 0;
}
if (ok) {
ret = setxattr(path, attrname, attrvalue, slen, 0, xflags);
if (ret < 0) {
ret = -errno;
ok = 0;
}
}
return ret;
}
int
macosx_fsetxattr (const int fd,
const char *attrname,
const char *attrvalue,
const size_t slen,
struct hv *flags)
{
int ok = 1;
File_ExtAttr_setflags_t setflags;
int xflags = 0;
int ret = -1;
setflags = File_ExtAttr_flags2setflags(flags);
switch (setflags)
{
case SET_CREATEIFNEEDED: break;
case SET_CREATE: xflags |= XATTR_CREATE; break;
case SET_REPLACE: xflags |= XATTR_REPLACE; break;
}
if (!File_ExtAttr_valid_default_namespace(flags))
{
errno = EOPNOTSUPP;
ret = -errno;
ok = 0;
}
if (ok) {
ret = fsetxattr(fd, attrname, attrvalue, slen, 0, xflags);
if (ret < 0) {
ret = -errno;
ok = 0;
}
}
return ret;
}
int
macosx_getxattr (const char *path,
const char *attrname,
void *attrvalue,
const size_t slen,
struct hv *flags)
{
int ok = 1;
int xflags = 0;
int ret = -1;
if (!File_ExtAttr_valid_default_namespace(flags))
{
errno = EOPNOTSUPP;
ret = -errno;
ok = 0;
}
if (ok) {
ret = getxattr(path, attrname, attrvalue, slen, 0, xflags);
if (ret < 0) {
ret = -errno;
ok = 0;
}
}
return ret;
}
int
macosx_fgetxattr (const int fd,
const char *attrname,
void *attrvalue,
const size_t slen,
struct hv *flags)
{
int ok = 1;
int xflags = 0;
int ret = -1;
if (!File_ExtAttr_valid_default_namespace(flags))
{
errno = EOPNOTSUPP;
ret = -errno;
ok = 0;
}
if (ok) {
ret = fgetxattr(fd, attrname, attrvalue, slen, 0, xflags);
if (ret < 0) {
ret = -errno;
ok = 0;
}
}
return ret;
}
int
macosx_removexattr (const char *path,
const char *attrname,
struct hv *flags)
{
int ok = 1;
int xflags = 0;
int ret = -1;
if (!File_ExtAttr_valid_default_namespace(flags))
{
errno = EOPNOTSUPP;
ret = -errno;
ok = 0;
}
if (ok) {
ret = removexattr(path, attrname, xflags);
if (ret < 0) {
ret = -errno;
ok = 0;
}
}
return ret;
}
int
macosx_fremovexattr (const int fd,
const char *attrname,
struct hv *flags)
{
int ok = 1;
int xflags = 0;
int ret = -1;
if (!File_ExtAttr_valid_default_namespace(flags))
{
errno = EOPNOTSUPP;
ret = -errno;
ok = 0;
}
if (ok) {
ret = fremovexattr(fd, attrname, xflags);
if (ret < 0) {
ret = -errno;
ok = 0;
}
}
return ret;
}
ssize_t
macosx_listxattr (const char *path,
char *buf,
const size_t buflen,
struct hv *flags)
{
int ok = 1;
int ret = -1;
if (!File_ExtAttr_valid_default_namespace(flags))
{
errno = EOPNOTSUPP;
ret = -errno;
ok = 0;
}
if (ok) {
ret = listxattr(path, buf, buflen, 0 /* XXX: flags? */);
if (ret < 0) {
ret = -errno;
ok = 0;
}
}
return ret;
}
ssize_t
macosx_flistxattr (const int fd,
char *buf,
const size_t buflen,
struct hv *flags)
{
int ok = 1;
int ret = -1;
if (!File_ExtAttr_valid_default_namespace(flags))
{
errno = EOPNOTSUPP;
ret = -errno;
ok = 0;
}
if (ok) {
ret = flistxattr(fd, buf, buflen, 0 /* XXX: flags? */);
if (ret < 0) {
ret = -errno;
ok = 0;
}
}
return ret;
}
ssize_t
macosx_listxattrns (const char *path,
char *buf,
const size_t buflen,
struct hv *flags)
{
ssize_t ret = listxattr(path, NULL, 0, 0 /* XXX: flags? */);
if (ret > 0) {
ret = File_ExtAttr_default_listxattrns(buf, buflen);
} else if (ret < 0) {
ret = -errno;
}
return ret;
}
ssize_t
macosx_flistxattrns (const int fd,
char *buf,
const size_t buflen,
struct hv *flags)
{
ssize_t ret = flistxattr(fd, NULL, 0, 0 /* XXX: flags? */);
if (ret > 0) {
ret = File_ExtAttr_default_listxattrns(buf, buflen);
} else if (ret < 0) {
ret = -errno;
}
return ret;
}
#endif /* EXTATTR_MACOSX */