From: Richard D. <ric...@us...> - 2006-08-19 14:06:30
|
Update of /cvsroot/file-extattr/File-ExtAttr In directory sc8-pr-cvs5.sourceforge.net:/tmp/cvs-serv32007 Modified Files: ExtAttr.xs MANIFEST extattr_linux.h extattr_os.h portable.h Added Files: extattr_linux.c Log Message: Initial support for cross-platform namespacing on Linux --- NEW FILE: extattr_linux.c --- #include "extattr_os.h" #ifdef EXTATTR_LINUX #include "EXTERN.h" #include "perl.h" #include "XSUB.h" static const char NAMESPACE_DEFAULT[] = "user"; static char * flags2namespace (struct hv *flags) { static const char NAMESPACE_KEY[] = "namespace"; const size_t NAMESPACE_KEYLEN = strlen(NAMESPACE_KEY); SV **psv_ns; char *ns = NULL; if (flags && (psv_ns = hv_fetch(flags, NAMESPACE_KEY, NAMESPACE_KEYLEN, 0))) { char *s; STRLEN len; s = SvPV(*psv_ns, len); ns = malloc(len + 1); if (ns) { strncpy(ns, s, len); ns[len] = '\0'; } } else { ns = strdup(NAMESPACE_DEFAULT); } return ns; } static char * qualify_attrname (const char *attrname, struct hv *flags) { char *res = NULL; char *ns; size_t reslen; ns = flags2namespace(flags); if (ns) { reslen = strlen(ns) + strlen(attrname) + 2; /* ns + "." + attrname + nul */ res = malloc(reslen); } if (res) snprintf(res, reslen, "%s.%s", ns, attrname); if (ns) free(ns); return res; } int linux_setxattr (const char *path, const char *attrname, const char *attrvalue, const size_t slen, struct hv *flags) { int ret; char *q; /* XXX: Other flags? */ q = qualify_attrname(attrname, flags); if (q) { ret = setxattr(path, q, attrvalue, slen, 0); free(q); } else { ret = -1; errno = ENOMEM; } return ret; } int linux_fsetxattr (const int fd, const char *attrname, const char *attrvalue, const size_t slen, struct hv *flags) { int ret; char *q; /* XXX: Other flags? */ q = qualify_attrname(attrname, flags); if (q) { ret = fsetxattr(fd, q, attrvalue, slen, 0); free(q); } else { ret = -1; errno = ENOMEM; } return ret; } int linux_getxattr (const char *path, const char *attrname, void *attrvalue, const size_t slen, struct hv *flags) { int ret; char *q; q = qualify_attrname(attrname, flags); if (q) { ret = getxattr(path, q, attrvalue, slen); free(q); } else { ret = -1; errno = ENOMEM; } return ret; } int linux_fgetxattr (const int fd, const char *attrname, void *attrvalue, const size_t slen, struct hv *flags) { int ret; char *q; q = qualify_attrname(attrname, flags); if (q) { ret = fgetxattr(fd, q, attrvalue, slen); free(q); } else { ret = -1; errno = ENOMEM; } return ret; } int linux_removexattr (const char *path, const char *attrname, struct hv *flags) { int ret; char *q; /* XXX: Other flags? */ q = qualify_attrname(attrname, flags); if (q) { ret = removexattr(path, q); free(q); } else { ret = -1; errno = ENOMEM; } return ret; } int linux_fremovexattr (const int fd, const char *attrname, struct hv *flags) { int ret; char *q; /* XXX: Other flags? */ q = qualify_attrname(attrname, flags); if (q) { ret = fremovexattr(fd, q); free(q); } else { ret = -1; errno = ENOMEM; } return ret; } ssize_t linux_listxattr (const char *path, char *buf, const size_t buflen, struct hv *flags) { #if 0 /* XXX: We need some kind of hash returned here: { namespace => attrname } */ int ret; char *q; /* XXX: Other flags? */ q = qualify_attrname(attrname, flags); if (q) { ret = listxattr(path, buf, buflen); free(q); } else { ret = -1; errno = ENOMEM; } return ret; #else return listxattr(path, buf, buflen); #endif } ssize_t linux_flistxattr (const int fd, char *buf, const size_t buflen, struct hv *flags) { return flistxattr(fd, buf, buflen); } #endif /* EXTATTR_LINUX */ Index: ExtAttr.xs =================================================================== RCS file: /cvsroot/file-extattr/File-ExtAttr/ExtAttr.xs,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** ExtAttr.xs 14 Aug 2006 21:01:46 -0000 1.16 --- ExtAttr.xs 19 Aug 2006 14:06:22 -0000 1.17 *************** *** 26,30 **** const char *attrname SV * attrvalueSV ! int flags PREINIT: STRLEN slen; --- 26,30 ---- const char *attrname SV * attrvalueSV ! HV * flags PREINIT: STRLEN slen; *************** *** 51,55 **** const char *attrname SV * attrvalueSV ! int flags PREINIT: STRLEN slen; --- 51,55 ---- const char *attrname SV * attrvalueSV ! HV * flags PREINIT: STRLEN slen; *************** *** 75,79 **** const char *path const char *attrname ! int flags PREINIT: char * attrvalue; --- 75,79 ---- const char *path const char *attrname ! HV * flags PREINIT: char * attrvalue; *************** *** 82,86 **** CODE: ! buflen = portable_lenxattr(path, attrname); if (buflen <= 0) buflen = SvIV(get_sv(MAX_INITIAL_VALUELEN_VARNAME, FALSE)); --- 82,86 ---- CODE: ! buflen = portable_lenxattr(path, attrname, flags); if (buflen <= 0) buflen = SvIV(get_sv(MAX_INITIAL_VALUELEN_VARNAME, FALSE)); *************** *** 89,93 **** New(1, attrvalue, buflen, char); ! attrlen = portable_getxattr(path, attrname, attrvalue, buflen); if (attrlen == -1){ --- 89,93 ---- New(1, attrvalue, buflen, char); ! attrlen = portable_getxattr(path, attrname, attrvalue, buflen, flags); if (attrlen == -1){ *************** *** 116,120 **** int fd const char *attrname ! int flags PREINIT: char * attrvalue; --- 116,120 ---- int fd const char *attrname ! HV * flags PREINIT: char * attrvalue; *************** *** 123,127 **** CODE: ! buflen = portable_flenxattr(fd, attrname); if (buflen <= 0) buflen = SvIV(get_sv(MAX_INITIAL_VALUELEN_VARNAME, FALSE)); --- 123,127 ---- CODE: ! buflen = portable_flenxattr(fd, attrname, flags); if (buflen <= 0) buflen = SvIV(get_sv(MAX_INITIAL_VALUELEN_VARNAME, FALSE)); *************** *** 130,134 **** New(1, attrvalue, buflen, char); ! attrlen = portable_fgetxattr(fd, attrname, attrvalue, buflen); if (attrlen == -1){ --- 130,134 ---- New(1, attrvalue, buflen, char); ! attrlen = portable_fgetxattr(fd, attrname, attrvalue, buflen, flags); if (attrlen == -1){ *************** *** 157,163 **** const char *path const char *attrname ! int flags CODE: ! RETVAL = (portable_removexattr(path, attrname) == 0); OUTPUT: --- 157,163 ---- const char *path const char *attrname ! HV * flags CODE: ! RETVAL = (portable_removexattr(path, attrname, flags) == 0); OUTPUT: *************** *** 169,175 **** int fd const char *attrname ! int flags CODE: ! RETVAL = (portable_fremovexattr(fd, attrname) == 0); OUTPUT: --- 169,175 ---- int fd const char *attrname ! HV * flags CODE: ! RETVAL = (portable_fremovexattr(fd, attrname, flags) == 0); OUTPUT: *************** *** 180,184 **** const char *path int fd ! int flags PREINIT: ssize_t size, ret; --- 180,184 ---- const char *path int fd ! HV * flags PREINIT: ssize_t size, ret; *************** *** 188,194 **** PPCODE: if(fd == -1) ! size = portable_listxattr(path, NULL, 0); else ! size = portable_flistxattr(fd, NULL, 0); if (size == -1) --- 188,194 ---- PPCODE: if(fd == -1) ! size = portable_listxattr(path, NULL, 0, flags); else ! size = portable_flistxattr(fd, NULL, 0, flags); if (size == -1) *************** *** 203,209 **** if (fd == -1) ! ret = portable_listxattr(path, namebuf, size); else ! ret = portable_flistxattr(fd, namebuf, size); // There could be a race condition here, if someone adds a new --- 203,209 ---- if (fd == -1) ! ret = portable_listxattr(path, namebuf, size, flags); else ! ret = portable_flistxattr(fd, namebuf, size, flags); // There could be a race condition here, if someone adds a new Index: extattr_linux.h =================================================================== RCS file: /cvsroot/file-extattr/File-ExtAttr/extattr_linux.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** extattr_linux.h 14 Aug 2006 21:10:54 -0000 1.1 --- extattr_linux.h 19 Aug 2006 14:06:22 -0000 1.2 *************** *** 6,8 **** --- 6,52 ---- #include <attr/xattr.h> + struct hv; + + int linux_setxattr (const char *path, + const char *attrname, + const char *attrvalue, + const size_t slen, + struct hv *flags); + + int linux_fsetxattr (const int fd, + const char *attrname, + const char *attrvalue, + const size_t slen, + struct hv *flags); + + int linux_getxattr (const char *path, + const char *attrname, + void *attrvalue, + const size_t slen, + struct hv *flags); + + int linux_fgetxattr (const int fd, + const char *attrname, + void *attrvalue, + const size_t slen, + struct hv *flags); + + int linux_removexattr (const char *path, + const char *attrname, + struct hv *flags); + + int linux_fremovexattr (const int fd, + const char *attrname, + struct hv *flags); + + ssize_t linux_listxattr (const char *path, + char *buf, + const size_t buflen, + struct hv *flags); + + ssize_t linux_flistxattr (const int fd, + char *buf, + const size_t buflen, + struct hv *flags); + #endif /* EXTATTR_LINUX_H */ Index: MANIFEST =================================================================== RCS file: /cvsroot/file-extattr/File-ExtAttr/MANIFEST,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** MANIFEST 14 Aug 2006 21:16:47 -0000 1.11 --- MANIFEST 19 Aug 2006 14:06:22 -0000 1.12 *************** *** 23,30 **** t/10constants.t t/11basic.t - t/12nonuser.t t/13long.t t/14optional.t t/20tie-basic.t lib/File/ExtAttr.pm lib/File/ExtAttr/Tie.pm --- 23,33 ---- t/10constants.t t/11basic.t t/13long.t t/14optional.t t/20tie-basic.t + t/30nsbasic.t + t/32nsnonuser.t + t/33nslong.t + t/39nsempty.t lib/File/ExtAttr.pm lib/File/ExtAttr/Tie.pm Index: extattr_os.h =================================================================== RCS file: /cvsroot/file-extattr/File-ExtAttr/extattr_os.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** extattr_os.h 15 Aug 2006 09:14:20 -0000 1.2 --- extattr_os.h 19 Aug 2006 14:06:23 -0000 1.3 *************** *** 19,22 **** --- 19,26 ---- #endif + #if defined(linux) + #define EXTATTR_LINUX + #endif + /* Include appropriate header for this OS, defaulting to Linux-style */ #if defined(EXTATTR_BSD) Index: portable.h =================================================================== RCS file: /cvsroot/file-extattr/File-ExtAttr/portable.h,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** portable.h 15 Aug 2006 09:14:20 -0000 1.7 --- portable.h 19 Aug 2006 14:06:25 -0000 1.8 *************** *** 5,8 **** --- 5,10 ---- #include "extattr_os.h" + struct hv; + /* Portable extattr functions */ static inline int *************** *** 11,24 **** const void *attrvalue, const size_t slen, ! const int flags) { #ifdef EXTATTR_MACOSX ! return setxattr(path, attrname, attrvalue, slen, 0, flags); #elif defined(EXTATTR_BSD) ! return bsd_setxattr(path, attrname, attrvalue, slen); #elif defined(EXTATTR_SOLARIS) ! return solaris_setxattr(path, attrname, attrvalue, slen, flags); #else ! return setxattr(path, attrname, attrvalue, slen, flags); #endif } --- 13,26 ---- const void *attrvalue, const size_t slen, ! struct hv *flags) { #ifdef EXTATTR_MACOSX ! 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, 0 /* XXX: flags? */); #else ! return linux_setxattr(path, attrname, attrvalue, slen, flags); #endif } *************** *** 29,42 **** const void *attrvalue, const size_t slen, ! const int flags) { #ifdef EXTATTR_MACOSX ! return fsetxattr(fd, attrname, attrvalue, slen, 0, flags); #elif defined(EXTATTR_BSD) ! return bsd_fsetxattr(fd, attrname, attrvalue, slen); #elif defined(EXTATTR_SOLARIS) ! return solaris_fsetxattr(fd, attrname, attrvalue, slen, flags); #else ! return fsetxattr(fd, attrname, attrvalue, slen, flags); #endif } --- 31,44 ---- const void *attrvalue, const size_t slen, ! struct hv *flags) { #ifdef EXTATTR_MACOSX ! 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, 0 /* XXX: flags? */); #else ! return linux_fsetxattr(fd, attrname, attrvalue, slen, flags); #endif } *************** *** 46,60 **** const char *attrname, void *attrvalue, ! const size_t slen) { #ifdef EXTATTR_MACOSX ! return getxattr(path, attrname, attrvalue, slen, 0, 0); #elif defined(EXTATTR_BSD) ! /* XXX: Namespace? */ return extattr_get_file(path, EXTATTR_NAMESPACE_USER, attrname, attrvalue, slen); #elif defined(EXTATTR_SOLARIS) ! return solaris_getxattr(path, attrname, attrvalue, slen); #else ! return getxattr(path, attrname, attrvalue, slen); #endif } --- 48,63 ---- const char *attrname, void *attrvalue, ! const size_t slen, ! struct hv *flags) { #ifdef EXTATTR_MACOSX ! 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 /* XXX: flags? */); #else ! return linux_getxattr(path, attrname, attrvalue, slen, flags); #endif } *************** *** 64,160 **** const char *attrname, void *attrvalue, ! const size_t slen) { #ifdef EXTATTR_MACOSX ! return fgetxattr(fd, attrname, attrvalue, slen, 0, 0); #elif defined(EXTATTR_BSD) ! /* XXX: Namespace? */ return extattr_get_fd(fd, EXTATTR_NAMESPACE_USER, attrname, attrvalue, slen); #elif defined(EXTATTR_SOLARIS) ! return solaris_fgetxattr(fd, attrname, attrvalue, slen); #else ! return fgetxattr(fd, attrname, attrvalue, slen); #endif } static inline ssize_t ! portable_lenxattr (const char *path, const char *attrname) { #ifdef BSD ! /* XXX: Namespace? */ return extattr_get_file(path, EXTATTR_NAMESPACE_USER, attrname, NULL, 0); #else /* XXX: Can BSD use this too? Maybe once namespacing sorted. */ ! return portable_getxattr(path, attrname, NULL, 0); #endif } static inline int ! portable_flenxattr (int fd, const char *attrname) { #ifdef BSD ! /* XXX: Namespace? */ return extattr_get_fd(fd, EXTATTR_NAMESPACE_USER, attrname, NULL, 0); #else /* XXX: Can BSD use this too? Maybe once namespacing sorted. */ ! return portable_fgetxattr(fd, attrname, NULL, 0); #endif } static inline int ! portable_removexattr (const char *path, const char *name) { #ifdef EXTATTR_MACOSX ! return removexattr(path, name, 0); #elif defined(EXTATTR_BSD) ! /* XXX: Namespace? */ return extattr_delete_file(path, EXTATTR_NAMESPACE_USER, name); #elif defined(EXTATTR_SOLARIS) ! return solaris_removexattr(path, name); #else ! return removexattr(path, name); #endif } static inline int ! portable_fremovexattr (const int fd, const char *name) { #ifdef EXTATTR_MACOSX ! return fremovexattr(fd, name, 0); #elif defined(EXTATTR_BSD) ! /* XXX: Namespace? */ return extattr_delete_fd(fd, EXTATTR_NAMESPACE_USER, name); #elif defined(EXTATTR_SOLARIS) ! return solaris_fremovexattr(fd, name); #else ! return fremovexattr(fd, name); #endif } static inline int ! portable_listxattr(const char *path, char *buf, const size_t slen) { #ifdef EXTATTR_MACOSX ! return listxattr(path, buf, slen, 0); #elif defined(EXTATTR_BSD) ! return bsd_listxattr(path, buf, slen); #elif defined(EXTATTR_SOLARIS) ! return solaris_listxattr(path, buf, slen); #else ! return listxattr(path, buf, slen); #endif } static inline int ! portable_flistxattr(const int fd, char *buf, const size_t slen) { #ifdef EXTATTR_MACOSX ! return flistxattr(fd, buf, slen, 0); #elif defined(EXTATTR_BSD) ! return bsd_flistxattr(fd, buf, slen); #elif defined(EXTATTR_SOLARIS) ! return solaris_flistxattr(fd, buf, slen); #else ! return flistxattr(fd, buf, slen); #endif } --- 67,170 ---- const char *attrname, void *attrvalue, ! const size_t slen, ! struct hv *flags) { #ifdef EXTATTR_MACOSX ! 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 /* XXX: flags? */); #else ! return linux_fgetxattr(fd, attrname, attrvalue, slen, flags); #endif } static inline ssize_t ! portable_lenxattr (const char *path, const char *attrname, struct hv *flags) { #ifdef BSD ! /* XXX: flags? Namespace? */ return extattr_get_file(path, EXTATTR_NAMESPACE_USER, attrname, NULL, 0); #else /* XXX: Can BSD use this too? Maybe once namespacing sorted. */ ! return portable_getxattr(path, attrname, NULL, 0, flags); #endif } static inline int ! portable_flenxattr (int fd, const char *attrname, struct hv *flags) { #ifdef BSD ! /* XXX: flags? Namespace? */ return extattr_get_fd(fd, EXTATTR_NAMESPACE_USER, attrname, NULL, 0); #else /* XXX: Can BSD use this too? Maybe once namespacing sorted. */ ! return portable_fgetxattr(fd, attrname, NULL, 0, flags); #endif } static inline int ! portable_removexattr (const char *path, const char *name, struct hv *flags) { #ifdef EXTATTR_MACOSX ! 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 /* XXX: flags? */); #else ! return linux_removexattr(path, name, flags); #endif } static inline int ! portable_fremovexattr (const int fd, const char *name, struct hv *flags) { #ifdef EXTATTR_MACOSX ! 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 /* XXX: flags? */); #else ! return linux_fremovexattr(fd, name, flags); #endif } static inline int ! portable_listxattr(const char *path, ! char *buf, ! const size_t slen, ! struct hv *flags) { #ifdef EXTATTR_MACOSX ! 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 /* XXX: flags? */); #else ! return linux_listxattr(path, buf, slen, flags); #endif } static inline int ! portable_flistxattr(const int fd, ! char *buf, ! const size_t slen, ! struct hv *flags) { #ifdef EXTATTR_MACOSX ! 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 /* XXX: flags? */); #else ! return linux_flistxattr(fd, buf, slen, flags); #endif } |