[CalendarServer-changes] [152] CalendarServer/trunk/lib-patches
source_changes at macosforge.org
source_changes at macosforge.org
Mon Sep 18 19:44:07 PDT 2006
Revision: 152
Author: wsanchez at apple.com
Date: 2006-09-18 19:44:05 -0700 (Mon, 18 Sep 2006)
Log Message:
-----------
Add FreeBSD patch for xattr.
Submitted by Paul Querna, pquerna at apache.org.
Added Paths:
-----------
CalendarServer/trunk/lib-patches/xattr/
CalendarServer/trunk/lib-patches/xattr/xattr.FreeBSD.patch
Added: CalendarServer/trunk/lib-patches/xattr/xattr.FreeBSD.patch
===================================================================
--- CalendarServer/trunk/lib-patches/xattr/xattr.FreeBSD.patch (rev 0)
+++ CalendarServer/trunk/lib-patches/xattr/xattr.FreeBSD.patch 2006-09-19 02:44:05 UTC (rev 152)
@@ -0,0 +1,238 @@
+Index: Modules/xattr/_xattr.c
+===================================================================
+--- Modules/xattr/_xattr.c (revision 545)
++++ Modules/xattr/_xattr.c (working copy)
+@@ -1,6 +1,232 @@
+ #include "Python.h"
++#ifdef __FreeBSD__
++#include <sys/extattr.h>
++#else
+ #include <sys/xattr.h>
+-#ifndef XATTR_NOFOLLOW
++#endif
++
++#ifdef __FreeBSD__
++
++/* FreeBSD compatibility API */
++#define XATTR_XATTR_NOFOLLOW 0x0001
++#define XATTR_XATTR_CREATE 0x0002
++#define XATTR_XATTR_REPLACE 0x0004
++#define XATTR_XATTR_NOSECURITY 0x0008
++
++
++/* Converts a freebsd format attribute list into a NULL terminated list.
++ * While the man page on extattr_list_file says it is NULL terminated,
++ * it is actually the first byte that is the length of the
++ * following attribute.
++ */
++static void convert_bsd_list(char *namebuf, size_t size)
++{
++ size_t offset = 0;
++ while(offset < size) {
++ int length = (int) namebuf[offset];
++ memmove(namebuf+offset, namebuf+offset+1, length);
++ namebuf[offset+length] = '\0';
++ offset += length+1;
++ }
++}
++
++static ssize_t xattr_getxattr(const char *path, const char *name,
++ void *value, ssize_t size, u_int32_t position,
++ int options)
++{
++ if (position != 0 ||
++ !(options == 0 || options == XATTR_XATTR_NOFOLLOW)) {
++ return -1;
++ }
++
++ if (options & XATTR_XATTR_NOFOLLOW) {
++ return extattr_get_link(path, EXTATTR_NAMESPACE_USER,
++ name, value, size);
++ }
++ else {
++ return extattr_get_file(path, EXTATTR_NAMESPACE_USER,
++ name, value, size);
++ }
++}
++
++static ssize_t xattr_setxattr(const char *path, const char *name,
++ void *value, ssize_t size, u_int32_t position,
++ int options)
++{
++ int rv = 0;
++ int nofollow;
++
++ if (position != 0) {
++ return -1;
++ }
++
++ nofollow = options & XATTR_XATTR_NOFOLLOW;
++ options &= ~XATTR_XATTR_NOFOLLOW;
++
++ if (options == XATTR_XATTR_CREATE ||
++ options == XATTR_XATTR_REPLACE) {
++
++ /* meh. FreeBSD doesn't really have this in it's
++ * API... Oh well.
++ */
++ }
++ else if (options != 0) {
++ return -1;
++ }
++
++ if (options & XATTR_XATTR_NOFOLLOW) {
++ rv = extattr_set_link(path, EXTATTR_NAMESPACE_USER,
++ name, value, size);
++ }
++ else {
++ rv = extattr_set_file(path, EXTATTR_NAMESPACE_USER,
++ name, value, size);
++ }
++
++ /* freebsd returns the written length on success, not zero. */
++ if (rv >= 0) {
++ return 0;
++ }
++ else {
++ return rv;
++ }
++}
++
++static ssize_t xattr_removexattr(const char *path, const char *name,
++ int options)
++{
++ if (!(options == 0 ||
++ options == XATTR_XATTR_NOFOLLOW)) {
++ return -1;
++ }
++
++ if (options & XATTR_XATTR_NOFOLLOW) {
++ return extattr_delete_link(path, EXTATTR_NAMESPACE_USER, name);
++ }
++ else {
++ return extattr_delete_file(path, EXTATTR_NAMESPACE_USER, name);
++ }
++}
++
++
++static ssize_t xattr_listxattr(const char *path, char *namebuf,
++ size_t size, int options)
++{
++ ssize_t rv = 0;
++ if (!(options == 0 ||
++ options == XATTR_XATTR_NOFOLLOW)) {
++ return -1;
++ }
++
++ if (options & XATTR_XATTR_NOFOLLOW) {
++ rv = extattr_list_link(path, EXTATTR_NAMESPACE_USER, namebuf, size);
++ }
++ else {
++ rv = extattr_list_file(path, EXTATTR_NAMESPACE_USER, namebuf, size);
++ }
++
++ if (rv > 0 && namebuf) {
++ convert_bsd_list(namebuf, rv);
++ }
++
++ return rv;
++}
++
++static ssize_t xattr_fgetxattr(int fd, const char *name, void *value,
++ ssize_t size, u_int32_t position, int options)
++{
++ if (position != 0 ||
++ !(options == 0 || options == XATTR_XATTR_NOFOLLOW)) {
++ return -1;
++ }
++
++ if (options & XATTR_XATTR_NOFOLLOW) {
++ return -1;
++ }
++ else {
++ return extattr_get_fd(fd, EXTATTR_NAMESPACE_USER, name, value, size);
++ }
++}
++
++static ssize_t xattr_fsetxattr(int fd, const char *name, void *value,
++ ssize_t size, u_int32_t position, int options)
++{
++ int rv = 0;
++ int nofollow;
++
++ if (position != 0) {
++ return -1;
++ }
++
++ nofollow = options & XATTR_XATTR_NOFOLLOW;
++ options &= ~XATTR_XATTR_NOFOLLOW;
++
++ if (options == XATTR_XATTR_CREATE ||
++ options == XATTR_XATTR_REPLACE) {
++ /* freebsd noop */
++ }
++ else if (options != 0) {
++ return -1;
++ }
++
++ if (options & XATTR_XATTR_NOFOLLOW) {
++ return -1;
++ }
++ else {
++ rv = extattr_set_fd(fd, EXTATTR_NAMESPACE_USER,
++ name, value, size);
++ }
++
++ /* freebsd returns the written length on success, not zero. */
++ if (rv >= 0) {
++ return 0;
++ }
++ else {
++ return rv;
++ }
++}
++
++static ssize_t xattr_fremovexattr(int fd, const char *name, int options)
++{
++
++ if (!(options == 0 ||
++ options == XATTR_XATTR_NOFOLLOW)) {
++ return -1;
++ }
++
++ if (options & XATTR_XATTR_NOFOLLOW) {
++ return -1;
++ }
++ else {
++ return extattr_delete_fd(fd, EXTATTR_NAMESPACE_USER, name);
++ }
++}
++
++
++static ssize_t xattr_flistxattr(int fd, char *namebuf, size_t size, int options)
++{
++ ssize_t rv = 0;
++
++ if (!(options == 0 ||
++ options == XATTR_XATTR_NOFOLLOW)) {
++ return -1;
++ }
++
++ if (options & XATTR_XATTR_NOFOLLOW) {
++ return -1;
++ }
++ else {
++ rv = extattr_list_fd(fd, EXTATTR_NAMESPACE_USER, namebuf, size);
++ }
++
++ if (rv > 0 && namebuf) {
++ convert_bsd_list(namebuf, rv);
++ }
++
++ return rv;
++}
++
++#elif !defined(XATTR_NOFOLLOW)
+ /* Linux compatibility API */
+ #define XATTR_XATTR_NOFOLLOW 0x0001
+ #define XATTR_XATTR_CREATE 0x0002
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20060918/aecc4cd2/attachment.html
More information about the calendarserver-changes
mailing list