summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--extra/Configs/Config.in10
-rw-r--r--include/sys/xattr.h104
-rw-r--r--libc/sysdeps/linux/common/Makefile9
-rw-r--r--libc/sysdeps/linux/common/mincore.c15
-rw-r--r--libc/sysdeps/linux/common/xattr.c71
5 files changed, 207 insertions, 2 deletions
diff --git a/extra/Configs/Config.in b/extra/Configs/Config.in
index 56f794912..6969bdb5e 100644
--- a/extra/Configs/Config.in
+++ b/extra/Configs/Config.in
@@ -526,6 +526,16 @@ config UCLIBC_TZ_FILE_PATH
Most people will use the default of '/etc/TZ'.
+config UCLIBC_XATTR
+ bool "Extended Attributes"
+ default n
+ help
+ Extended attributes are name:value pairs associated with inodes (files,
+ directories, symlinks, etc). They are extensions to the normal attributes
+ which are associated with all inodes in the system.
+ Most people should answer N.
+ Selinux users will want to say Y here.
+
endmenu
menu "Networking Support"
diff --git a/include/sys/xattr.h b/include/sys/xattr.h
new file mode 100644
index 000000000..2737f90bd
--- /dev/null
+++ b/include/sys/xattr.h
@@ -0,0 +1,104 @@
+/* Copyright (C) 2002 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#ifndef _SYS_XATTR_H
+#define _SYS_XATTR_H 1
+
+#include <features.h>
+#include <sys/types.h>
+
+
+__BEGIN_DECLS
+
+/* The following constants should be used for the fifth parameter of
+ `*setxattr'. */
+enum
+{
+ XATTR_CREATE = 1, /* set value, fail if attr already exists. */
+#define XATTR_CREATE XATTR_CREATE
+ XATTR_REPLACE = 2 /* set value, fail if attr does not exist. */
+#define XATTR_REPLACE XATTR_REPLACE
+};
+
+/* Set the attribute NAME of the file pointed to by PATH to VALUE (which
+ is SIZE bytes long). Return 0 on success, -1 for errors. */
+extern int setxattr (__const char *__path, __const char *__name,
+ __const void *__value, size_t __size, int __flags)
+ __THROW;
+
+/* Set the attribute NAME of the file pointed to by PATH to VALUE (which is
+ SIZE bytes long), not following symlinks for the last pathname component.
+ Return 0 on success, -1 for errors. */
+extern int lsetxattr (__const char *__path, __const char *__name,
+ __const void *__value, size_t __size, int __flags)
+ __THROW;
+
+/* Set the attribute NAME of the file descriptor FD to VALUE (which is SIZE
+ bytes long). Return 0 on success, -1 for errors. */
+extern int fsetxattr (int __fd, __const char *__name, __const void *__value,
+ size_t __size, int __flags) __THROW;
+
+/* Get the attribute NAME of the file pointed to by PATH to VALUE (which is
+ SIZE bytes long). Return 0 on success, -1 for errors. */
+extern ssize_t getxattr (__const char *__path, __const char *__name,
+ void *__value, size_t __size) __THROW;
+
+/* Get the attribute NAME of the file pointed to by PATH to VALUE (which is
+ SIZE bytes long), not following symlinks for the last pathname component.
+ Return 0 on success, -1 for errors. */
+extern ssize_t lgetxattr (__const char *__path, __const char *__name,
+ void *__value, size_t __size) __THROW;
+
+/* Get the attribute NAME of the file descriptor FD to VALUE (which is SIZE
+ bytes long). Return 0 on success, -1 for errors. */
+extern ssize_t fgetxattr (int __fd, __const char *__name, void *__value,
+ size_t __size) __THROW;
+
+/* List attributes of the file pointed to by PATH into the user-supplied
+ buffer LIST (which is SIZE bytes big). Return 0 on success, -1 for
+ errors. */
+extern ssize_t listxattr (__const char *__path, char *__list, size_t __size)
+ __THROW;
+
+/* List attributes of the file pointed to by PATH into the user-supplied
+ buffer LIST (which is SIZE bytes big), not following symlinks for the
+ last pathname component. Return 0 on success, -1 for errors. */
+extern ssize_t llistxattr (__const char *__path, char *__list, size_t __size)
+ __THROW;
+
+/* List attributes of the file descriptor FD into the user-supplied buffer
+ LIST (which is SIZE bytes big). Return 0 on success, -1 for errors. */
+extern ssize_t flistxattr (int __fd, char *__list, size_t __size)
+ __THROW;
+
+/* Remove the attribute NAME from the file pointed to by PATH. Return 0
+ on success, -1 for errors. */
+extern int removexattr (__const char *__path, __const char *__name) __THROW;
+
+/* Remove the attribute NAME from the file pointed to by PATH, not
+ following symlinks for the last pathname component. Return 0 on
+ success, -1 for errors. */
+extern int lremovexattr (__const char *__path, __const char *__name) __THROW;
+
+/* Remove the attribute NAME from the file descriptor FD. Return 0 on
+ success, -1 for errors. */
+extern int fremovexattr (int __fd, __const char *__name) __THROW;
+
+__END_DECLS
+
+#endif /* sys/xattr.h */
diff --git a/libc/sysdeps/linux/common/Makefile b/libc/sysdeps/linux/common/Makefile
index a6be4307e..ddd015f7c 100644
--- a/libc/sysdeps/linux/common/Makefile
+++ b/libc/sysdeps/linux/common/Makefile
@@ -32,8 +32,8 @@ CSRC= __rt_sigtimedwait.c __socketcall.c __syscall_fcntl.c \
getpgid.c getpgrp.c getpid.c getppid.c getpriority.c getresgid.c \
getresuid.c getrlimit.c getrlimit64.c getrusage.c getsid.c \
gettimeofday.c getuid.c init_module.c ioctl.c ioperm.c iopl.c \
- kill.c klogctl.c lchown.c link.c llseek.c longjmp.c lseek.c \
- lstat.c lstat64.c madvise.c mkdir.c mkfifo.c mknod.c mlock.c \
+ kill.c klogctl.c lchown.c link.c llseek.c longjmp.c lseek.c lstat.c \
+ lstat64.c madvise.c mkdir.c mkfifo.c mincore.c mknod.c mlock.c \
mlockall.c mmap.c mmap64.c modify_ldt.c mount.c mprotect.c \
mremap.c msync.c munlock.c munlockall.c munmap.c nanosleep.c \
nice.c noophooks.c ntp_gettime.c open.c open64.c pause.c \
@@ -60,6 +60,11 @@ endif
ifeq ($(strip $(UCLIBC_PROPOLICE)),y)
CSRC+=ssp.c
endif
+
+ifeq ($(strip $(UCLIBC_XATTR)),y)
+CSRC+=xattr.c
+endif
+
COBJS=$(patsubst %.c,%.o, $(CSRC))
OBJ=$(COBJS) $(MOBJ)
diff --git a/libc/sysdeps/linux/common/mincore.c b/libc/sysdeps/linux/common/mincore.c
new file mode 100644
index 000000000..ecae441a5
--- /dev/null
+++ b/libc/sysdeps/linux/common/mincore.c
@@ -0,0 +1,15 @@
+/*
+ * Distributed under the terms of the GNU General Public License v2
+ * $Header: /var/cvs/uClibc/libc/sysdeps/linux/common/mincore.c,v 1.1 2004/12/20 00:10:51 solar Exp $
+ *
+ * This file provides the mincore() system call to uClibc.
+ * 20041215 - <solar@gentoo.org>
+ *
+ */
+
+#include "syscalls.h"
+#include <unistd.h>
+
+#ifdef __NR_mincore
+_syscall3(int, mincore, void *, start, size_t, length, unsigned char *, vec);
+#endif
diff --git a/libc/sysdeps/linux/common/xattr.c b/libc/sysdeps/linux/common/xattr.c
new file mode 100644
index 000000000..c5aa69be3
--- /dev/null
+++ b/libc/sysdeps/linux/common/xattr.c
@@ -0,0 +1,71 @@
+/*
+ * Distributed under the terms of the GNU General Public License v2
+ * $Header: /var/cvs/uClibc/libc/sysdeps/linux/common/xattr.c,v 1.1 2004/12/20 00:10:51 solar Exp $
+ *
+ * This file provides the following Extended Attribute system calls to uClibc.
+ *
+ * setxattr(), lsetxattr(), fsetxattr(),
+ * getxattr(), lgetxattr(), fgetxattr(),
+ * listxattr(), llistxattr(), flistxattr(),
+ * removexattr(), lremovexattr(), fremovexattr()
+ *
+ * 20041215 - <solar@gentoo.org>
+ */
+
+#include "syscalls.h"
+#include <unistd.h>
+
+#ifdef __NR_setxattr
+_syscall5(int, setxattr, const char *, path, const char *, name, const void *,
+ value, size_t, size, int, flags);
+#endif
+
+#ifdef __NR_lsetxattr
+_syscall5(int, lsetxattr, const char *, path, const char *, name, const void *,
+ value, size_t, size, int, flags);
+#endif
+
+#ifdef __NR_fsetxattr
+_syscall5(int, fsetxattr, int, filedes, const char *, name, const void *,
+ value, size_t, size, int, flags);
+#endif
+
+#ifdef __NR_getxattr
+_syscall4(ssize_t, getxattr, const char *, path, const char *, name,
+ void *, value, size_t, size);
+#endif
+
+#ifdef __NR_lgetxattr
+_syscall4(ssize_t, lgetxattr, const char *, path, const char *, name, void *,
+ value, size_t, size);
+#endif
+
+#ifdef __NR_fgetxattr
+_syscall4(ssize_t, fgetxattr, int, filedes, const char *, name, void *, value,
+ size_t, size);
+#endif
+
+#ifdef __NR_listxattr
+_syscall3(ssize_t, listxattr, const char *, path, char *, list, size_t, size);
+#endif
+
+#ifdef __NR_llistxattr
+_syscall3(ssize_t, llistxattr, const char *, path, char *, list, size_t,
+ size);
+#endif
+
+#ifdef __NR_flistxattr
+_syscall3(size_t, flistxattr, int, filedes, char *, list, size_t, size);
+#endif
+
+#ifdef __NR_removexattr
+_syscall2(int, removexattr, const char *, path, const char *, name);
+#endif
+
+#ifdef __NR_lremovexattr
+_syscall2(int, lremovexattr, const char *, path, const char *, name);
+#endif
+
+#ifdef __NR_fremovexattr
+_syscall2(int, fremovexattr, int, filedes, const char *, name);
+#endif