Annotation of embedaddon/rsync/lib/sysxattrs.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Extended attribute support for rsync.
! 3: *
! 4: * Copyright (C) 2004 Red Hat, Inc.
! 5: * Copyright (C) 2003-2008 Wayne Davison
! 6: * Written by Jay Fenlason.
! 7: *
! 8: * This program is free software; you can redistribute it and/or modify
! 9: * it under the terms of the GNU General Public License as published by
! 10: * the Free Software Foundation; either version 3 of the License, or
! 11: * (at your option) any later version.
! 12: *
! 13: * This program is distributed in the hope that it will be useful,
! 14: * but WITHOUT ANY WARRANTY; without even the implied warranty of
! 15: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 16: * GNU General Public License for more details.
! 17: *
! 18: * You should have received a copy of the GNU General Public License along
! 19: * with this program; if not, visit the http://fsf.org website.
! 20: */
! 21:
! 22: #include "rsync.h"
! 23: #include "sysxattrs.h"
! 24:
! 25: #ifdef SUPPORT_XATTRS
! 26:
! 27: #if defined HAVE_LINUX_XATTRS
! 28:
! 29: ssize_t sys_lgetxattr(const char *path, const char *name, void *value, size_t size)
! 30: {
! 31: return lgetxattr(path, name, value, size);
! 32: }
! 33:
! 34: ssize_t sys_fgetxattr(int filedes, const char *name, void *value, size_t size)
! 35: {
! 36: return fgetxattr(filedes, name, value, size);
! 37: }
! 38:
! 39: int sys_lsetxattr(const char *path, const char *name, const void *value, size_t size)
! 40: {
! 41: return lsetxattr(path, name, value, size, 0);
! 42: }
! 43:
! 44: int sys_lremovexattr(const char *path, const char *name)
! 45: {
! 46: return lremovexattr(path, name);
! 47: }
! 48:
! 49: ssize_t sys_llistxattr(const char *path, char *list, size_t size)
! 50: {
! 51: return llistxattr(path, list, size);
! 52: }
! 53:
! 54: #elif HAVE_OSX_XATTRS
! 55:
! 56: ssize_t sys_lgetxattr(const char *path, const char *name, void *value, size_t size)
! 57: {
! 58: return getxattr(path, name, value, size, 0, XATTR_NOFOLLOW);
! 59: }
! 60:
! 61: ssize_t sys_fgetxattr(int filedes, const char *name, void *value, size_t size)
! 62: {
! 63: return fgetxattr(filedes, name, value, size, 0, 0);
! 64: }
! 65:
! 66: int sys_lsetxattr(const char *path, const char *name, const void *value, size_t size)
! 67: {
! 68: return setxattr(path, name, value, size, 0, XATTR_NOFOLLOW);
! 69: }
! 70:
! 71: int sys_lremovexattr(const char *path, const char *name)
! 72: {
! 73: return removexattr(path, name, XATTR_NOFOLLOW);
! 74: }
! 75:
! 76: ssize_t sys_llistxattr(const char *path, char *list, size_t size)
! 77: {
! 78: return listxattr(path, list, size, XATTR_NOFOLLOW);
! 79: }
! 80:
! 81: #elif HAVE_FREEBSD_XATTRS
! 82:
! 83: ssize_t sys_lgetxattr(const char *path, const char *name, void *value, size_t size)
! 84: {
! 85: return extattr_get_link(path, EXTATTR_NAMESPACE_USER, name, value, size);
! 86: }
! 87:
! 88: ssize_t sys_fgetxattr(int filedes, const char *name, void *value, size_t size)
! 89: {
! 90: return extattr_get_fd(filedes, EXTATTR_NAMESPACE_USER, name, value, size);
! 91: }
! 92:
! 93: int sys_lsetxattr(const char *path, const char *name, const void *value, size_t size)
! 94: {
! 95: return extattr_set_link(path, EXTATTR_NAMESPACE_USER, name, value, size);
! 96: }
! 97:
! 98: int sys_lremovexattr(const char *path, const char *name)
! 99: {
! 100: return extattr_delete_link(path, EXTATTR_NAMESPACE_USER, name);
! 101: }
! 102:
! 103: ssize_t sys_llistxattr(const char *path, char *list, size_t size)
! 104: {
! 105: unsigned char keylen;
! 106: ssize_t off, len = extattr_list_link(path, EXTATTR_NAMESPACE_USER, list, size);
! 107:
! 108: if (len <= 0 || (size_t)len > size)
! 109: return len;
! 110:
! 111: /* FreeBSD puts a single-byte length before each string, with no '\0'
! 112: * terminator. We need to change this into a series of null-terminted
! 113: * strings. Since the size is the same, we can simply transform the
! 114: * output in place. */
! 115: for (off = 0; off < len; off += keylen + 1) {
! 116: keylen = ((unsigned char*)list)[off];
! 117: if (off + keylen >= len) {
! 118: /* Should be impossible, but kernel bugs happen! */
! 119: errno = EINVAL;
! 120: return -1;
! 121: }
! 122: memmove(list+off, list+off+1, keylen);
! 123: list[off+keylen] = '\0';
! 124: }
! 125:
! 126: return len;
! 127: }
! 128:
! 129: #else
! 130:
! 131: #error You need to create xattr compatibility functions.
! 132:
! 133: #endif
! 134:
! 135: #endif /* SUPPORT_XATTRS */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>