From: Richard D. <ric...@us...> - 2006-10-02 19:53:12
|
Update of /cvsroot/file-extattr/File-ExtAttr In directory sc8-pr-cvs5.sourceforge.net:/tmp/cvs-serv12304 Modified Files: extattr_solaris.c extattr_solaris.h Log Message: Solaris support for listfattrns Index: extattr_solaris.h =================================================================== RCS file: /cvsroot/file-extattr/File-ExtAttr/extattr_solaris.h,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** extattr_solaris.h 28 Aug 2006 11:45:40 -0000 1.3 --- extattr_solaris.h 2 Oct 2006 19:53:06 -0000 1.4 *************** *** 58,60 **** --- 58,70 ---- struct hv *flags); + ssize_t solaris_listxattrns (const char *path, + char *buf, + const size_t buflen, + struct hv *flags); + + ssize_t solaris_flistxattrns (const int fd, + char *buf, + const size_t buflen, + struct hv *flags); + #endif /* EXTATTR_SOLARIS_H */ Index: extattr_solaris.c =================================================================== RCS file: /cvsroot/file-extattr/File-ExtAttr/extattr_solaris.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** extattr_solaris.c 1 Oct 2006 08:02:49 -0000 1.5 --- extattr_solaris.c 2 Oct 2006 19:53:06 -0000 1.6 *************** *** 153,156 **** --- 153,158 ---- if ((attrdirfd >= 0) && (close(attrdirfd) == -1) && !saved_errno) saved_errno = errno; + if (dirp && (closedir(dirp) == -1) && !saved_errno) + saved_errno = errno; if (saved_errno) errno = saved_errno; *************** *** 159,162 **** --- 161,236 ---- } + static int + hasattrclose (const int attrdirfd) + { + int saved_errno = 0; + int ret = 0; /* Not by default */ + DIR *dirp; + + if (attrdirfd == -1) + ret = -1; + + if (ret >= 0) + dirp = fdopendir(attrdirfd); + + if (ret >= 0) + { + struct dirent *de; + + while ((de = readdir(dirp))) + { + /* Ignore "." and ".." entries */ + if (!strcmp(de->d_name, ".") || !strcmp(de->d_name, "..")) + continue; + + /* Found a file */ + ret = 1; + break; + } + } + + if (ret == -1) + saved_errno = errno; + if ((attrdirfd >= 0) && (close(attrdirfd) == -1) && !saved_errno) + saved_errno = errno; + if (dirp && (closedir(dirp) == -1) && !saved_errno) + saved_errno = errno; + if (saved_errno) + errno = saved_errno; + + return ret; + } + + /* + * Solaris doesn't support namespacing attributes. So if there are + * any attributes, return the namespace "user". + */ + static + ssize_t listxattrns (const int attrdirfd, char *buf, const size_t buflen) + { + ssize_t ret = hasattrclose(attrdirfd); + if (ret > 0) + { + static const char NAMESPACE_USER[] = "user"; + + if (buflen >= sizeof(NAMESPACE_USER)) + { + memcpy(buf, NAMESPACE_USER, sizeof(NAMESPACE_USER)); + ret = sizeof(NAMESPACE_USER); + } + else if (buflen == 0) + { + ret = sizeof(NAMESPACE_USER); + } + else + { + ret = -1; + errno = ERANGE; + } + } + + return ret; + } + int solaris_setxattr (const char *path, *************** *** 356,358 **** --- 430,450 ---- } + ssize_t solaris_listxattrns (const char *path, + char *buf, + const size_t buflen, + struct hv *flags) + { + int attrdirfd = attropen(path, ".", O_RDONLY); + return listxattrns(attrdirfd, buf, buflen); + } + + ssize_t solaris_flistxattrns (const int fd, + char *buf, + const size_t buflen, + struct hv *flags) + { + int attrdirfd = openat(fd, ".", O_RDONLY|O_XATTR); + return listxattrns(attrdirfd, buf, buflen); + } + #endif /* EXTATTR_SOLARIS */ |