PERFORCE change 100228 for review
John Baldwin
jhb at FreeBSD.org
Wed Jun 28 21:06:24 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=100228
Change 100228 by jhb at jhb_mutex on 2006/06/28 20:04:17
Split up ibcs2_msgsys() into subfunctions similar to svr4_sys_msgsys()
and use kern_msgctl() in ibcs2_msgctl() to avoid the stackgap.
Affected files ...
.. //depot/projects/smpng/sys/i386/ibcs2/ibcs2_ipc.c#9 edit
Differences ...
==== //depot/projects/smpng/sys/i386/ibcs2/ibcs2_ipc.c#9 (text+ko) ====
@@ -31,6 +31,7 @@
#include <sys/msg.h>
#include <sys/sem.h>
#include <sys/shm.h>
+#include <sys/syscallsubr.h>
#include <sys/sysproto.h>
#include <i386/ibcs2/ibcs2_types.h>
@@ -102,50 +103,118 @@
return;
}
+struct ibcs2_msgget_args {
+ int what;
+ int key;
+ int msgflg;
+};
+
+static int
+ibcs2_msgget(struct thread *td, void *v)
+{
+ struct ibcs2_msgget_args *uap = v;
+ struct msgget_args ap;
+
+ ap.key = uap->key;
+ ap.msgflg = uap->msgflg;
+ return msgget(td, &ap);
+}
+
+struct ibcs2_msgctl_args {
+ int what;
+ int msqid;
+ int cmd;
+ struct ibcs2_msqid_ds *buf;
+};
+
+static int
+ibcs2_msgctl(struct thread *td, void *v)
+{
+ struct ibcs2_msgctl_args *uap = v;
+ struct ibcs2_msqid_ds is;
+ struct msqid_ds bs;
+ int error;
+
+ switch (uap->cmd) {
+ case IBCS2_IPC_STAT:
+ error = kern_msgctl(td, uap->msqid, IPC_STAT, &bs);
+ if (!error) {
+ cvt_msqid2imsqid(&bs, &is);
+ error = copyout(&is, uap->buf, sizeof(is));
+ }
+ return (error);
+ case IBCS2_IPC_SET:
+ error = copyin(uap->buf, &is, sizeof(is));
+ if (error)
+ return (error);
+ cvt_imsqid2msqid(&is, &bs);
+ return (kern_msgctl(td, uap->msqid, IPC_SET, &bs));
+ case IBCS2_IPC_RMID:
+ return (kern_msgctl(td, uap->msqid, IPC_RMID, NULL));
+ }
+ return (EINVAL);
+}
+
+struct ibcs2_msgrcv_args {
+ int what;
+ int msqid;
+ void *msgp;
+ size_t msgsz;
+ long msgtyp;
+ int msgflg;
+};
+
+static int
+ibcs2_msgrcv(struct thread *td, void *v)
+{
+ struct ibcs2_msgrcv_args *uap = v;
+ struct msgrcv_args ap;
+
+ ap.msqid = uap->msqid;
+ ap.msgp = uap->msgp;
+ ap.msgsz = uap->msgsz;
+ ap.msgtyp = uap->msgtyp;
+ ap.msgflg = uap->msgflg;
+ return (msgrcv(td, &ap));
+}
+
+struct ibcs2_msgsnd_args {
+ int what;
+ int msqid;
+ void *msgp;
+ size_t msgsz;
+ int msgflg;
+};
+
+static int
+ibcs2_msgsnd(struct thread *td, void *v)
+{
+ struct ibcs2_msgsnd_args *uap = v;
+ struct msgsnd_args ap;
+
+ ap.msqid = uap->msqid;
+ ap.msgp = uap->msgp;
+ ap.msgsz = uap->msgsz;
+ ap.msgflg = uap->msgflg;
+ return (msgsnd(td, &ap));
+}
+
int
ibcs2_msgsys(td, uap)
struct thread *td;
struct ibcs2_msgsys_args *uap;
{
switch (uap->which) {
- case 0: /* msgget */
- uap->which = 1;
- return msgsys(td, (struct msgsys_args *)uap);
- case 1: { /* msgctl */
- int error;
- struct msgsys_args margs;
- caddr_t sg = stackgap_init();
-
- margs.which = 0;
- margs.a2 = uap->a2;
- margs.a4 =
- (int)stackgap_alloc(&sg, sizeof(struct msqid_ds));
- margs.a3 = uap->a3;
- switch (margs.a3) {
- case IBCS2_IPC_STAT:
- error = msgsys(td, &margs);
- if (!error)
- cvt_msqid2imsqid(
- (struct msqid_ds *)margs.a4,
- (struct ibcs2_msqid_ds *)uap->a4);
- return error;
- case IBCS2_IPC_SET:
- cvt_imsqid2msqid((struct ibcs2_msqid_ds *)uap->a4,
- (struct msqid_ds *)margs.a4);
- return msgsys(td, &margs);
- case IBCS2_IPC_RMID:
- return msgsys(td, &margs);
- }
- return EINVAL;
- }
- case 2: /* msgrcv */
- uap->which = 3;
- return msgsys(td, (struct msgsys_args *)uap);
- case 3: /* msgsnd */
- uap->which = 2;
- return msgsys(td, (struct msgsys_args *)uap);
+ case 0:
+ return (ibcs2_msgget(td, uap));
+ case 1:
+ return (ibcs2_msgctl(td, uap));
+ case 2:
+ return (ibcs2_msgrcv(td, uap));
+ case 3:
+ return (ibcs2_msgsnd(td, uap));
default:
- return EINVAL;
+ return (EINVAL);
}
}
More information about the p4-projects
mailing list