bin/129855: commit references a PR

dfilter service dfilter at FreeBSD.ORG
Wed Jun 24 21:20:07 UTC 2009


The following reply was made to PR bin/129855; it has been noted by GNATS.

From: dfilter at FreeBSD.ORG (dfilter service)
To: bug-followup at FreeBSD.org
Cc:  
Subject: Re: bin/129855: commit references a PR
Date: Wed, 24 Jun 2009 21:11:11 +0000 (UTC)

 Author: jhb
 Date: Wed Jun 24 21:10:52 2009
 New Revision: 194910
 URL: http://svn.freebsd.org/changeset/base/194910
 
 Log:
   Change the ABI of some of the structures used by the SYSV IPC API:
   - The uid/cuid members of struct ipc_perm are now uid_t instead of unsigned
     short.
   - The gid/cgid members of struct ipc_perm are now gid_t instead of unsigned
     short.
   - The mode member of struct ipc_perm is now mode_t instead of unsigned short
     (this is merely a style bug).
   - The rather dubious padding fields for ABI compat with SV/I386 have been
     removed from struct msqid_ds and struct semid_ds.
   - The shm_segsz member of struct shmid_ds is now a size_t instead of an
     int.  This removes the need for the shm_bsegsz member in struct
     shmid_kernel and should allow for complete support of SYSV SHM regions
     >= 2GB.
   - The shm_nattch member of struct shmid_ds is now an int instead of a
     short.
   - The shm_internal member of struct shmid_ds is now gone.  The internal
     VM object pointer for SHM regions has been moved into struct
     shmid_kernel.
   - The existing __semctl(), msgctl(), and shmctl() system call entries are
     now marked COMPAT7 and new versions of those system calls which support
     the new ABI are now present.
   - The new system calls are assigned to the FBSD-1.1 version in libc.  The
     FBSD-1.0 symbols in libc now refer to the old COMPAT7 system calls.
   - A simplistic framework for tagging system calls with compatibility
     symbol versions has been added to libc.  Version tags are added to
     system calls by adding an appropriate __sym_compat() entry to
     src/lib/libc/incldue/compat.h. [1]
   
   PR:		kern/16195 kern/113218 bin/129855
   Reviewed by:	arch@, rwatson
   Discussed with:	kan, kib [1]
 
 Added:
   head/lib/libc/include/compat.h   (contents, props changed)
 Modified:
   head/lib/libc/gen/Symbol.map
   head/lib/libc/gen/semctl.c
   head/lib/libc/sys/Makefile.inc
   head/lib/libc/sys/Symbol.map
   head/sys/compat/freebsd32/freebsd32_ipc.h
   head/sys/compat/freebsd32/freebsd32_misc.c
   head/sys/compat/freebsd32/syscalls.master
   head/sys/compat/linux/linux_ipc.c
   head/sys/compat/svr4/svr4_ipc.c
   head/sys/i386/ibcs2/ibcs2_ipc.c
   head/sys/kern/syscalls.master
   head/sys/kern/sysv_ipc.c
   head/sys/kern/sysv_msg.c
   head/sys/kern/sysv_sem.c
   head/sys/kern/sysv_shm.c
   head/sys/sys/ipc.h
   head/sys/sys/msg.h
   head/sys/sys/sem.h
   head/sys/sys/shm.h
   head/usr.bin/ipcs/ipcs.c
 
 Modified: head/lib/libc/gen/Symbol.map
 ==============================================================================
 --- head/lib/libc/gen/Symbol.map	Wed Jun 24 21:09:56 2009	(r194909)
 +++ head/lib/libc/gen/Symbol.map	Wed Jun 24 21:10:52 2009	(r194910)
 @@ -247,7 +247,6 @@ FBSD_1.0 {
  	sem_timedwait;
  	sem_post;
  	sem_getvalue;
 -	semctl;
  	setdomainname;
  	sethostname;
  	longjmperror;
 @@ -362,6 +361,7 @@ FBSD_1.1 {
  	posix_spawnattr_setsigdefault;
  	posix_spawnattr_setsigmask;
  	posix_spawnp;
 +	semctl;
  	tcgetsid;
  	tcsetsid;
  };
 
 Modified: head/lib/libc/gen/semctl.c
 ==============================================================================
 --- head/lib/libc/gen/semctl.c	Wed Jun 24 21:09:56 2009	(r194909)
 +++ head/lib/libc/gen/semctl.c	Wed Jun 24 21:10:52 2009	(r194910)
 @@ -29,15 +29,19 @@
  #include <sys/cdefs.h>
  __FBSDID("$FreeBSD$");
  
 +#define _WANT_SEMUN_OLD
 +
  #include <sys/types.h>
  #include <sys/ipc.h>
  #include <sys/sem.h>
  #include <stdarg.h>
  #include <stdlib.h>
  
 -extern int __semctl(int semid, int semnum, int cmd, union semun *arg);
 +int	__semctl(int semid, int semnum, int cmd, union semun *arg);
 +int	freebsd7___semctl(int semid, int semnum, int cmd, union semun_old *arg);
  
 -int semctl(int semid, int semnum, int cmd, ...)
 +int
 +semctl(int semid, int semnum, int cmd, ...)
  {
  	va_list ap;
  	union semun semun;
 @@ -55,3 +59,25 @@ int semctl(int semid, int semnum, int cm
  
  	return (__semctl(semid, semnum, cmd, semun_ptr));
  }
 +
 +int
 +freebsd7_semctl(int semid, int semnum, int cmd, ...)
 +{
 +	va_list ap;
 +	union semun_old semun;
 +	union semun_old *semun_ptr;
 +
 +	va_start(ap, cmd);
 +	if (cmd == IPC_SET || cmd == IPC_STAT || cmd == GETALL
 +	    || cmd == SETVAL || cmd == SETALL) {
 +		semun = va_arg(ap, union semun_old);
 +		semun_ptr = &semun;
 +	} else {
 +		semun_ptr = NULL;
 +	}
 +	va_end(ap);
 +
 +	return (freebsd7___semctl(semid, semnum, cmd, semun_ptr));
 +}
 +
 +__sym_compat(semctl, freebsd7_semctl, FBSD_1.0);
 
 Added: head/lib/libc/include/compat.h
 ==============================================================================
 --- /dev/null	00:00:00 1970	(empty, because file is newly added)
 +++ head/lib/libc/include/compat.h	Wed Jun 24 21:10:52 2009	(r194910)
 @@ -0,0 +1,48 @@
 +/*-
 + * Copyright (c) 2009 Advanced Computing Technologies LLC
 + * Written by: John H. Baldwin <jhb at FreeBSD.org>
 + * All rights reserved.
 + *
 + * Redistribution and use in source and binary forms, with or without
 + * modification, are permitted provided that the following conditions
 + * are met:
 + * 1. Redistributions of source code must retain the above copyright
 + *    notice, this list of conditions and the following disclaimer.
 + * 2. Redistributions in binary form must reproduce the above copyright
 + *    notice, this list of conditions and the following disclaimer in the
 + *    documentation and/or other materials provided with the distribution.
 + *
 + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 + * SUCH DAMAGE.
 + *
 + * $FreeBSD$
 + */
 +
 +/*
 + * This file defines compatiblity symbol versions for old system calls.  It
 + * is included in all generated system call files.
 + */
 +
 +#ifndef __LIBC_COMPAT_H__
 +#define	__LIBC_COMPAT_H__
 +
 +#define	__sym_compat(sym,impl,verid)	\
 +	.symver impl , sym @ verid
 +
 +__sym_compat(__semctl, freebsd7___semctl, FBSD_1.0);
 +__sym_compat(msgctl, freebsd7_msgctl, FBSD_1.0);
 +__sym_compat(shmctl, freebsd7_shmctl, FBSD_1.0);
 +
 +#undef __sym_compat
 +
 +#endif	/* __LIBC_COMPAT_H__ */
 +
 
 Modified: head/lib/libc/sys/Makefile.inc
 ==============================================================================
 --- head/lib/libc/sys/Makefile.inc	Wed Jun 24 21:09:56 2009	(r194909)
 +++ head/lib/libc/sys/Makefile.inc	Wed Jun 24 21:10:52 2009	(r194910)
 @@ -53,11 +53,13 @@ SYM_MAPS+=	${.CURDIR}/sys/Symbol.map
  CLEANFILES+=	${SASM} ${SPSEUDO}
  
  ${SASM}:
 -	printf '#include "SYS.h"\nRSYSCALL(${.PREFIX})\n' > ${.TARGET}
 +	printf '#include "compat.h"\n' > ${.TARGET}
 +	printf '#include "SYS.h"\nRSYSCALL(${.PREFIX})\n' >> ${.TARGET}
  
  ${SPSEUDO}:
 +	printf '#include "compat.h"\n' > ${.TARGET}
  	printf '#include "SYS.h"\nPSEUDO(${.PREFIX:S/_//})\n' \
 -	    > ${.TARGET}
 +	    >> ${.TARGET}
  
  MAN+=	abort2.2 accept.2 access.2 acct.2 adjtime.2 \
  	aio_cancel.2 aio_error.2 aio_read.2 aio_return.2 \
 
 Modified: head/lib/libc/sys/Symbol.map
 ==============================================================================
 --- head/lib/libc/sys/Symbol.map	Wed Jun 24 21:09:56 2009	(r194909)
 +++ head/lib/libc/sys/Symbol.map	Wed Jun 24 21:10:52 2009	(r194910)
 @@ -31,7 +31,6 @@ FBSD_1.0 {
  	__mac_set_file;
  	__mac_set_link;
  	__mac_set_proc;
 -	__semctl;
  	__setugid;
  	__syscall;
  	__sysctl;
 @@ -184,7 +183,6 @@ FBSD_1.0 {
  	modstat;
  	mount;
  	mprotect;
 -	msgctl;
  	msgget;
  	msgrcv;
  	msgsnd;
 @@ -267,7 +265,6 @@ FBSD_1.0 {
  	shm_open;
  	shm_unlink;
  	shmat;
 -	shmctl;
  	shmdt;
  	shmget;
  	shmsys;
 @@ -332,6 +329,7 @@ FBSD_1.0 {
  };
  
  FBSD_1.1 {
 +	__semctl;
  	closefrom;
  	cpuset;
  	cpuset_getid;
 @@ -351,10 +349,12 @@ FBSD_1.1 {
  	mkdirat;
  	mkfifoat;
  	mknodat;
 +	msgctl;
  	openat;
  	readlinkat;
  	renameat;
  	setfib;
 +	shmctl;
  	symlinkat;
  	unlinkat;
  };
 
 Modified: head/sys/compat/freebsd32/freebsd32_ipc.h
 ==============================================================================
 --- head/sys/compat/freebsd32/freebsd32_ipc.h	Wed Jun 24 21:09:56 2009	(r194909)
 +++ head/sys/compat/freebsd32/freebsd32_ipc.h	Wed Jun 24 21:10:52 2009	(r194910)
 @@ -30,11 +30,11 @@
  #define _COMPAT_FREEBSD32_FREEBSD32_IPC_H_
  
  struct ipc_perm32 {
 -	uint16_t	cuid;
 -	uint16_t	cgid;
 -	uint16_t	uid;
 -	uint16_t	gid;
 -	uint16_t	mode;
 +	uid_t		cuid;
 +	gid_t		cgid;
 +	uid_t		uid;
 +	gid_t		gid;
 +	mode_t		mode;
  	uint16_t	seq;
  	uint32_t	key;
  };
 @@ -44,10 +44,7 @@ struct semid_ds32 {
  	uint32_t	sem_base;
  	unsigned short	sem_nsems;
  	int32_t		sem_otime;
 -	int32_t		sem_pad1;
  	int32_t		sem_ctime;
 -	int32_t		sem_pad2;
 -	int32_t		sem_pad3[4];
  };
  
  union semun32 {
 @@ -66,24 +63,19 @@ struct msqid_ds32 {
  	pid_t		msg_lspid;
  	pid_t		msg_lrpid;
  	int32_t		msg_stime;
 -	int32_t		msg_pad1;
  	int32_t		msg_rtime;
 -	int32_t		msg_pad2;
  	int32_t		msg_ctime;
 -	int32_t		msg_pad3;
 -	int32_t		msg_pad4[4];
  };
  
  struct shmid_ds32 {
  	struct ipc_perm32 shm_perm;
  	int32_t		shm_segsz;
 -	int32_t		shm_lpid;
 -	int32_t		shm_cpid;
 -	int16_t		shm_nattch;
 +	pid_t		shm_lpid;
 +	pid_t		shm_cpid;
 +	int		shm_nattch;
  	int32_t		shm_atime;
  	int32_t		shm_dtime;
  	int32_t		shm_ctime;
 -	uint32_t	shm_internal;
  };
  
  struct shm_info32 {
 @@ -103,4 +95,58 @@ struct shminfo32 {
  	uint32_t	shmall;
  };
  
 +#if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) || \
 +    defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD7)
 +struct ipc_perm32_old {
 +	uint16_t	cuid;
 +	uint16_t	cgid;
 +	uint16_t	uid;
 +	uint16_t	gid;
 +	uint16_t	mode;
 +	uint16_t	seq;
 +	uint32_t	key;
 +};
 +
 +struct semid_ds32_old {
 +	struct ipc_perm32_old sem_perm;
 +	uint32_t	sem_base;
 +	unsigned short	sem_nsems;
 +	int32_t		sem_otime;
 +	int32_t		sem_pad1;
 +	int32_t		sem_ctime;
 +	int32_t		sem_pad2;
 +	int32_t		sem_pad3[4];
 +};
 +
 +struct msqid_ds32_old {
 +	struct ipc_perm32_old msg_perm;
 +	uint32_t	msg_first;
 +	uint32_t	msg_last;
 +	uint32_t	msg_cbytes;
 +	uint32_t	msg_qnum;
 +	uint32_t	msg_qbytes;
 +	pid_t		msg_lspid;
 +	pid_t		msg_lrpid;
 +	int32_t		msg_stime;
 +	int32_t		msg_pad1;
 +	int32_t		msg_rtime;
 +	int32_t		msg_pad2;
 +	int32_t		msg_ctime;
 +	int32_t		msg_pad3;
 +	int32_t		msg_pad4[4];
 +};
 +
 +struct shmid_ds32_old {
 +	struct ipc_perm32_old shm_perm;
 +	int32_t		shm_segsz;
 +	pid_t		shm_lpid;
 +	pid_t		shm_cpid;
 +	int16_t		shm_nattch;
 +	int32_t		shm_atime;
 +	int32_t		shm_dtime;
 +	int32_t		shm_ctime;
 +	uint32_t	shm_internal;
 +};
 +#endif
 +
  #endif /* !_COMPAT_FREEBSD32_FREEBSD32_IPC_H_ */
 
 Modified: head/sys/compat/freebsd32/freebsd32_misc.c
 ==============================================================================
 --- head/sys/compat/freebsd32/freebsd32_misc.c	Wed Jun 24 21:09:56 2009	(r194909)
 +++ head/sys/compat/freebsd32/freebsd32_misc.c	Wed Jun 24 21:10:52 2009	(r194910)
 @@ -1353,6 +1353,35 @@ freebsd4_freebsd32_fhstatfs(struct threa
  }
  #endif
  
 +#if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) || \
 +    defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD7)
 +static void
 +freebsd32_ipcperm_old_in(struct ipc_perm32_old *ip32, struct ipc_perm *ip)
 +{
 +
 +	CP(*ip32, *ip, cuid);
 +	CP(*ip32, *ip, cgid);
 +	CP(*ip32, *ip, uid);
 +	CP(*ip32, *ip, gid);
 +	CP(*ip32, *ip, mode);
 +	CP(*ip32, *ip, seq);
 +	CP(*ip32, *ip, key);
 +}
 +
 +static void
 +freebsd32_ipcperm_old_out(struct ipc_perm *ip, struct ipc_perm32_old *ip32)
 +{
 +
 +	CP(*ip, *ip32, cuid);
 +	CP(*ip, *ip32, cgid);
 +	CP(*ip, *ip32, uid);
 +	CP(*ip, *ip32, gid);
 +	CP(*ip, *ip32, mode);
 +	CP(*ip, *ip32, seq);
 +	CP(*ip, *ip32, key);
 +}
 +#endif
 +
  static void
  freebsd32_ipcperm_in(struct ipc_perm32 *ip32, struct ipc_perm *ip)
  {
 @@ -1383,6 +1412,8 @@ int
  freebsd32_semsys(struct thread *td, struct freebsd32_semsys_args *uap)
  {
  
 +#if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) || \
 +    defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD7)
  	switch (uap->which) {
  	case 0:
  		return (freebsd32_semctl(td,
 @@ -1390,7 +1421,85 @@ freebsd32_semsys(struct thread *td, stru
  	default:
  		return (semsys(td, (struct semsys_args *)uap));
  	}
 +#else
 +	return (nosys(td, NULL));
 +#endif
 +}
 +
 +#if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) || \
 +    defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD7)
 +int
 +freebsd7_freebsd32_semctl(struct thread *td,
 +    struct freebsd7_freebsd32_semctl_args *uap)
 +{
 +	struct semid_ds32_old dsbuf32;
 +	struct semid_ds dsbuf;
 +	union semun semun;
 +	union semun32 arg;
 +	register_t rval;
 +	int error;
 +
 +	switch (uap->cmd) {
 +	case SEM_STAT:
 +	case IPC_SET:
 +	case IPC_STAT:
 +	case GETALL:
 +	case SETVAL:
 +	case SETALL:
 +		error = copyin(uap->arg, &arg, sizeof(arg));
 +		if (error)
 +			return (error);		
 +		break;
 +	}
 +
 +	switch (uap->cmd) {
 +	case SEM_STAT:
 +	case IPC_STAT:
 +		semun.buf = &dsbuf;
 +		break;
 +	case IPC_SET:
 +		error = copyin(PTRIN(arg.buf), &dsbuf32, sizeof(dsbuf32));
 +		if (error)
 +			return (error);
 +		freebsd32_ipcperm_old_in(&dsbuf32.sem_perm, &dsbuf.sem_perm);
 +		PTRIN_CP(dsbuf32, dsbuf, sem_base);
 +		CP(dsbuf32, dsbuf, sem_nsems);
 +		CP(dsbuf32, dsbuf, sem_otime);
 +		CP(dsbuf32, dsbuf, sem_ctime);
 +		semun.buf = &dsbuf;
 +		break;
 +	case GETALL:
 +	case SETALL:
 +		semun.array = PTRIN(arg.array);
 +		break;
 +	case SETVAL:
 +		semun.val = arg.val;
 +		break;
 +	}
 +
 +	error = kern_semctl(td, uap->semid, uap->semnum, uap->cmd, &semun,
 +	    &rval);
 +	if (error)
 +		return (error);
 +
 +	switch (uap->cmd) {
 +	case SEM_STAT:
 +	case IPC_STAT:
 +		bzero(&dsbuf32, sizeof(dsbuf32));
 +		freebsd32_ipcperm_old_out(&dsbuf.sem_perm, &dsbuf32.sem_perm);
 +		PTROUT_CP(dsbuf, dsbuf32, sem_base);
 +		CP(dsbuf, dsbuf32, sem_nsems);
 +		CP(dsbuf, dsbuf32, sem_otime);
 +		CP(dsbuf, dsbuf32, sem_ctime);
 +		error = copyout(&dsbuf32, PTRIN(arg.buf), sizeof(dsbuf32));
 +		break;
 +	}
 +
 +	if (error == 0)
 +		td->td_retval[0] = rval;
 +	return (error);
  }
 +#endif
  
  int
  freebsd32_semctl(struct thread *td, struct freebsd32_semctl_args *uap)
 @@ -1428,13 +1537,7 @@ freebsd32_semctl(struct thread *td, stru
  		PTRIN_CP(dsbuf32, dsbuf, sem_base);
  		CP(dsbuf32, dsbuf, sem_nsems);
  		CP(dsbuf32, dsbuf, sem_otime);
 -		CP(dsbuf32, dsbuf, sem_pad1);
  		CP(dsbuf32, dsbuf, sem_ctime);
 -		CP(dsbuf32, dsbuf, sem_pad2);
 -		CP(dsbuf32, dsbuf, sem_pad3[0]);
 -		CP(dsbuf32, dsbuf, sem_pad3[1]);
 -		CP(dsbuf32, dsbuf, sem_pad3[2]);
 -		CP(dsbuf32, dsbuf, sem_pad3[3]);
  		semun.buf = &dsbuf;
  		break;
  	case GETALL:
 @@ -1454,17 +1557,12 @@ freebsd32_semctl(struct thread *td, stru
  	switch (uap->cmd) {
  	case SEM_STAT:
  	case IPC_STAT:
 +		bzero(&dsbuf32, sizeof(dsbuf32));
  		freebsd32_ipcperm_out(&dsbuf.sem_perm, &dsbuf32.sem_perm);
  		PTROUT_CP(dsbuf, dsbuf32, sem_base);
  		CP(dsbuf, dsbuf32, sem_nsems);
  		CP(dsbuf, dsbuf32, sem_otime);
 -		CP(dsbuf, dsbuf32, sem_pad1);
  		CP(dsbuf, dsbuf32, sem_ctime);
 -		CP(dsbuf, dsbuf32, sem_pad2);
 -		CP(dsbuf, dsbuf32, sem_pad3[0]);
 -		CP(dsbuf, dsbuf32, sem_pad3[1]);
 -		CP(dsbuf, dsbuf32, sem_pad3[2]);
 -		CP(dsbuf, dsbuf32, sem_pad3[3]);
  		error = copyout(&dsbuf32, PTRIN(arg.buf), sizeof(dsbuf32));
  		break;
  	}
 @@ -1478,6 +1576,8 @@ int
  freebsd32_msgsys(struct thread *td, struct freebsd32_msgsys_args *uap)
  {
  
 +#if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) || \
 +    defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD7)
  	switch (uap->which) {
  	case 0:
  		return (freebsd32_msgctl(td,
 @@ -1491,8 +1591,59 @@ freebsd32_msgsys(struct thread *td, stru
  	default:
  		return (msgsys(td, (struct msgsys_args *)uap));
  	}
 +#else
 +	return (nosys(td, NULL));
 +#endif
  }
  
 +#if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) || \
 +    defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD7)
 +int
 +freebsd7_freebsd32_msgctl(struct thread *td,
 +    struct freebsd7_freebsd32_msgctl_args *uap)
 +{
 +	struct msqid_ds msqbuf;
 +	struct msqid_ds32_old msqbuf32;
 +	int error;
 +
 +	if (uap->cmd == IPC_SET) {
 +		error = copyin(uap->buf, &msqbuf32, sizeof(msqbuf32));
 +		if (error)
 +			return (error);
 +		freebsd32_ipcperm_old_in(&msqbuf32.msg_perm, &msqbuf.msg_perm);
 +		PTRIN_CP(msqbuf32, msqbuf, msg_first);
 +		PTRIN_CP(msqbuf32, msqbuf, msg_last);
 +		CP(msqbuf32, msqbuf, msg_cbytes);
 +		CP(msqbuf32, msqbuf, msg_qnum);
 +		CP(msqbuf32, msqbuf, msg_qbytes);
 +		CP(msqbuf32, msqbuf, msg_lspid);
 +		CP(msqbuf32, msqbuf, msg_lrpid);
 +		CP(msqbuf32, msqbuf, msg_stime);
 +		CP(msqbuf32, msqbuf, msg_rtime);
 +		CP(msqbuf32, msqbuf, msg_ctime);
 +	}
 +	error = kern_msgctl(td, uap->msqid, uap->cmd, &msqbuf);
 +	if (error)
 +		return (error);
 +	if (uap->cmd == IPC_STAT) {
 +		bzero(&msqbuf32, sizeof(msqbuf32));
 +		freebsd32_ipcperm_old_out(&msqbuf.msg_perm, &msqbuf32.msg_perm);
 +		PTROUT_CP(msqbuf, msqbuf32, msg_first);
 +		PTROUT_CP(msqbuf, msqbuf32, msg_last);
 +		CP(msqbuf, msqbuf32, msg_cbytes);
 +		CP(msqbuf, msqbuf32, msg_qnum);
 +		CP(msqbuf, msqbuf32, msg_qbytes);
 +		CP(msqbuf, msqbuf32, msg_lspid);
 +		CP(msqbuf, msqbuf32, msg_lrpid);
 +		CP(msqbuf, msqbuf32, msg_stime);
 +		CP(msqbuf, msqbuf32, msg_rtime);
 +		CP(msqbuf, msqbuf32, msg_ctime);
 +		error = copyout(&msqbuf32, uap->buf, sizeof(struct msqid_ds32));
 +	}
 +	return (error);
 +}
 +#endif
 +
  int
  freebsd32_msgctl(struct thread *td, struct freebsd32_msgctl_args *uap)
  {
 @@ -1513,15 +1664,8 @@ freebsd32_msgctl(struct thread *td, stru
  		CP(msqbuf32, msqbuf, msg_lspid);
  		CP(msqbuf32, msqbuf, msg_lrpid);
  		CP(msqbuf32, msqbuf, msg_stime);
 -		CP(msqbuf32, msqbuf, msg_pad1);
  		CP(msqbuf32, msqbuf, msg_rtime);
 -		CP(msqbuf32, msqbuf, msg_pad2);
  		CP(msqbuf32, msqbuf, msg_ctime);
 -		CP(msqbuf32, msqbuf, msg_pad3);
 -		CP(msqbuf32, msqbuf, msg_pad4[0]);
 -		CP(msqbuf32, msqbuf, msg_pad4[1]);
 -		CP(msqbuf32, msqbuf, msg_pad4[2]);
 -		CP(msqbuf32, msqbuf, msg_pad4[3]);
  	}
  	error = kern_msgctl(td, uap->msqid, uap->cmd, &msqbuf);
  	if (error)
 @@ -1536,15 +1680,8 @@ freebsd32_msgctl(struct thread *td, stru
  		CP(msqbuf, msqbuf32, msg_lspid);
  		CP(msqbuf, msqbuf32, msg_lrpid);
  		CP(msqbuf, msqbuf32, msg_stime);
 -		CP(msqbuf, msqbuf32, msg_pad1);
  		CP(msqbuf, msqbuf32, msg_rtime);
 -		CP(msqbuf, msqbuf32, msg_pad2);
  		CP(msqbuf, msqbuf32, msg_ctime);
 -		CP(msqbuf, msqbuf32, msg_pad3);
 -		CP(msqbuf, msqbuf32, msg_pad4[0]);
 -		CP(msqbuf, msqbuf32, msg_pad4[1]);
 -		CP(msqbuf, msqbuf32, msg_pad4[2]);
 -		CP(msqbuf, msqbuf32, msg_pad4[3]);
  		error = copyout(&msqbuf32, uap->buf, sizeof(struct msqid_ds32));
  	}
  	return (error);
 @@ -1588,6 +1725,8 @@ int
  freebsd32_shmsys(struct thread *td, struct freebsd32_shmsys_args *uap)
  {
  
 +#if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) || \
 +    defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD7)
  	switch (uap->which) {
  	case 0:	{	/* shmat */
  		struct shmat_args ap;
 @@ -1623,8 +1762,99 @@ freebsd32_shmsys(struct thread *td, stru
  	default:
  		return (EINVAL);
  	}
 +#else
 +	return (nosys(td, NULL));
 +#endif
  }
  
 +#if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) || \
 +    defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD7)
 +int
 +freebsd7_freebsd32_shmctl(struct thread *td,
 +    struct freebsd7_freebsd32_shmctl_args *uap)
 +{
 +	int error = 0;
 +	union {
 +		struct shmid_ds shmid_ds;
 +		struct shm_info shm_info;
 +		struct shminfo shminfo;
 +	} u;
 +	union {
 +		struct shmid_ds32_old shmid_ds32;
 +		struct shm_info32 shm_info32;
 +		struct shminfo32 shminfo32;
 +	} u32;
 +	size_t sz;
 +
 +	if (uap->cmd == IPC_SET) {
 +		if ((error = copyin(uap->buf, &u32.shmid_ds32,
 +		    sizeof(u32.shmid_ds32))))
 +			goto done;
 +		freebsd32_ipcperm_old_in(&u32.shmid_ds32.shm_perm,
 +		    &u.shmid_ds.shm_perm);
 +		CP(u32.shmid_ds32, u.shmid_ds, shm_segsz);
 +		CP(u32.shmid_ds32, u.shmid_ds, shm_lpid);
 +		CP(u32.shmid_ds32, u.shmid_ds, shm_cpid);
 +		CP(u32.shmid_ds32, u.shmid_ds, shm_nattch);
 +		CP(u32.shmid_ds32, u.shmid_ds, shm_atime);
 +		CP(u32.shmid_ds32, u.shmid_ds, shm_dtime);
 +		CP(u32.shmid_ds32, u.shmid_ds, shm_ctime);
 +	}
 +	
 +	error = kern_shmctl(td, uap->shmid, uap->cmd, (void *)&u, &sz);
 +	if (error)
 +		goto done;
 +	
 +	/* Cases in which we need to copyout */
 +	switch (uap->cmd) {
 +	case IPC_INFO:
 +		CP(u.shminfo, u32.shminfo32, shmmax);
 +		CP(u.shminfo, u32.shminfo32, shmmin);
 +		CP(u.shminfo, u32.shminfo32, shmmni);
 +		CP(u.shminfo, u32.shminfo32, shmseg);
 +		CP(u.shminfo, u32.shminfo32, shmall);
 +		error = copyout(&u32.shminfo32, uap->buf,
 +		    sizeof(u32.shminfo32));
 +		break;
 +	case SHM_INFO:
 +		CP(u.shm_info, u32.shm_info32, used_ids);
 +		CP(u.shm_info, u32.shm_info32, shm_rss);
 +		CP(u.shm_info, u32.shm_info32, shm_tot);
 +		CP(u.shm_info, u32.shm_info32, shm_swp);
 +		CP(u.shm_info, u32.shm_info32, swap_attempts);
 +		CP(u.shm_info, u32.shm_info32, swap_successes);
 +		error = copyout(&u32.shm_info32, uap->buf,
 +		    sizeof(u32.shm_info32));
 +		break;
 +	case SHM_STAT:
 +	case IPC_STAT:
 +		freebsd32_ipcperm_old_out(&u.shmid_ds.shm_perm,
 +		    &u32.shmid_ds32.shm_perm);
 +		if (u.shmid_ds.shm_segsz > INT32_MAX)
 +			u32.shmid_ds32.shm_segsz = INT32_MAX;
 +		else
 +			CP(u.shmid_ds, u32.shmid_ds32, shm_segsz);
 +		CP(u.shmid_ds, u32.shmid_ds32, shm_lpid);
 +		CP(u.shmid_ds, u32.shmid_ds32, shm_cpid);
 +		CP(u.shmid_ds, u32.shmid_ds32, shm_nattch);
 +		CP(u.shmid_ds, u32.shmid_ds32, shm_atime);
 +		CP(u.shmid_ds, u32.shmid_ds32, shm_dtime);
 +		CP(u.shmid_ds, u32.shmid_ds32, shm_ctime);
 +		u32.shmid_ds32.shm_internal = 0;
 +		error = copyout(&u32.shmid_ds32, uap->buf,
 +		    sizeof(u32.shmid_ds32));
 +		break;
 +	}
 +
 +done:
 +	if (error) {
 +		/* Invalidate the return value */
 +		td->td_retval[0] = -1;
 +	}
 +	return (error);
 +}
 +#endif
 +
  int
  freebsd32_shmctl(struct thread *td, struct freebsd32_shmctl_args *uap)
  {
 @@ -1654,7 +1884,6 @@ freebsd32_shmctl(struct thread *td, stru
  		CP(u32.shmid_ds32, u.shmid_ds, shm_atime);
  		CP(u32.shmid_ds32, u.shmid_ds, shm_dtime);
  		CP(u32.shmid_ds32, u.shmid_ds, shm_ctime);
 -		PTRIN_CP(u32.shmid_ds32, u.shmid_ds, shm_internal);
  	}
  	
  	error = kern_shmctl(td, uap->shmid, uap->cmd, (void *)&u, &sz);
 @@ -1686,14 +1915,16 @@ freebsd32_shmctl(struct thread *td, stru
  	case IPC_STAT:
  		freebsd32_ipcperm_out(&u.shmid_ds.shm_perm,
  		    &u32.shmid_ds32.shm_perm);
 -		CP(u.shmid_ds, u32.shmid_ds32, shm_segsz);
 +		if (u.shmid_ds.shm_segsz > INT32_MAX)
 +			u32.shmid_ds32.shm_segsz = INT32_MAX;
 +		else
 +			CP(u.shmid_ds, u32.shmid_ds32, shm_segsz);
  		CP(u.shmid_ds, u32.shmid_ds32, shm_lpid);
  		CP(u.shmid_ds, u32.shmid_ds32, shm_cpid);
  		CP(u.shmid_ds, u32.shmid_ds32, shm_nattch);
  		CP(u.shmid_ds, u32.shmid_ds32, shm_atime);
  		CP(u.shmid_ds, u32.shmid_ds32, shm_dtime);
  		CP(u.shmid_ds, u32.shmid_ds32, shm_ctime);
 -		PTROUT_CP(u.shmid_ds, u32.shmid_ds32, shm_internal);
  		error = copyout(&u32.shmid_ds32, uap->buf,
  		    sizeof(u32.shmid_ds32));
  		break;
 
 Modified: head/sys/compat/freebsd32/syscalls.master
 ==============================================================================
 --- head/sys/compat/freebsd32/syscalls.master	Wed Jun 24 21:09:56 2009	(r194909)
 +++ head/sys/compat/freebsd32/syscalls.master	Wed Jun 24 21:10:52 2009	(r194910)
 @@ -405,15 +405,15 @@
  ; The following were introduced with NetBSD/4.4Lite-2
  ; They are initialized by thier respective modules/sysinits
  ; XXX PROBLEM!!
 -220	AUE_SEMCTL	STD	{ int freebsd32_semctl(int semid, int semnum, \
 +220	AUE_SEMCTL	COMPAT7	{ int freebsd32_semctl(int semid, int semnum, \
  				    int cmd, union semun32 *arg); }
  221	AUE_SEMGET	NOPROTO	{ int semget(key_t key, int nsems, \
  				    int semflg); }
  222	AUE_SEMOP	NOPROTO	{ int semop(int semid, struct sembuf *sops, \
  				    u_int nsops); }
  223	AUE_NULL	UNIMPL	semconfig
 -224	AUE_MSGCTL	STD	{ int freebsd32_msgctl(int msqid, int cmd, \
 -				    struct msqid_ds32 *buf); }
 +224	AUE_MSGCTL	COMPAT7	{ int freebsd32_msgctl(int msqid, int cmd, \
 +				    struct msqid_ds32_old *buf); }
  225	AUE_MSGGET	NOPROTO	{ int msgget(key_t key, int msgflg); }
  226	AUE_MSGSND	STD	{ int freebsd32_msgsnd(int msqid, void *msgp, \
  				    size_t msgsz, int msgflg); }
 @@ -421,8 +421,8 @@
  				    size_t msgsz, long msgtyp, int msgflg); }
  228	AUE_SHMAT	NOPROTO	{ int shmat(int shmid, void *shmaddr, \
  				    int shmflg); }
 -229	AUE_SHMCTL	STD	{ int freebsd32_shmctl(int shmid, int cmd, \
 -				    struct shmid_ds *buf); }
 +229	AUE_SHMCTL	COMPAT7	{ int freebsd32_shmctl(int shmid, int cmd, \
 +				    struct shmid_ds32_old *buf); }
  230	AUE_SHMDT	NOPROTO	{ int shmdt(void *shmaddr); }
  231	AUE_SHMGET	NOPROTO	{ int shmget(key_t key, int size, \
  				    int shmflg); }
 @@ -894,3 +894,9 @@
  				    unsigned int iovcnt, int flags); }
  508	AUE_NULL	NOPROTO	{ int jail_remove(int jid); }
  509	AUE_CLOSEFROM	NOPROTO	{ int closefrom(int lowfd); }
 +510	AUE_SEMCTL	STD { int freebsd32_semctl(int semid, int semnum, \
 +				    int cmd, union semun32 *arg); }
 +511	AUE_MSGCTL	STD	{ int freebsd32_msgctl(int msqid, int cmd, \
 +				    struct msqid_ds32 *buf); }
 +512	AUE_SHMCTL	STD	{ int freebsd32_shmctl(int shmid, int cmd, \
 +				    struct shmid_ds32 *buf); }
 
 Modified: head/sys/compat/linux/linux_ipc.c
 ==============================================================================
 --- head/sys/compat/linux/linux_ipc.c	Wed Jun 24 21:09:56 2009	(r194909)
 +++ head/sys/compat/linux/linux_ipc.c	Wed Jun 24 21:10:52 2009	(r194910)
 @@ -230,23 +230,26 @@ linux_to_bsd_shmid_ds(struct l_shmid_ds 
      bsp->shm_atime = lsp->shm_atime;
      bsp->shm_dtime = lsp->shm_dtime;
      bsp->shm_ctime = lsp->shm_ctime;
 -    /* this goes (yet) SOS */
 -    bsp->shm_internal = PTRIN(lsp->private3);
  }
  
  static void
  bsd_to_linux_shmid_ds(struct shmid_ds *bsp, struct l_shmid_ds *lsp)
  {
      bsd_to_linux_ipc_perm(&bsp->shm_perm, &lsp->shm_perm);
 -    lsp->shm_segsz = bsp->shm_segsz;
 +    if (bsp->shm_segsz > INT_MAX)
 +	    lsp->shm_segsz = INT_MAX;
 +    else
 +	    lsp->shm_segsz = bsp->shm_segsz;
      lsp->shm_lpid = bsp->shm_lpid;
      lsp->shm_cpid = bsp->shm_cpid;
 -    lsp->shm_nattch = bsp->shm_nattch;
 +    if (bsp->shm_nattch > SHRT_MAX)
 +	    lsp->shm_nattch = SHRT_MAX;
 +    else
 +	    lsp->shm_nattch = bsp->shm_nattch;
      lsp->shm_atime = bsp->shm_atime;
      lsp->shm_dtime = bsp->shm_dtime;
      lsp->shm_ctime = bsp->shm_ctime;
 -    /* this goes (yet) SOS */
 -    lsp->private3 = PTROUT(bsp->shm_internal);
 +    lsp->private3 = 0;
  }
  
  static void
 @@ -424,6 +427,15 @@ linux_shmid_pushdown(l_int ver, struct l
  {
  	struct l_shmid64_ds linux_shmid64;
  
 +	/*
 +	 * XXX: This is backwards and loses information in shm_nattch
 +	 * and shm_segsz.  We should probably either expose the BSD
 +	 * shmid structure directly and convert it to either the
 +	 * non-64 or 64 variant directly or the code should always
 +	 * convert to the 64 variant and then truncate values into the
 +	 * non-64 variant if needed since the 64 variant has more
 +	 * precision.
 +	 */
  	if (ver == LINUX_IPC_64) {
  		bzero(&linux_shmid64, sizeof(linux_shmid64));
  
 
 Modified: head/sys/compat/svr4/svr4_ipc.c
 ==============================================================================
 --- head/sys/compat/svr4/svr4_ipc.c	Wed Jun 24 21:09:56 2009	(r194909)
 +++ head/sys/compat/svr4/svr4_ipc.c	Wed Jun 24 21:10:52 2009	(r194910)
 @@ -169,13 +169,12 @@ bsd_to_svr4_semid_ds(bds, sds)
  	const struct semid_ds *bds;
  	struct svr4_semid_ds *sds;
  {
 +	bzero(sds, sizeof(*sds));
  	bsd_to_svr4_ipc_perm(&bds->sem_perm, &sds->sem_perm);
  	sds->sem_base = (struct svr4_sem *) bds->sem_base;
  	sds->sem_nsems = bds->sem_nsems;
  	sds->sem_otime = bds->sem_otime;
 -	sds->sem_pad1 = bds->sem_pad1;
  	sds->sem_ctime = bds->sem_ctime;
 -	sds->sem_pad2 = bds->sem_pad2;
  }
  
  static void
 @@ -187,9 +186,7 @@ svr4_to_bsd_semid_ds(sds, bds)
  	bds->sem_base = (struct sem *) bds->sem_base;
  	bds->sem_nsems = sds->sem_nsems;
  	bds->sem_otime = sds->sem_otime;
 -	bds->sem_pad1 = sds->sem_pad1;
  	bds->sem_ctime = sds->sem_ctime;
 -	bds->sem_pad2 = sds->sem_pad2;
  }
  
  struct svr4_sys_semctl_args {
 @@ -350,6 +347,7 @@ bsd_to_svr4_msqid_ds(bds, sds)
  	const struct msqid_ds *bds;
  	struct svr4_msqid_ds *sds;
  {
 +	bzero(sds, sizeof(*sds));
  	bsd_to_svr4_ipc_perm(&bds->msg_perm, &sds->msg_perm);
  	sds->msg_first = (struct svr4_msg *) bds->msg_first;
  	sds->msg_last = (struct svr4_msg *) bds->msg_last;
 @@ -359,18 +357,8 @@ bsd_to_svr4_msqid_ds(bds, sds)
  	sds->msg_lspid = bds->msg_lspid;
  	sds->msg_lrpid = bds->msg_lrpid;
  	sds->msg_stime = bds->msg_stime;
 -	sds->msg_pad1 = bds->msg_pad1;
  	sds->msg_rtime = bds->msg_rtime;
 -	sds->msg_pad2 = bds->msg_pad2;
  	sds->msg_ctime = bds->msg_ctime;
 -	sds->msg_pad3 = bds->msg_pad3;
 -
 -	/* use the padding for the rest of the fields */
 -	{
 -		const short *pad = (const short *) bds->msg_pad4;
 -		sds->msg_cv = pad[0];
 -		sds->msg_qnum_cv = pad[1];
 -	}
  }
  
  static void
 @@ -387,18 +375,8 @@ svr4_to_bsd_msqid_ds(sds, bds)
  	bds->msg_lspid = sds->msg_lspid;
  	bds->msg_lrpid = sds->msg_lrpid;
  	bds->msg_stime = sds->msg_stime;
 -	bds->msg_pad1 = sds->msg_pad1;
  	bds->msg_rtime = sds->msg_rtime;
 -	bds->msg_pad2 = sds->msg_pad2;
  	bds->msg_ctime = sds->msg_ctime;
 -	bds->msg_pad3 = sds->msg_pad3;
 -
 -	/* use the padding for the rest of the fields */
 -	{
 -		short *pad = (short *) bds->msg_pad4;
 -		pad[0] = sds->msg_cv;
 -		pad[1] = sds->msg_qnum_cv;
 -	}
  }
  
  struct svr4_sys_msgsnd_args {
 @@ -543,20 +521,18 @@ bsd_to_svr4_shmid_ds(bds, sds)
  	const struct shmid_ds *bds;
  	struct svr4_shmid_ds *sds;
  {
 +	bzero(sds, sizeof(*sds));
  	bsd_to_svr4_ipc_perm(&bds->shm_perm, &sds->shm_perm);
  	sds->shm_segsz = bds->shm_segsz;
  	sds->shm_lkcnt = 0;
  	sds->shm_lpid = bds->shm_lpid;
  	sds->shm_cpid = bds->shm_cpid;
 -	sds->shm_amp = bds->shm_internal;
 +	sds->shm_amp = 0;
  	sds->shm_nattch = bds->shm_nattch;
  	sds->shm_cnattch = 0;
  	sds->shm_atime = bds->shm_atime;
 -	sds->shm_pad1 = 0;
  	sds->shm_dtime = bds->shm_dtime;
 -	sds->shm_pad2 = 0;
  	sds->shm_ctime = bds->shm_ctime;
 -	sds->shm_pad3 = 0;
  }
  
  static void
 @@ -568,7 +544,6 @@ svr4_to_bsd_shmid_ds(sds, bds)
  	bds->shm_segsz = sds->shm_segsz;
  	bds->shm_lpid = sds->shm_lpid;
  	bds->shm_cpid = sds->shm_cpid;
 -	bds->shm_internal = sds->shm_amp;
  	bds->shm_nattch = sds->shm_nattch;
  	bds->shm_atime = sds->shm_atime;
  	bds->shm_dtime = sds->shm_dtime;
 
 Modified: head/sys/i386/ibcs2/ibcs2_ipc.c
 ==============================================================================
 --- head/sys/i386/ibcs2/ibcs2_ipc.c	Wed Jun 24 21:09:56 2009	(r194909)
 +++ head/sys/i386/ibcs2/ibcs2_ipc.c	Wed Jun 24 21:10:52 2009	(r194910)
 @@ -415,7 +415,10 @@ struct ibcs2_shmid_ds *ibp;
  	ibp->shm_segsz = bp->shm_segsz;
  	ibp->shm_lpid = bp->shm_lpid;
  	ibp->shm_cpid = bp->shm_cpid;
 -	ibp->shm_nattch = bp->shm_nattch;
 +	if (bp->shm_nattch > SHRT_MAX)
 +		ibp->shm_nattch = SHRT_MAX;
 +	else
 +		ibp->shm_nattch = bp->shm_nattch;
  	ibp->shm_cnattch = 0;			/* ignored anyway */
  	ibp->shm_atime = bp->shm_atime;
  	ibp->shm_dtime = bp->shm_dtime;
 @@ -436,7 +439,6 @@ struct shmid_ds *bp;
  	bp->shm_atime = ibp->shm_atime;
  	bp->shm_dtime = ibp->shm_dtime;
  	bp->shm_ctime = ibp->shm_ctime;
 -	bp->shm_internal = (void *)0;		/* ignored anyway */
  	return;
  }
  
 
 Modified: head/sys/kern/syscalls.master
 ==============================================================================
 --- head/sys/kern/syscalls.master	Wed Jun 24 21:09:56 2009	(r194909)
 +++ head/sys/kern/syscalls.master	Wed Jun 24 21:10:52 2009	(r194910)
 @@ -417,15 +417,15 @@
  
  ;
  ; The following were introduced with NetBSD/4.4Lite-2
 -220	AUE_SEMCTL	NOSTD	{ int __semctl(int semid, int semnum, \
 -				    int cmd, union semun *arg); }
 +220	AUE_SEMCTL	COMPAT7|NOSTD { int __semctl(int semid, int semnum, \
 +				    int cmd, union semun_old *arg); }
  221	AUE_SEMGET	NOSTD	{ int semget(key_t key, int nsems, \
  				    int semflg); }
  222	AUE_SEMOP	NOSTD	{ int semop(int semid, struct sembuf *sops, \
  				    size_t nsops); }
  223	AUE_NULL	UNIMPL	semconfig
 -224	AUE_MSGCTL	NOSTD	{ int msgctl(int msqid, int cmd, \
 -				    struct msqid_ds *buf); }
 +224	AUE_MSGCTL	COMPAT7|NOSTD { int msgctl(int msqid, int cmd, \
 +				    struct msqid_ds_old *buf); }
  225	AUE_MSGGET	NOSTD	{ int msgget(key_t key, int msgflg); }
  226	AUE_MSGSND	NOSTD	{ int msgsnd(int msqid, const void *msgp, \
  				    size_t msgsz, int msgflg); }
 @@ -433,8 +433,8 @@
  				    size_t msgsz, long msgtyp, int msgflg); }
  228	AUE_SHMAT	NOSTD	{ int shmat(int shmid, const void *shmaddr, \
  				    int shmflg); }
 -229	AUE_SHMCTL	NOSTD	{ int shmctl(int shmid, int cmd, \
 -				    struct shmid_ds *buf); }
 +229	AUE_SHMCTL	COMPAT7|NOSTD { int shmctl(int shmid, int cmd, \
 +				    struct shmid_ds_old *buf); }
  230	AUE_SHMDT	NOSTD	{ int shmdt(const void *shmaddr); }
  231	AUE_SHMGET	NOSTD	{ int shmget(key_t key, size_t size, \
  				    int shmflg); }
 @@ -904,5 +904,11 @@
  				    unsigned int iovcnt, int flags); }
  508	AUE_NULL	STD	{ int jail_remove(int jid); }
  509	AUE_CLOSEFROM	STD	{ int closefrom(int lowfd); }
 +510	AUE_SEMCTL	NOSTD	{ int __semctl(int semid, int semnum, \
 +				    int cmd, union semun *arg); }
 +511	AUE_MSGCTL	NOSTD	{ int msgctl(int msqid, int cmd, \
 +				    struct msqid_ds *buf); }
 +512	AUE_SHMCTL	NOSTD	{ int shmctl(int shmid, int cmd, \
 +				    struct shmid_ds *buf); }
  ; Please copy any additions and changes to the following compatability tables:
  ; sys/compat/freebsd32/syscalls.master
 
 Modified: head/sys/kern/sysv_ipc.c
 ==============================================================================
 --- head/sys/kern/sysv_ipc.c	Wed Jun 24 21:09:56 2009	(r194909)
 +++ head/sys/kern/sysv_ipc.c	Wed Jun 24 21:10:52 2009	(r194910)
 @@ -36,6 +36,7 @@
  #include <sys/cdefs.h>
  __FBSDID("$FreeBSD$");
  
 +#include "opt_compat.h"
  #include "opt_sysvipc.h"
  
  #include <sys/param.h>
 @@ -147,3 +148,33 @@ ipcperm(struct thread *td, struct ipc_pe
  	else
  		return (EACCES);
  }
 +
 +#if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) || \
 +    defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD7)
 +void
 +ipcperm_old2new(struct ipc_perm_old *old, struct ipc_perm *new)
 +{
 +
 +	new->cuid = old->cuid;
 +	new->cgid = old->cgid;
 +	new->uid = old->uid;
 +	new->gid = old->gid;
 +	new->mode = old->mode;
 +	new->seq = old->seq;
 +	new->key = old->key;
 +}
 +
 +void
 +ipcperm_new2old(struct ipc_perm *new, struct ipc_perm_old *old)
 
 *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
 _______________________________________________
 svn-src-all at freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe at freebsd.org"
 


More information about the freebsd-bugs mailing list