From: Richard D. <ric...@us...> - 2006-08-19 18:27:22
|
Update of /cvsroot/file-extattr/File-ExtAttr In directory sc8-pr-cvs5.sourceforge.net:/tmp/cvs-serv7869 Modified Files: ExtAttr.xs extattr_linux.c Log Message: Add create and replace flags (to replace usage of XATTR_CREATE, XATTR_REPLACE); bugfix: setfattr returns 0 on failure now Index: extattr_linux.c =================================================================== RCS file: /cvsroot/file-extattr/File-ExtAttr/extattr_linux.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** extattr_linux.c 19 Aug 2006 14:06:22 -0000 1.1 --- extattr_linux.c 19 Aug 2006 18:27:18 -0000 1.2 *************** *** 9,12 **** --- 9,35 ---- static const char NAMESPACE_DEFAULT[] = "user"; + static int + flags2setflags (struct hv *flags) + { + static const char CREATE_KEY[] = "create"; + static const char REPLACE_KEY[] = "replace"; + const size_t CREATE_KEYLEN = strlen(CREATE_KEY); + const size_t REPLACE_KEYLEN = strlen(REPLACE_KEY); + SV **psv_ns; + int ret = 0; + + /* + * 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) ? XATTR_CREATE : 0; + + if (flags && (psv_ns = hv_fetch(flags, REPLACE_KEY, REPLACE_KEYLEN, 0))) + ret = SvIV(*psv_ns) ? XATTR_REPLACE : 0; + + return ret; + } + static char * flags2namespace (struct hv *flags) *************** *** 70,79 **** int ret; char *q; ! /* XXX: Other flags? */ q = qualify_attrname(attrname, flags); if (q) { ! ret = setxattr(path, q, attrvalue, slen, 0); free(q); } --- 93,104 ---- int ret; char *q; + int setflags; ! setflags = flags2setflags(flags); q = qualify_attrname(attrname, flags); + if (q) { ! ret = setxattr(path, q, attrvalue, slen, setflags); free(q); } *************** *** 96,105 **** int ret; char *q; ! /* XXX: Other flags? */ q = qualify_attrname(attrname, flags); if (q) { ! ret = fsetxattr(fd, q, attrvalue, slen, 0); free(q); } --- 121,132 ---- int ret; char *q; + int setflags; ! setflags = flags2setflags(flags); q = qualify_attrname(attrname, flags); + if (q) { ! ret = fsetxattr(fd, q, attrvalue, slen, setflags); free(q); } Index: ExtAttr.xs =================================================================== RCS file: /cvsroot/file-extattr/File-ExtAttr/ExtAttr.xs,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** ExtAttr.xs 19 Aug 2006 14:06:22 -0000 1.17 --- ExtAttr.xs 19 Aug 2006 18:27:18 -0000 1.18 *************** *** 36,43 **** rc = portable_setxattr(path, attrname, attrvalue, slen, flags); if (rc == -1) ! { ! setattr_warn("setxattr", attrname, errno); ! XSRETURN_UNDEF; ! } RETVAL = (rc == 0); --- 36,40 ---- rc = portable_setxattr(path, attrname, attrvalue, slen, flags); if (rc == -1) ! setattr_warn("setxattr", attrname, errno); RETVAL = (rc == 0); *************** *** 61,68 **** rc = portable_fsetxattr(fd, attrname, attrvalue, slen, flags); if (rc == -1) ! { ! setattr_warn("fsetxattr", attrname, errno); ! XSRETURN_UNDEF; ! } RETVAL = (rc == 0); --- 58,62 ---- rc = portable_fsetxattr(fd, attrname, attrvalue, slen, flags); if (rc == -1) ! setattr_warn("fsetxattr", attrname, errno); RETVAL = (rc == 0); |