From: Richard D. <ric...@us...> - 2008-04-06 09:12:45
|
Update of /cvsroot/file-extattr/File-ExtAttr In directory sc8-pr-cvs17.sourceforge.net:/tmp/cvs-serv18613 Modified Files: Changes ExtAttr.xs TODO extattr_linux.c portable.h Log Message: Make sure that the errno value from any failed system calls is propagated into $! (#32679, #32680). This has only been implemented and tested on Linux so far. Index: portable.h =================================================================== RCS file: /cvsroot/file-extattr/File-ExtAttr/portable.h,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** portable.h 4 Nov 2007 09:00:10 -0000 1.13 --- portable.h 6 Apr 2008 09:12:47 -0000 1.14 *************** *** 7,11 **** struct hv; ! /* Portable extattr functions */ static inline int portable_setxattr (const char *path, --- 7,15 ---- struct hv; ! /* ! * Portable extattr functions. When these fail, they should return ! * -errno, i.e.: < 0 indicates failure. ! */ ! static inline int portable_setxattr (const char *path, Index: ExtAttr.xs =================================================================== RCS file: /cvsroot/file-extattr/File-ExtAttr/ExtAttr.xs,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** ExtAttr.xs 15 Dec 2007 09:28:12 -0000 1.23 --- ExtAttr.xs 6 Apr 2008 09:12:47 -0000 1.24 *************** *** 31,36 **** attrvalue = SvPV(attrvalueSV, slen); rc = portable_setxattr(path, attrname, attrvalue, slen, flags); ! if (rc == -1) setattr_warn("setxattr", attrname, errno); RETVAL = (rc == 0); --- 31,38 ---- attrvalue = SvPV(attrvalueSV, slen); rc = portable_setxattr(path, attrname, attrvalue, slen, flags); ! if (rc < 0) { setattr_warn("setxattr", attrname, errno); + errno = -rc; + } RETVAL = (rc == 0); *************** *** 53,58 **** attrvalue = SvPV(attrvalueSV, slen); rc = portable_fsetxattr(fd, attrname, attrvalue, slen, flags); ! if (rc == -1) setattr_warn("fsetxattr", attrname, errno); RETVAL = (rc == 0); --- 55,62 ---- attrvalue = SvPV(attrvalueSV, slen); rc = portable_fsetxattr(fd, attrname, attrvalue, slen, flags); ! if (rc < 0) { setattr_warn("fsetxattr", attrname, errno); + errno = -rc; + } RETVAL = (rc == 0); *************** *** 80,88 **** attrlen = portable_getxattr(path, attrname, attrvalue, buflen, flags); ! if (attrlen == -1){ //key not found, just return undef if(errno == ENOATTR){ Safefree(attrvalue); XSRETURN_UNDEF; --- 84,93 ---- attrlen = portable_getxattr(path, attrname, attrvalue, buflen, flags); ! if (attrlen < 0){ //key not found, just return undef if(errno == ENOATTR){ Safefree(attrvalue); + errno = -attrlen; XSRETURN_UNDEF; *************** *** 91,94 **** --- 96,100 ---- setattr_warn("getxattr", attrname, errno); Safefree(attrvalue); + errno = -attrlen; XSRETURN_UNDEF; } *************** *** 121,129 **** attrlen = portable_fgetxattr(fd, attrname, attrvalue, buflen, flags); ! if (attrlen == -1){ //key not found, just return undef if(errno == ENOATTR){ Safefree(attrvalue); XSRETURN_UNDEF; --- 127,136 ---- attrlen = portable_fgetxattr(fd, attrname, attrvalue, buflen, flags); ! if (attrlen < 0){ //key not found, just return undef if(errno == ENOATTR){ Safefree(attrvalue); + errno = -attrlen; XSRETURN_UNDEF; *************** *** 132,135 **** --- 139,143 ---- setattr_warn("fgetxattr", attrname, errno); Safefree(attrvalue); + errno = -attrlen; XSRETURN_UNDEF; } *************** *** 148,153 **** const char *attrname HV * flags CODE: ! RETVAL = (portable_removexattr(path, attrname, flags) == 0); OUTPUT: --- 156,167 ---- const char *attrname HV * flags + PREINIT: + int rc; + CODE: ! rc = portable_removexattr(path, attrname, flags); ! if (rc < 0) ! errno = -rc; ! RETVAL = (rc == 0); OUTPUT: *************** *** 160,165 **** const char *attrname HV * flags CODE: ! RETVAL = (portable_fremovexattr(fd, attrname, flags) == 0); OUTPUT: --- 174,185 ---- const char *attrname HV * flags + PREINIT: + int rc; + CODE: ! rc = portable_fremovexattr(fd, attrname, flags); ! if (rc < 0) ! errno = -rc; ! RETVAL = (rc == 0); OUTPUT: *************** *** 182,187 **** size = portable_flistxattr(fd, NULL, 0, flags); ! if (size == -1) { XSRETURN_UNDEF; } else if (size == 0) --- 202,208 ---- size = portable_flistxattr(fd, NULL, 0, flags); ! if (size < 0) { + errno = -(int) size; XSRETURN_UNDEF; } else if (size == 0) *************** *** 201,207 **** // might return ERANGE. ! if (ret == -1) { free(namebuf); XSRETURN_UNDEF; } else if (ret == 0) --- 222,229 ---- // might return ERANGE. ! if (ret < 0) { free(namebuf); + errno = -ret; XSRETURN_UNDEF; } else if (ret == 0) *************** *** 244,249 **** size = portable_flistxattrns(fd, NULL, 0, flags); ! if (size == -1) { XSRETURN_UNDEF; } else if (size == 0) --- 266,272 ---- size = portable_flistxattrns(fd, NULL, 0, flags); ! if (size < 0) { + errno = -(int) size; XSRETURN_UNDEF; } else if (size == 0) *************** *** 263,269 **** // might return ERANGE. ! if (ret == -1) { free(namebuf); XSRETURN_UNDEF; } else if (ret == 0) --- 286,293 ---- // might return ERANGE. ! if (ret < 0) { free(namebuf); + errno = -ret; XSRETURN_UNDEF; } else if (ret == 0) Index: TODO =================================================================== RCS file: /cvsroot/file-extattr/File-ExtAttr/TODO,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** TODO 24 Feb 2008 10:17:48 -0000 1.21 --- TODO 6 Apr 2008 09:12:47 -0000 1.22 *************** *** 7,12 **** * for "operation not supported" note must be prefixed with "user" * buffer size, reuse buffer? ! * throw exceptions rather than warnings on getxattr() failure ! (set $@, die => need eval to catch errors? not sure I like that) * Set $! to errno in xattr operations, for use in FUSE filesystems. * symbolic link handling (O_NOFOLLOW on Mac OS X) --- 7,11 ---- * for "operation not supported" note must be prefixed with "user" * buffer size, reuse buffer? ! * Get rid of setattr_warn * Set $! to errno in xattr operations, for use in FUSE filesystems. * symbolic link handling (O_NOFOLLOW on Mac OS X) Index: Changes =================================================================== RCS file: /cvsroot/file-extattr/File-ExtAttr/Changes,v retrieving revision 1.39 retrieving revision 1.40 diff -C2 -d -r1.39 -r1.40 *** Changes 24 Feb 2008 10:17:48 -0000 1.39 --- Changes 6 Apr 2008 09:12:47 -0000 1.40 *************** *** 17,20 **** --- 17,27 ---- in Makefile.PL on that platform. + - (richdawe) Make sure that the errno value from any failed + system calls is propagated into $! (#32679, #32680). + + XXX: This is incomplete: + - Test on FreeBSD, Solaris, Mac OS X. + - Make sure I've actually addressed API concerns in #32670. + 1.07 2007-12-15 Index: extattr_linux.c =================================================================== RCS file: /cvsroot/file-extattr/File-ExtAttr/extattr_linux.c,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** extattr_linux.c 6 Apr 2007 11:35:50 -0000 1.8 --- extattr_linux.c 6 Apr 2008 09:12:47 -0000 1.9 *************** *** 117,126 **** { ret = setxattr(path, q, attrvalue, slen, xflags); free(q); } else { ! ret = -1; ! errno = ENOMEM; } --- 117,127 ---- { ret = setxattr(path, q, attrvalue, slen, xflags); + if (ret == -1) + ret = -errno; free(q); } else { ! ret = -ENOMEM; } *************** *** 152,161 **** { ret = fsetxattr(fd, q, attrvalue, slen, xflags); free(q); } else { ! ret = -1; ! errno = ENOMEM; } --- 153,163 ---- { ret = fsetxattr(fd, q, attrvalue, slen, xflags); + if (ret == -1) + ret = -errno; free(q); } else { ! ret = -ENOMEM; } *************** *** 177,186 **** { ret = getxattr(path, q, attrvalue, slen); free(q); } else { ! ret = -1; ! errno = ENOMEM; } --- 179,189 ---- { ret = getxattr(path, q, attrvalue, slen); + if (ret == -1) + ret = -errno; free(q); } else { ! ret = -ENOMEM; } *************** *** 202,211 **** { ret = fgetxattr(fd, q, attrvalue, slen); free(q); } else { ! ret = -1; ! errno = ENOMEM; } --- 205,215 ---- { ret = fgetxattr(fd, q, attrvalue, slen); + if (ret == -1) + ret = -errno; free(q); } else { ! ret = -ENOMEM; } *************** *** 226,235 **** { ret = removexattr(path, q); free(q); } else { ! ret = -1; ! errno = ENOMEM; } --- 230,240 ---- { ret = removexattr(path, q); + if (ret == -1) + ret = -errno; free(q); } else { ! ret = -ENOMEM; } *************** *** 250,259 **** { ret = fremovexattr(fd, q); free(q); } else { ! ret = -1; ! errno = ENOMEM; } --- 255,265 ---- { ret = fremovexattr(fd, q); + if (ret == -1) + ret = -errno; free(q); } else { ! ret = -ENOMEM; } *************** *** 330,335 **** else { ! errno = ERANGE; ! ret = -1; } --- 336,340 ---- else { ! ret = -ERANGE; } *************** *** 352,357 **** if (!pNS) { ! ret = -1; ! errno = ENOMEM; } --- 357,361 ---- if (!pNS) { ! ret = -ENOMEM; } *************** *** 365,390 **** slen = listxattr(path, buf, 0); ! if (slen >= 0) ! { char *sbuf; sbuf = malloc(slen); ! if (sbuf) slen = listxattr(path, sbuf, slen); ! else ! ret = -1; ! ! if (slen) ! ret = attrlist2list(sbuf, slen, buf, buflen, 1, pNS); ! else ! ret = slen; if (sbuf) free(sbuf); } - else - { - ret = slen; - } } --- 369,393 ---- slen = listxattr(path, buf, 0); ! if (slen == -1) { ! ret = -errno; ! } else if (slen >= 0) { char *sbuf; sbuf = malloc(slen); ! if (sbuf) { slen = listxattr(path, sbuf, slen); ! if (slen >= 0) { ! ret = attrlist2list(sbuf, slen, buf, buflen, 1, pNS); ! } else { ! ret = -errno; ! } ! } else { ! ret = -errno; ! slen = 0; ! } if (sbuf) free(sbuf); } } *************** *** 407,412 **** if (!pNS) { ! ret = -1; ! errno = ENOMEM; } --- 410,414 ---- if (!pNS) { ! ret = -ENOMEM; } *************** *** 420,445 **** slen = flistxattr(fd, buf, 0); ! if (slen >= 0) ! { char *sbuf; sbuf = malloc(slen); ! if (sbuf) slen = flistxattr(fd, sbuf, slen); ! else ! ret = -1; ! ! if (slen) ! ret = attrlist2list(sbuf, slen, buf, buflen, 1, pNS); ! else ! ret = slen; if (sbuf) free(sbuf); } - else - { - ret = slen; - } } --- 422,445 ---- slen = flistxattr(fd, buf, 0); ! if (slen == -1) { ! ret = -errno; ! } else if (slen >= 0) { char *sbuf; sbuf = malloc(slen); ! if (sbuf) { slen = flistxattr(fd, sbuf, slen); ! if (slen >= 0) { ! ret = attrlist2list(sbuf, slen, buf, buflen, 1, pNS); ! } else { ! ret = -errno; ! } ! } else { ! ret = -errno; ! } if (sbuf) free(sbuf); } } *************** *** 469,481 **** sbuf = malloc(slen); ! if (sbuf) slen = listxattr(path, sbuf, slen); ! else ! ret = -1; ! ! if (slen) ! ret = attrlist2list(sbuf, slen, buf, buflen, 0, NULL); ! else ! ret = slen; if (sbuf) --- 469,482 ---- sbuf = malloc(slen); ! if (sbuf) { slen = listxattr(path, sbuf, slen); ! if (slen >= 0) { ! ret = attrlist2list(sbuf, slen, buf, buflen, 0, NULL); ! } else { ! ret = -errno; ! } ! } else { ! ret = -errno; ! } if (sbuf) *************** *** 484,488 **** else { ! ret = slen; } --- 485,489 ---- else { ! ret = -errno; } *************** *** 509,521 **** sbuf = malloc(slen); ! if (sbuf) slen = flistxattr(fd, sbuf, slen); ! else ! ret = -1; ! ! if (slen) ! ret = attrlist2list(sbuf, slen, buf, buflen, 0, NULL); ! else ! ret = slen; if (sbuf) --- 510,523 ---- sbuf = malloc(slen); ! if (sbuf) { slen = flistxattr(fd, sbuf, slen); ! if (slen >= 0) { ! ret = attrlist2list(sbuf, slen, buf, buflen, 0, NULL); ! } else { ! ret = -errno; ! } ! } else { ! ret = -errno; ! } if (sbuf) *************** *** 524,528 **** else { ! ret = slen; } --- 526,530 ---- else { ! ret = -errno; } |