Re: Missing extattr syscalls on compat32 (was Re: libarchive extattr i386/amd64 syscall issue)

From: Kostik Belousov <kostikbel_at_gmail.com>
Date: Thu, 4 Jun 2009 16:54:02 +0300
On Wed, Jun 03, 2009 at 09:43:28PM -0700, Tim Kientzle wrote:
> Dmitry Marakasov wrote:
> >
> >The problem: on recent current, 32bit bsdtar won't write archives when
> >running under 64bit kernel, dying with exit code 140 and `Bad system call'
> >message. I've ran into that using i386 tinderbox jail on amd64 host.
> >The problem actually happens in libarchive:
> >
> >--- lib/libarchive/archive_read_disk_entry_from_file.c ---
> >   484		if (!a->follow_symlinks)
> >   485			list_size = extattr_list_link(path, 
> >   namespace, NULL, 0);   // <-- HERE
> >   486		else
> >   487			list_size = extattr_list_file(path, 
> >   namespace, NULL, 0);
> >--- lib/libarchive/archive_read_disk_entry_from_file.c ---
> 
> Yes, it looks like only about half of the extattr calls are
> actually connected in the freebsd32 compatibility layer. (see below)
> According to SVN history, peter_at_ reserved these slots back
> in December 2003 but no one ever went back and connected
> them up.  I don't know if there was a reason for not
> connecting them or if simply no one remembered to do so.
> I would guess the latter; the ones that are connected
> were all implemented before mid-2002.
> 
> I don't see any obvious reason these should not just
> work.  If you're feeling adventurous, you could try
> copying the data from /usr/src/kern/syscalls.master
> and see what happens.  I don't have a 64-bit system
> handy here or I would try this myself.
> 
> You can test by going to /usr/src/lib/libarchive/test and
> running "make check".  That will build and run the libarchive
> test suite, which does exercise the extended attribute support.
> (Of course, you should revert your change first so that the
> extended attribute support is actually compiled.)
> 
> Let me know if you find anything,
> 
> Tim
> 
> 
> $ grep extattr /usr/src/sys/compat/freebsd32/syscalls.master
> 355     AUE_EXTATTRCTL  NOPROTO { int extattrctl(const char *path, int 
> cmd, \
> 356     AUE_EXTATTR_SET_FILE    NOPROTO { int extattr_set_file( \
> 357     AUE_EXTATTR_GET_FILE    NOPROTO { ssize_t extattr_get_file( \
> 358     AUE_EXTATTR_DELETE_FILE NOPROTO { int extattr_delete_file( \
> 371     AUE_EXTATTR_SET_FD      NOPROTO { int extattr_set_fd(int fd, \
> 372     AUE_EXTATTR_GET_FD      NOPROTO { ssize_t extattr_get_fd(int fd, \
> 373     AUE_EXTATTR_DELETE_FD   NOPROTO { int extattr_delete_fd(int fd, \
> 412     AUE_EXTATTR_SET_LINK    UNIMPL  extattr_set_link
> 413     AUE_EXTATTR_GET_LINK    UNIMPL  extattr_get_link
> 414     AUE_EXTATTR_DELETE_LINK UNIMPL  extattr_delete_link
> 437     AUE_EXTATTR_LIST_FD     UNIMPL  extattr_list_fd
> 438     AUE_EXTATTR_LIST_FILE   UNIMPL  extattr_list_file
> 439     AUE_EXTATTR_LIST_LINK   UNIMPL  extattr_list_link

The size_t arguments need translation. Please try the patch below.

diff --git a/sys/compat/freebsd32/freebsd32_misc.c b/sys/compat/freebsd32/freebsd32_misc.c
index 9301b8d..e8526de 100644
--- a/sys/compat/freebsd32/freebsd32_misc.c
+++ b/sys/compat/freebsd32/freebsd32_misc.c
_at__at_ -2719,6 +2719,73 _at__at_ freebsd32_nmount(struct thread *td,
 	return error;
 }
 
+int
+freebsd32_extattr_set_link(struct thread *td,
+    struct freebsd32_extattr_set_link_args *uap)
+{
+	struct extattr_set_link_args ap;
+
+	ap.path = uap->path;
+	ap.attrnamespace = uap->attrnamespace;
+	ap.attrname = uap->attrname;
+	ap.data = uap->data;
+	ap.nbytes = uap->nbyteslo | ((size_t)uap->nbyteshi << 32);
+	return (extattr_set_link(td, &ap));
+}
+
+int
+freebsd32_extattr_get_link(struct thread *td,
+    struct freebsd32_extattr_get_link_args *uap)
+{
+	struct extattr_get_link_args ap;
+
+	ap.path = uap->path;
+	ap.attrnamespace = uap->attrnamespace;
+	ap.attrname = uap->attrname;
+	ap.data = uap->data;
+	ap.nbytes = uap->nbyteslo | ((size_t)uap->nbyteshi << 32);
+	return (extattr_get_link(td, &ap));
+}
+
+int
+freebsd32_extattr_list_fd(struct thread *td,
+    struct freebsd32_extattr_list_fd_args *uap)
+{
+	struct extattr_list_fd_args ap;
+
+	ap.fd = uap->fd;
+	ap.attrnamespace = uap->attrnamespace;
+	ap.data = uap->data;
+	ap.nbytes = uap->nbyteslo | ((size_t)uap->nbyteshi << 32);
+	return (extattr_list_fd(td, &ap));
+}
+
+int
+freebsd32_extattr_list_file(struct thread *td,
+    struct freebsd32_extattr_list_file_args *uap)
+{
+	struct extattr_list_file_args ap;
+
+	ap.path = uap->path;
+	ap.attrnamespace = uap->attrnamespace;
+	ap.data = uap->data;
+	ap.nbytes = uap->nbyteslo | ((size_t)uap->nbyteshi << 32);
+	return (extattr_list_file(td, &ap));
+}
+
+int
+freebsd32_extattr_list_link(struct thread *td,
+    struct freebsd32_extattr_list_link_args *uap)
+{
+	struct extattr_list_link_args ap;
+
+	ap.path = uap->path;
+	ap.attrnamespace = uap->attrnamespace;
+	ap.data = uap->data;
+	ap.nbytes = uap->nbyteslo | ((size_t)uap->nbyteshi << 32);
+	return (extattr_list_link(td, &ap));
+}
+
 #if 0
 int
 freebsd32_xxx(struct thread *td, struct freebsd32_xxx_args *uap)
diff --git a/sys/compat/freebsd32/freebsd32_proto.h b/sys/compat/freebsd32/freebsd32_proto.h
index 5a12c5d..4365322 100644
--- a/sys/compat/freebsd32/freebsd32_proto.h
+++ b/sys/compat/freebsd32/freebsd32_proto.h
_at__at_ -3,7 +3,7 _at__at_
  *
  * DO NOT EDIT-- this file is automatically generated.
  * $FreeBSD$
- * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 191673 2009-04-29 21:14:15Z jamie 
+ * created from FreeBSD
  */
 
 #ifndef _FREEBSD32_SYSPROTO_H_
_at__at_ -317,6 +317,22 _at__at_ struct freebsd32_sendfile_args {
 	char sbytes_l_[PADL_(off_t *)]; off_t * sbytes; char sbytes_r_[PADR_(off_t *)];
 	char flags_l_[PADL_(int)]; int flags; char flags_r_[PADR_(int)];
 };
+struct freebsd32_extattr_set_link_args {
+	char path_l_[PADL_(const char *)]; const char * path; char path_r_[PADR_(const char *)];
+	char attrnamespace_l_[PADL_(int)]; int attrnamespace; char attrnamespace_r_[PADR_(int)];
+	char attrname_l_[PADL_(const char *)]; const char * attrname; char attrname_r_[PADR_(const char *)];
+	char data_l_[PADL_(void *)]; void * data; char data_r_[PADR_(void *)];
+	char nbyteslo_l_[PADL_(u_int32_t)]; u_int32_t nbyteslo; char nbyteslo_r_[PADR_(u_int32_t)];
+	char nbyteshi_l_[PADL_(u_int32_t)]; u_int32_t nbyteshi; char nbyteshi_r_[PADR_(u_int32_t)];
+};
+struct freebsd32_extattr_get_link_args {
+	char path_l_[PADL_(const char *)]; const char * path; char path_r_[PADR_(const char *)];
+	char attrnamespace_l_[PADL_(int)]; int attrnamespace; char attrnamespace_r_[PADR_(int)];
+	char attrname_l_[PADL_(const char *)]; const char * attrname; char attrname_r_[PADR_(const char *)];
+	char data_l_[PADL_(void *)]; void * data; char data_r_[PADR_(void *)];
+	char nbyteslo_l_[PADL_(u_int32_t)]; u_int32_t nbyteslo; char nbyteslo_r_[PADR_(u_int32_t)];
+	char nbyteshi_l_[PADL_(u_int32_t)]; u_int32_t nbyteshi; char nbyteshi_r_[PADR_(u_int32_t)];
+};
 struct freebsd32_sigaction_args {
 	char sig_l_[PADL_(int)]; int sig; char sig_r_[PADR_(int)];
 	char act_l_[PADL_(struct sigaction32 *)]; struct sigaction32 * act; char act_r_[PADR_(struct sigaction32 *)];
_at__at_ -341,6 +357,27 _at__at_ struct freebsd32_umtx_lock_args {
 struct freebsd32_umtx_unlock_args {
 	char umtx_l_[PADL_(struct umtx *)]; struct umtx * umtx; char umtx_r_[PADR_(struct umtx *)];
 };
+struct freebsd32_extattr_list_fd_args {
+	char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+	char attrnamespace_l_[PADL_(int)]; int attrnamespace; char attrnamespace_r_[PADR_(int)];
+	char data_l_[PADL_(void *)]; void * data; char data_r_[PADR_(void *)];
+	char nbyteslo_l_[PADL_(u_int32_t)]; u_int32_t nbyteslo; char nbyteslo_r_[PADR_(u_int32_t)];
+	char nbyteshi_l_[PADL_(u_int32_t)]; u_int32_t nbyteshi; char nbyteshi_r_[PADR_(u_int32_t)];
+};
+struct freebsd32_extattr_list_file_args {
+	char path_l_[PADL_(const char *)]; const char * path; char path_r_[PADR_(const char *)];
+	char attrnamespace_l_[PADL_(int)]; int attrnamespace; char attrnamespace_r_[PADR_(int)];
+	char data_l_[PADL_(void *)]; void * data; char data_r_[PADR_(void *)];
+	char nbyteslo_l_[PADL_(u_int32_t)]; u_int32_t nbyteslo; char nbyteslo_r_[PADR_(u_int32_t)];
+	char nbyteshi_l_[PADL_(u_int32_t)]; u_int32_t nbyteshi; char nbyteshi_r_[PADR_(u_int32_t)];
+};
+struct freebsd32_extattr_list_link_args {
+	char path_l_[PADL_(const char *)]; const char * path; char path_r_[PADR_(const char *)];
+	char attrnamespace_l_[PADL_(int)]; int attrnamespace; char attrnamespace_r_[PADR_(int)];
+	char data_l_[PADL_(void *)]; void * data; char data_r_[PADR_(void *)];
+	char nbyteslo_l_[PADL_(u_int32_t)]; u_int32_t nbyteslo; char nbyteslo_r_[PADR_(u_int32_t)];
+	char nbyteshi_l_[PADL_(u_int32_t)]; u_int32_t nbyteshi; char nbyteshi_r_[PADR_(u_int32_t)];
+};
 struct freebsd32_thr_suspend_args {
 	char timeout_l_[PADL_(const struct timespec32 *)]; const struct timespec32 * timeout; char timeout_r_[PADR_(const struct timespec32 *)];
 };
_at__at_ -510,6 +547,8 _at__at_ int	freebsd32_aio_waitcomplete(struct thread *, struct freebsd32_aio_waitcomplet
 int	freebsd32_kevent(struct thread *, struct freebsd32_kevent_args *);
 int	freebsd32_nmount(struct thread *, struct freebsd32_nmount_args *);
 int	freebsd32_sendfile(struct thread *, struct freebsd32_sendfile_args *);
+int	freebsd32_extattr_set_link(struct thread *, struct freebsd32_extattr_set_link_args *);
+int	freebsd32_extattr_get_link(struct thread *, struct freebsd32_extattr_get_link_args *);
 int	freebsd32_sigaction(struct thread *, struct freebsd32_sigaction_args *);
 int	freebsd32_sigreturn(struct thread *, struct freebsd32_sigreturn_args *);
 int	freebsd32_getcontext(struct thread *, struct freebsd32_getcontext_args *);
_at__at_ -517,6 +556,9 _at__at_ int	freebsd32_setcontext(struct thread *, struct freebsd32_setcontext_args *);
 int	freebsd32_swapcontext(struct thread *, struct freebsd32_swapcontext_args *);
 int	freebsd32_umtx_lock(struct thread *, struct freebsd32_umtx_lock_args *);
 int	freebsd32_umtx_unlock(struct thread *, struct freebsd32_umtx_unlock_args *);
+int	freebsd32_extattr_list_fd(struct thread *, struct freebsd32_extattr_list_fd_args *);
+int	freebsd32_extattr_list_file(struct thread *, struct freebsd32_extattr_list_file_args *);
+int	freebsd32_extattr_list_link(struct thread *, struct freebsd32_extattr_list_link_args *);
 int	freebsd32_thr_suspend(struct thread *, struct freebsd32_thr_suspend_args *);
 int	freebsd32_umtx_op(struct thread *, struct freebsd32_umtx_op_args *);
 int	freebsd32_thr_new(struct thread *, struct freebsd32_thr_new_args *);
_at__at_ -739,6 +781,8 _at__at_ int	freebsd6_freebsd32_ftruncate(struct thread *, struct freebsd6_freebsd32_ftru
 #define	FREEBSD32_SYS_AUE_freebsd32_kevent	AUE_NULL
 #define	FREEBSD32_SYS_AUE_freebsd32_nmount	AUE_NMOUNT
 #define	FREEBSD32_SYS_AUE_freebsd32_sendfile	AUE_SENDFILE
+#define	FREEBSD32_SYS_AUE_freebsd32_extattr_set_link	AUE_EXTATTR_SET_LINK
+#define	FREEBSD32_SYS_AUE_freebsd32_extattr_get_link	AUE_EXTATTR_GET_LINK
 #define	FREEBSD32_SYS_AUE_freebsd32_sigaction	AUE_SIGACTION
 #define	FREEBSD32_SYS_AUE_freebsd32_sigreturn	AUE_SIGRETURN
 #define	FREEBSD32_SYS_AUE_freebsd32_getcontext	AUE_NULL
_at__at_ -746,6 +790,9 _at__at_ int	freebsd6_freebsd32_ftruncate(struct thread *, struct freebsd6_freebsd32_ftru
 #define	FREEBSD32_SYS_AUE_freebsd32_swapcontext	AUE_NULL
 #define	FREEBSD32_SYS_AUE_freebsd32_umtx_lock	AUE_NULL
 #define	FREEBSD32_SYS_AUE_freebsd32_umtx_unlock	AUE_NULL
+#define	FREEBSD32_SYS_AUE_freebsd32_extattr_list_fd	AUE_EXTATTR_LIST_FD
+#define	FREEBSD32_SYS_AUE_freebsd32_extattr_list_file	AUE_EXTATTR_LIST_FILE
+#define	FREEBSD32_SYS_AUE_freebsd32_extattr_list_link	AUE_EXTATTR_LIST_LINK
 #define	FREEBSD32_SYS_AUE_freebsd32_thr_suspend	AUE_NULL
 #define	FREEBSD32_SYS_AUE_freebsd32_umtx_op	AUE_NULL
 #define	FREEBSD32_SYS_AUE_freebsd32_thr_new	AUE_NULL
diff --git a/sys/compat/freebsd32/freebsd32_syscall.h b/sys/compat/freebsd32/freebsd32_syscall.h
index 73fc7b3..c320178 100644
--- a/sys/compat/freebsd32/freebsd32_syscall.h
+++ b/sys/compat/freebsd32/freebsd32_syscall.h
_at__at_ -3,7 +3,7 _at__at_
  *
  * DO NOT EDIT-- this file is automatically generated.
  * $FreeBSD$
- * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 191673 2009-04-29 21:14:15Z jamie 
+ * created from FreeBSD
  */
 
 #define	FREEBSD32_SYS_syscall	0
_at__at_ -303,6 +303,9 _at__at_
 #define	FREEBSD32_SYS_statfs	396
 #define	FREEBSD32_SYS_fstatfs	397
 #define	FREEBSD32_SYS_fhstatfs	398
+#define	FREEBSD32_SYS_freebsd32_extattr_set_link	412
+#define	FREEBSD32_SYS_freebsd32_extattr_get_link	413
+#define	FREEBSD32_SYS_extattr_delete_link	414
 #define	FREEBSD32_SYS_freebsd32_sigaction	416
 #define	FREEBSD32_SYS_freebsd32_sigreturn	417
 #define	FREEBSD32_SYS_freebsd32_getcontext	421
_at__at_ -315,6 +318,9 _at__at_
 #define	FREEBSD32_SYS_freebsd32_umtx_lock	434
 #define	FREEBSD32_SYS_freebsd32_umtx_unlock	435
 #define	FREEBSD32_SYS_jail_attach	436
+#define	FREEBSD32_SYS_freebsd32_extattr_list_fd	437
+#define	FREEBSD32_SYS_freebsd32_extattr_list_file	438
+#define	FREEBSD32_SYS_freebsd32_extattr_list_link	439
 #define	FREEBSD32_SYS_freebsd32_thr_suspend	442
 #define	FREEBSD32_SYS_thr_wake	443
 #define	FREEBSD32_SYS_kldunloadf	444
diff --git a/sys/compat/freebsd32/freebsd32_syscalls.c b/sys/compat/freebsd32/freebsd32_syscalls.c
index c31d080..ed0d24f 100644
--- a/sys/compat/freebsd32/freebsd32_syscalls.c
+++ b/sys/compat/freebsd32/freebsd32_syscalls.c
_at__at_ -3,7 +3,7 _at__at_
  *
  * DO NOT EDIT-- this file is automatically generated.
  * $FreeBSD$
- * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 191673 2009-04-29 21:14:15Z jamie 
+ * created from FreeBSD
  */
 
 const char *freebsd32_syscallnames[] = {
_at__at_ -419,9 +419,9 _at__at_ const char *freebsd32_syscallnames[] = {
 	"#409",			/* 409 = __mac_get_pid */
 	"#410",			/* 410 = __mac_get_link */
 	"#411",			/* 411 = __mac_set_link */
-	"#412",			/* 412 = extattr_set_link */
-	"#413",			/* 413 = extattr_get_link */
-	"#414",			/* 414 = extattr_delete_link */
+	"freebsd32_extattr_set_link",			/* 412 = freebsd32_extattr_set_link */
+	"freebsd32_extattr_get_link",			/* 413 = freebsd32_extattr_get_link */
+	"extattr_delete_link",			/* 414 = extattr_delete_link */
 	"#415",			/* 415 = __mac_execve */
 	"freebsd32_sigaction",			/* 416 = freebsd32_sigaction */
 	"freebsd32_sigreturn",			/* 417 = freebsd32_sigreturn */
_at__at_ -444,9 +444,9 _at__at_ const char *freebsd32_syscallnames[] = {
 	"freebsd32_umtx_lock",			/* 434 = freebsd32_umtx_lock */
 	"freebsd32_umtx_unlock",			/* 435 = freebsd32_umtx_unlock */
 	"jail_attach",			/* 436 = jail_attach */
-	"#437",			/* 437 = extattr_list_fd */
-	"#438",			/* 438 = extattr_list_file */
-	"#439",			/* 439 = extattr_list_link */
+	"freebsd32_extattr_list_fd",			/* 437 = freebsd32_extattr_list_fd */
+	"freebsd32_extattr_list_file",			/* 438 = freebsd32_extattr_list_file */
+	"freebsd32_extattr_list_link",			/* 439 = freebsd32_extattr_list_link */
 	"#440",			/* 440 = kse_switchin */
 	"#441",			/* 441 = ksem_timedwait */
 	"freebsd32_thr_suspend",			/* 442 = freebsd32_thr_suspend */
diff --git a/sys/compat/freebsd32/freebsd32_sysent.c b/sys/compat/freebsd32/freebsd32_sysent.c
index a44eb58..6e3a787 100644
--- a/sys/compat/freebsd32/freebsd32_sysent.c
+++ b/sys/compat/freebsd32/freebsd32_sysent.c
_at__at_ -3,7 +3,7 _at__at_
  *
  * DO NOT EDIT-- this file is automatically generated.
  * $FreeBSD$
- * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 191673 2009-04-29 21:14:15Z jamie 
+ * created from FreeBSD
  */
 
 #include "opt_compat.h"
_at__at_ -450,9 +450,9 _at__at_ struct sysent freebsd32_sysent[] = {
 	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 },			/* 409 = __mac_get_pid */
 	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 },			/* 410 = __mac_get_link */
 	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 },			/* 411 = __mac_set_link */
-	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 },			/* 412 = extattr_set_link */
-	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 },			/* 413 = extattr_get_link */
-	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 },			/* 414 = extattr_delete_link */
+	{ AS(freebsd32_extattr_set_link_args), (sy_call_t *)freebsd32_extattr_set_link, AUE_EXTATTR_SET_LINK, NULL, 0, 0, 0 },	/* 412 = freebsd32_extattr_set_link */
+	{ AS(freebsd32_extattr_get_link_args), (sy_call_t *)freebsd32_extattr_get_link, AUE_EXTATTR_GET_LINK, NULL, 0, 0, 0 },	/* 413 = freebsd32_extattr_get_link */
+	{ AS(extattr_delete_link_args), (sy_call_t *)extattr_delete_link, AUE_EXTATTR_DELETE_LINK, NULL, 0, 0, 0 },	/* 414 = extattr_delete_link */
 	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 },			/* 415 = __mac_execve */
 	{ AS(freebsd32_sigaction_args), (sy_call_t *)freebsd32_sigaction, AUE_SIGACTION, NULL, 0, 0, 0 },	/* 416 = freebsd32_sigaction */
 	{ AS(freebsd32_sigreturn_args), (sy_call_t *)freebsd32_sigreturn, AUE_SIGRETURN, NULL, 0, 0, 0 },	/* 417 = freebsd32_sigreturn */
_at__at_ -475,9 +475,9 _at__at_ struct sysent freebsd32_sysent[] = {
 	{ AS(freebsd32_umtx_lock_args), (sy_call_t *)freebsd32_umtx_lock, AUE_NULL, NULL, 0, 0, 0 },	/* 434 = freebsd32_umtx_lock */
 	{ AS(freebsd32_umtx_unlock_args), (sy_call_t *)freebsd32_umtx_unlock, AUE_NULL, NULL, 0, 0, 0 },	/* 435 = freebsd32_umtx_unlock */
 	{ AS(jail_attach_args), (sy_call_t *)jail_attach, AUE_NULL, NULL, 0, 0, 0 },	/* 436 = jail_attach */
-	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 },			/* 437 = extattr_list_fd */
-	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 },			/* 438 = extattr_list_file */
-	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 },			/* 439 = extattr_list_link */
+	{ AS(freebsd32_extattr_list_fd_args), (sy_call_t *)freebsd32_extattr_list_fd, AUE_EXTATTR_LIST_FD, NULL, 0, 0, 0 },	/* 437 = freebsd32_extattr_list_fd */
+	{ AS(freebsd32_extattr_list_file_args), (sy_call_t *)freebsd32_extattr_list_file, AUE_EXTATTR_LIST_FILE, NULL, 0, 0, 0 },	/* 438 = freebsd32_extattr_list_file */
+	{ AS(freebsd32_extattr_list_link_args), (sy_call_t *)freebsd32_extattr_list_link, AUE_EXTATTR_LIST_LINK, NULL, 0, 0, 0 },	/* 439 = freebsd32_extattr_list_link */
 	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 },			/* 440 = kse_switchin */
 	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 },			/* 441 = ksem_timedwait */
 	{ AS(freebsd32_thr_suspend_args), (sy_call_t *)freebsd32_thr_suspend, AUE_NULL, NULL, 0, 0, 0 },	/* 442 = freebsd32_thr_suspend */
diff --git a/sys/compat/freebsd32/syscalls.master b/sys/compat/freebsd32/syscalls.master
index 50e30ad..234f3f1 100644
--- a/sys/compat/freebsd32/syscalls.master
+++ b/sys/compat/freebsd32/syscalls.master
_at__at_ -708,9 +708,17 _at__at_
 409	AUE_NULL	UNIMPL	__mac_get_pid
 410	AUE_NULL	UNIMPL	__mac_get_link
 411	AUE_NULL	UNIMPL	__mac_set_link
-412	AUE_EXTATTR_SET_LINK	UNIMPL	extattr_set_link
-413	AUE_EXTATTR_GET_LINK	UNIMPL	extattr_get_link
-414	AUE_EXTATTR_DELETE_LINK	UNIMPL	extattr_delete_link
+412	AUE_EXTATTR_SET_LINK	STD	{ int freebsd32_extattr_set_link( \
+				    const char *path, int attrnamespace, \
+				    const char *attrname, void *data, \
+				    u_int32_t nbyteslo, u_int32_t nbyteshi); }
+413	AUE_EXTATTR_GET_LINK	STD	{ ssize_t freebsd32_extattr_get_link( \
+				    const char *path, int attrnamespace, \
+				    const char *attrname, void *data, \
+				    u_int32_t nbyteslo, u_int32_t nbyteshi); }
+414	AUE_EXTATTR_DELETE_LINK	NOPROTO	{ int extattr_delete_link( \
+				    const char *path, int attrnamespace, \
+				    const char *attrname); }
 415	AUE_NULL	UNIMPL	__mac_execve
 416	AUE_SIGACTION	STD	{ int freebsd32_sigaction(int sig, \
 				    struct sigaction32 *act, \
_at__at_ -741,9 +749,17 _at__at_
 434	AUE_NULL	STD	{ int freebsd32_umtx_lock(struct umtx *umtx); }
 435	AUE_NULL	STD	{ int freebsd32_umtx_unlock(struct umtx *umtx); }
 436	AUE_NULL	NOPROTO	{ int jail_attach(int jid); }
-437	AUE_EXTATTR_LIST_FD	UNIMPL	extattr_list_fd
-438	AUE_EXTATTR_LIST_FILE	UNIMPL	extattr_list_file
-439	AUE_EXTATTR_LIST_LINK	UNIMPL	extattr_list_link
+437	AUE_EXTATTR_LIST_FD	STD	{ ssize_t freebsd32_extattr_list_fd( \
+				    int fd, int attrnamespace, void *data, \
+				    u_int32_t nbyteslo, u_int32_t nbyteshi); }
+438	AUE_EXTATTR_LIST_FILE	STD	{ ssize_t freebsd32_extattr_list_file( \
+				    const char *path, int attrnamespace, \
+				    void *data, u_int32_t nbyteslo, \
+				    u_int32_t nbyteshi); }
+439	AUE_EXTATTR_LIST_LINK	STD	{ ssize_t freebsd32_extattr_list_link( \
+				    const char *path, int attrnamespace, \
+				    void *data, u_int32_t nbyteslo, \
+				    u_int32_t nbyteshi); }
 440	AUE_NULL	UNIMPL	kse_switchin
 441	AUE_NULL	UNIMPL	ksem_timedwait
 442	AUE_NULL	STD	{ int freebsd32_thr_suspend( \

Received on Thu Jun 04 2009 - 11:54:09 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:49 UTC