From: Richard D. <ric...@us...> - 2006-09-30 22:10:16
|
Update of /cvsroot/file-extattr/File-ExtAttr In directory sc8-pr-cvs5.sourceforge.net:/tmp/cvs-serv1641 Modified Files: TODO extattr_bsd.c extattr_bsd.h extattr_solaris.c flags.h portable.h Added Files: flags.c Log Message: Initial BSD support for attribute flag Index: extattr_solaris.c =================================================================== RCS file: /cvsroot/file-extattr/File-ExtAttr/extattr_solaris.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** extattr_solaris.c 28 Aug 2006 11:45:40 -0000 1.3 --- extattr_solaris.c 30 Sep 2006 22:10:12 -0000 1.4 *************** *** 17,47 **** static const mode_t ATTRMODE = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP; - typedef enum { - SET_CREATEIFNEEDED = 0, - SET_CREATE, - SET_REPLACE - } setflags_t; - - static setflags_t - flags2setflags (struct hv *flags) - { - const size_t CREATE_KEYLEN = strlen(CREATE_KEY); - const size_t REPLACE_KEYLEN = strlen(REPLACE_KEY); - SV **psv_ns; - setflags_t ret = SET_CREATEIFNEEDED; - - /* - * ASSUMPTION: Perl layer must ensure that create & replace - * aren't used at the same time. - */ - if (flags && (psv_ns = hv_fetch(flags, CREATE_KEY, CREATE_KEYLEN, 0))) - ret = SvIV(*psv_ns) ? SET_CREATE : SET_CREATEIFNEEDED; - - if (flags && (psv_ns = hv_fetch(flags, REPLACE_KEY, REPLACE_KEYLEN, 0))) - ret = SvIV(*psv_ns) ? SET_REPLACE : SET_CREATEIFNEEDED; - - return ret; - } - static int valid_namespace (struct hv *flags) --- 17,20 ---- *************** *** 228,236 **** int saved_errno = 0; int ok = 1; ! setflags_t setflags; int openflags = O_RDWR; int attrfd = -1; ! setflags = flags2setflags(flags); switch (setflags) { --- 201,209 ---- int saved_errno = 0; int ok = 1; ! File_ExtAttr_setflags_t setflags; int openflags = O_RDWR; int attrfd = -1; ! setflags = File_ExtAttr_flags2setflags(flags); switch (setflags) { *************** *** 275,282 **** int ok = 1; int openflags = O_RDWR | O_XATTR; ! setflags_t setflags; int attrfd = -1; ! setflags = flags2setflags(flags); switch (setflags) { --- 248,255 ---- int ok = 1; int openflags = O_RDWR | O_XATTR; ! File_ExtAttr_setflags_t setflags; int attrfd = -1; ! setflags = File_ExtAttr_flags2setflags(flags); switch (setflags) { --- NEW FILE: flags.c --- #include <stddef.h> #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "flags.h" File_ExtAttr_setflags_t File_ExtAttr_flags2setflags (struct hv *flags) { const size_t CREATE_KEYLEN = strlen(CREATE_KEY); const size_t REPLACE_KEYLEN = strlen(REPLACE_KEY); SV **psv_ns; File_ExtAttr_setflags_t ret = SET_CREATEIFNEEDED; /* * ASSUMPTION: Perl layer must ensure that create & replace * aren't used at the same time. */ if (flags && (psv_ns = hv_fetch(flags, CREATE_KEY, CREATE_KEYLEN, 0))) ret = SvIV(*psv_ns) ? SET_CREATE : SET_CREATEIFNEEDED; if (flags && (psv_ns = hv_fetch(flags, REPLACE_KEY, REPLACE_KEYLEN, 0))) ret = SvIV(*psv_ns) ? SET_REPLACE : SET_CREATEIFNEEDED; return ret; } Index: extattr_bsd.c =================================================================== RCS file: /cvsroot/file-extattr/File-ExtAttr/extattr_bsd.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** extattr_bsd.c 15 Aug 2006 09:14:20 -0000 1.2 --- extattr_bsd.c 30 Sep 2006 22:10:12 -0000 1.3 *************** *** 5,9 **** #include <errno.h> ! #include "extattr_bsd.h" /* Helper to convert number of bytes written into success/failure code. */ --- 5,59 ---- #include <errno.h> ! #include "EXTERN.h" ! #include "perl.h" ! #include "XSUB.h" ! ! #include "flags.h" ! ! static const char NAMESPACE_USER[] = "user"; ! static const char NAMESPACE_SYSTEM[] = "system"; ! ! static int ! valid_namespace (struct hv *flags, int *pattrnamespace) ! { ! const size_t NAMESPACE_KEYLEN = strlen(NAMESPACE_KEY); ! SV **psv_ns; ! char *ns = NULL; ! int ok = 1; /* Default is valid */ ! int attrnamespace = EXTATTR_NAMESPACE_USER; ! ! if (flags && (psv_ns = hv_fetch(flags, NAMESPACE_KEY, NAMESPACE_KEYLEN, 0))) ! { ! /* ! * Undefined => default. Otherwise "user" and "system" are valid. ! */ ! if (SvOK(*psv_ns)) ! { ! char *s; ! STRLEN len = 0; ! ! s = SvPV(*psv_ns, len); ! ! if (len) ! { ! if (memcmp(NAMESPACE_USER, s, len) == 0) ! attrnamespace = EXTATTR_NAMESPACE_USER; ! else if (memcmp(NAMESPACE_SYSTEM, s, len) == 0) ! attrnamespace = EXTATTR_NAMESPACE_SYSTEM; ! else ! ok = 0; ! } ! else ! { ! ok = 0; ! } ! } ! } ! ! if (ok) ! *pattrnamespace = attrnamespace; ! ! return ok; ! } /* Helper to convert number of bytes written into success/failure code. */ *************** *** 33,41 **** const char *attrname, const char *attrvalue, ! const size_t slen) { ! /* XXX: Namespace? */ ! int ret = extattr_set_file(path, EXTATTR_NAMESPACE_USER, attrname, attrvalue, slen); ! return bsd_extattr_set_succeeded(slen, ret); } --- 83,135 ---- const char *attrname, const char *attrvalue, ! const size_t slen, ! struct hv *flags) { ! int attrnamespace = -1; ! int ok = 1; ! int ret = -1; ! ! if (!valid_namespace(flags, &attrnamespace)) ! { ! errno = ENOATTR; ! ok = 0; ! } ! ! if (ok) ! { ! File_ExtAttr_setflags_t setflags = File_ExtAttr_flags2setflags(flags); ! switch (setflags) ! { ! case SET_CREATEIFNEEDED: ! case SET_REPLACE: ! /* Default behaviour */ ! break; ! ! case SET_CREATE: ! /* ! * This needs to be emulated, since the default *BSD calls ! * don't provide a way of failing if the attribute exists. ! * This emulation is inherently racy. ! */ ! { ! ssize_t sz = extattr_get_file(path, attrnamespace, attrname, NULL, 0); ! if (sz >= 0) ! { ! /* Attribute already exists => fail. */ ! errno = EEXIST; ! ok = 0; ! } ! } ! break; ! } ! } ! ! if (ok) ! { ! ret = extattr_set_file(path, attrnamespace, attrname, attrvalue, slen); ! ret = bsd_extattr_set_succeeded(slen, ret); ! } ! ! return ok ? ret : -1; } *************** *** 44,52 **** const char *attrname, const char *attrvalue, ! const size_t slen) { ! /* XXX: Namespace? */ ! int ret = extattr_set_fd(fd, EXTATTR_NAMESPACE_USER, attrname, attrvalue, slen); ! return bsd_extattr_set_succeeded(slen, ret); } --- 138,278 ---- const char *attrname, const char *attrvalue, ! const size_t slen, ! struct hv *flags) { ! int attrnamespace = -1; ! int ok = 1; ! int ret = -1; ! ! if (!valid_namespace(flags, &attrnamespace)) ! { ! errno = ENOATTR; ! ok = 0; ! } ! ! if (ok) ! { ! File_ExtAttr_setflags_t setflags = File_ExtAttr_flags2setflags(flags); ! switch (setflags) ! { ! case SET_CREATEIFNEEDED: ! case SET_REPLACE: ! /* Default behaviour */ ! break; ! ! case SET_CREATE: ! /* ! * This needs to be emulated, since the default *BSD calls ! * don't provide a way of failing if the attribute exists. ! * This emulation is inherently racy. ! */ ! { ! ssize_t sz = extattr_get_fd(fd, attrnamespace, attrname, NULL, 0); ! if (sz >= 0) ! { ! /* Attribute already exists => fail. */ ! errno = EEXIST; ! ok = 0; ! } ! } ! break; ! } ! } ! ! if (ok) ! { ! ret = extattr_set_fd(fd, attrnamespace, attrname, attrvalue, slen); ! ret = bsd_extattr_set_succeeded(slen, ret); ! } ! ! return ret; ! } ! ! int ! bsd_getxattr (const char *path, ! const char *attrname, ! void *attrvalue, ! const size_t slen, ! struct hv *flags) ! { ! int attrnamespace = -1; ! int ok = 1; ! int ret = -1; ! ! if (!valid_namespace(flags, &attrnamespace)) ! { ! errno = ENOATTR; ! ok = 0; ! } ! ! if (ok) ! ret = extattr_get_file(path, attrnamespace, attrname, attrvalue, slen); ! ! return ok ? ret : -1; ! } ! ! int ! bsd_fgetxattr (const int fd, ! const char *attrname, ! void *attrvalue, ! const size_t slen, ! struct hv *flags) ! { ! int attrnamespace = -1; ! int ok = 1; ! int ret = -1; ! ! if (!valid_namespace(flags, &attrnamespace)) ! { ! errno = ENOATTR; ! ok = 0; ! } ! ! if (ok) ! ret = extattr_get_fd(fd, attrnamespace, attrname, attrvalue, slen); ! ! return ok ? ret : -1; ! } ! ! int ! bsd_removexattr (const char *path, ! const char *attrname, ! struct hv *flags) ! { ! int attrnamespace = -1; ! int ok = 1; ! int ret = -1; ! ! if (!valid_namespace(flags, &attrnamespace)) ! { ! errno = ENOATTR; ! ok = 0; ! } ! ! if (ok) ! ret = extattr_delete_file(path, attrnamespace, attrname); ! ! return ok ? ret : -1; ! } ! ! int ! bsd_fremovexattr (const int fd, ! const char *attrname, ! struct hv *flags) ! { ! int attrnamespace = -1; ! int ok = 1; ! int ret = -1; ! ! if (!valid_namespace(flags, &attrnamespace)) ! { ! errno = ENOATTR; ! ok = 0; ! } ! ! if (ok) ! ret = extattr_delete_fd(fd, attrnamespace, attrname); ! ! return ok ? ret : -1; } *************** *** 68,72 **** ssize_t ! bsd_listxattr (const char *path, char *buf, const size_t buflen) { ssize_t ret; --- 294,301 ---- ssize_t ! bsd_listxattr (const char *path, ! char *buf, ! const size_t buflen, ! struct hv *flags) { ssize_t ret; *************** *** 86,90 **** ssize_t ! bsd_flistxattr (const int fd, char *buf, const size_t buflen) { ssize_t ret; --- 315,322 ---- ssize_t ! bsd_flistxattr (const int fd, ! char *buf, ! const size_t buflen, ! struct hv *flags) { ssize_t ret; Index: flags.h =================================================================== RCS file: /cvsroot/file-extattr/File-ExtAttr/flags.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** flags.h 28 Aug 2006 11:45:40 -0000 1.1 --- flags.h 30 Sep 2006 22:10:12 -0000 1.2 *************** *** 2,5 **** --- 2,13 ---- #define EXTATTR_FLAGS_H + struct hv; + + typedef enum { + SET_CREATEIFNEEDED = 0, + SET_CREATE, + SET_REPLACE + } File_ExtAttr_setflags_t; + static const char NAMESPACE_KEY[] = "namespace"; *************** *** 7,9 **** --- 15,19 ---- static const char REPLACE_KEY[] = "replace"; + File_ExtAttr_setflags_t File_ExtAttr_flags2setflags (struct hv *flags); + #endif /* EXTATTR_FLAGS_H */ Index: portable.h =================================================================== RCS file: /cvsroot/file-extattr/File-ExtAttr/portable.h,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** portable.h 28 Aug 2006 11:45:40 -0000 1.9 --- portable.h 30 Sep 2006 22:10:12 -0000 1.10 *************** *** 18,22 **** return setxattr(path, attrname, attrvalue, slen, 0 /* XXX: flags? */); #elif defined(EXTATTR_BSD) ! return bsd_setxattr(path, attrname, attrvalue, slen /* XXX: flags? */); #elif defined(EXTATTR_SOLARIS) return solaris_setxattr(path, attrname, attrvalue, slen, flags); --- 18,22 ---- return setxattr(path, attrname, attrvalue, slen, 0 /* XXX: flags? */); #elif defined(EXTATTR_BSD) ! return bsd_setxattr(path, attrname, attrvalue, slen, flags); #elif defined(EXTATTR_SOLARIS) return solaris_setxattr(path, attrname, attrvalue, slen, flags); *************** *** 36,40 **** return fsetxattr(fd, attrname, attrvalue, slen, 0 /* XXX: flags? */); #elif defined(EXTATTR_BSD) ! return bsd_fsetxattr(fd, attrname, attrvalue, slen /* XXX: flags? */); #elif defined(EXTATTR_SOLARIS) return solaris_fsetxattr(fd, attrname, attrvalue, slen, flags); --- 36,40 ---- return fsetxattr(fd, attrname, attrvalue, slen, 0 /* XXX: flags? */); #elif defined(EXTATTR_BSD) ! return bsd_fsetxattr(fd, attrname, attrvalue, slen, flags); #elif defined(EXTATTR_SOLARIS) return solaris_fsetxattr(fd, attrname, attrvalue, slen, flags); *************** *** 54,59 **** return getxattr(path, attrname, attrvalue, slen, 0, 0 /* XXX: flags? */); #elif defined(EXTATTR_BSD) ! /* XXX: flags? Namespace? */ ! return extattr_get_file(path, EXTATTR_NAMESPACE_USER, attrname, attrvalue, slen); #elif defined(EXTATTR_SOLARIS) return solaris_getxattr(path, attrname, attrvalue, slen, flags); --- 54,58 ---- return getxattr(path, attrname, attrvalue, slen, 0, 0 /* XXX: flags? */); #elif defined(EXTATTR_BSD) ! return bsd_getxattr(path, attrname, attrvalue, slen, flags); #elif defined(EXTATTR_SOLARIS) return solaris_getxattr(path, attrname, attrvalue, slen, flags); *************** *** 73,78 **** return fgetxattr(fd, attrname, attrvalue, slen, 0, 0 /* XXX: flags? */); #elif defined(EXTATTR_BSD) ! /* XXX: flags? Namespace? */ ! return extattr_get_fd(fd, EXTATTR_NAMESPACE_USER, attrname, attrvalue, slen); #elif defined(EXTATTR_SOLARIS) return solaris_fgetxattr(fd, attrname, attrvalue, slen, flags); --- 72,76 ---- return fgetxattr(fd, attrname, attrvalue, slen, 0, 0 /* XXX: flags? */); #elif defined(EXTATTR_BSD) ! return bsd_fgetxattr(fd, attrname, attrvalue, slen, flags); #elif defined(EXTATTR_SOLARIS) return solaris_fgetxattr(fd, attrname, attrvalue, slen, flags); *************** *** 112,117 **** return removexattr(path, name, 0 /* XXX: flags? */); #elif defined(EXTATTR_BSD) ! /* XXX: flags? Namespace? */ ! return extattr_delete_file(path, EXTATTR_NAMESPACE_USER, name); #elif defined(EXTATTR_SOLARIS) return solaris_removexattr(path, name, flags); --- 110,114 ---- return removexattr(path, name, 0 /* XXX: flags? */); #elif defined(EXTATTR_BSD) ! return bsd_removexattr(path, name, flags); #elif defined(EXTATTR_SOLARIS) return solaris_removexattr(path, name, flags); *************** *** 127,132 **** return fremovexattr(fd, name, 0 /* XXX: flags? */); #elif defined(EXTATTR_BSD) ! /* XXX: flags? Namespace? */ ! return extattr_delete_fd(fd, EXTATTR_NAMESPACE_USER, name); #elif defined(EXTATTR_SOLARIS) return solaris_fremovexattr(fd, name, flags); --- 124,128 ---- return fremovexattr(fd, name, 0 /* XXX: flags? */); #elif defined(EXTATTR_BSD) ! return bsd_fremovexattr(fd, name, flags); #elif defined(EXTATTR_SOLARIS) return solaris_fremovexattr(fd, name, flags); *************** *** 145,149 **** return listxattr(path, buf, slen, 0 /* XXX: flags? */); #elif defined(EXTATTR_BSD) ! return bsd_listxattr(path, buf, slen /* XXX: flags? */); #elif defined(EXTATTR_SOLARIS) return solaris_listxattr(path, buf, slen, flags); --- 141,145 ---- return listxattr(path, buf, slen, 0 /* XXX: flags? */); #elif defined(EXTATTR_BSD) ! return bsd_listxattr(path, buf, slen, flags); #elif defined(EXTATTR_SOLARIS) return solaris_listxattr(path, buf, slen, flags); *************** *** 162,166 **** return flistxattr(fd, buf, slen, 0 /* XXX: flags? */); #elif defined(EXTATTR_BSD) ! return bsd_flistxattr(fd, buf, slen /* XXX: flags? */); #elif defined(EXTATTR_SOLARIS) return solaris_flistxattr(fd, buf, slen, flags); --- 158,162 ---- return flistxattr(fd, buf, slen, 0 /* XXX: flags? */); #elif defined(EXTATTR_BSD) ! return bsd_flistxattr(fd, buf, slen, flags); #elif defined(EXTATTR_SOLARIS) return solaris_flistxattr(fd, buf, slen, flags); Index: TODO =================================================================== RCS file: /cvsroot/file-extattr/File-ExtAttr/TODO,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** TODO 15 Aug 2006 08:43:40 -0000 1.11 --- TODO 30 Sep 2006 22:10:12 -0000 1.12 *************** *** 31,34 **** --- 31,36 ---- on Linux, nothing on the other platforms. + TODO: How to handle "user." and the list retrieval? + Document pre-reqs for test suite: Test::Distribution, Test::Pod::Coverage Include these in a .spec file that we can include with distro Index: extattr_bsd.h =================================================================== RCS file: /cvsroot/file-extattr/File-ExtAttr/extattr_bsd.h,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** extattr_bsd.h 15 Aug 2006 09:14:20 -0000 1.3 --- extattr_bsd.h 30 Sep 2006 22:10:12 -0000 1.4 *************** *** 6,26 **** #include <sys/uio.h> int bsd_setxattr (const char *path, const char *attrname, const char *attrvalue, ! const size_t slen); int bsd_fsetxattr (const int fd, const char *attrname, const char *attrvalue, ! const size_t slen); ssize_t bsd_listxattr (const char *path, char *buf, ! const size_t buflen); ssize_t bsd_flistxattr (const int fd, char *buf, ! const size_t buflen); #endif /* EXTATTR_BSD_H */ --- 6,52 ---- #include <sys/uio.h> + struct hv; + int bsd_setxattr (const char *path, const char *attrname, const char *attrvalue, ! const size_t slen, ! struct hv *flags); int bsd_fsetxattr (const int fd, const char *attrname, const char *attrvalue, ! const size_t slen, ! struct hv *flags); ! ! int bsd_getxattr (const char *path, ! const char *attrname, ! void *attrvalue, ! const size_t slen, ! struct hv *flags); ! ! int bsd_fgetxattr (const int fd, ! const char *attrname, ! void *attrvalue, ! const size_t slen, ! struct hv *flags); ! ! int bsd_removexattr (const char *path, ! const char *attrname, ! struct hv *flags); ! ! int bsd_fremovexattr (const int fd, ! const char *attrname, ! struct hv *flags); ssize_t bsd_listxattr (const char *path, char *buf, ! const size_t buflen, ! struct hv *flags); ssize_t bsd_flistxattr (const int fd, char *buf, ! const size_t buflen, ! struct hv *flags); #endif /* EXTATTR_BSD_H */ |