File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / rsync / lib / sysxattrs.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Fri Feb 17 15:09:30 2012 UTC (12 years, 5 months ago) by misho
Branches: rsync, MAIN
CVS tags: rsync3_0_9p0, RSYNC3_0_9, HEAD
rsync

    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>