1 /* msg.cc: XSI IPC interface for Cygwin.
3 Copyright 2003, 2009 Red Hat, Inc.
5 This file is part of Cygwin.
7 This software is a copyrighted work licensed under the terms of the
8 Cygwin license. Please consult the file "CYGWIN_LICENSE" for
17 #include "cygserver_msg.h"
20 * client_request_msg Constructors
23 client_request_msg::client_request_msg (int msqid,
26 : client_request (CYGSERVER_REQUEST_MSG, &_parameters, sizeof (_parameters))
28 _parameters.in.msgop = MSGOP_msgctl;
29 ipc_set_proc_info (_parameters.in.ipcblk);
31 _parameters.in.ctlargs.msqid = msqid;
32 _parameters.in.ctlargs.cmd = cmd;
33 _parameters.in.ctlargs.buf = buf;
35 msglen (sizeof (_parameters.in));
38 client_request_msg::client_request_msg (key_t key,
40 : client_request (CYGSERVER_REQUEST_MSG, &_parameters, sizeof (_parameters))
42 _parameters.in.msgop = MSGOP_msgget;
43 ipc_set_proc_info (_parameters.in.ipcblk);
45 _parameters.in.getargs.key = key;
46 _parameters.in.getargs.msgflg = msgflg;
48 msglen (sizeof (_parameters.in));
51 client_request_msg::client_request_msg (int msqid,
56 : client_request (CYGSERVER_REQUEST_MSG, &_parameters, sizeof (_parameters))
58 _parameters.in.msgop = MSGOP_msgrcv;
59 ipc_set_proc_info (_parameters.in.ipcblk);
61 _parameters.in.rcvargs.msqid = msqid;
62 _parameters.in.rcvargs.msgp = msgp;
63 _parameters.in.rcvargs.msgsz = msgsz;
64 _parameters.in.rcvargs.msgtyp = msgtyp;
65 _parameters.in.rcvargs.msgflg = msgflg;
67 msglen (sizeof (_parameters.in));
70 client_request_msg::client_request_msg (int msqid,
74 : client_request (CYGSERVER_REQUEST_MSG, &_parameters, sizeof (_parameters))
76 _parameters.in.msgop = MSGOP_msgsnd;
77 ipc_set_proc_info (_parameters.in.ipcblk);
79 _parameters.in.sndargs.msqid = msqid;
80 _parameters.in.sndargs.msgp = msgp;
81 _parameters.in.sndargs.msgsz = msgsz;
82 _parameters.in.sndargs.msgflg = msgflg;
84 msglen (sizeof (_parameters.in));
88 * XSI message queue API. These are exported by the DLL.
92 msgctl (int msqid, int cmd, struct msqid_ds *buf)
94 syscall_printf ("msgctl (msqid = %d, cmd = 0x%x, buf = %p)",
97 if (efault.faulted (EFAULT))
112 syscall_printf ("-1 [%d] = msgctl ()", EINVAL);
116 client_request_msg request (msqid, cmd, buf);
117 if (request.make_request () == -1 || request.retval () == -1)
119 syscall_printf ("-1 [%d] = msgctl ()", request.error_code ());
120 set_errno (request.error_code ());
121 if (request.error_code () == ENOSYS)
125 return request.retval ();
129 msgget (key_t key, int msgflg)
131 syscall_printf ("msgget (key = %U, msgflg = 0x%x)", key, msgflg);
132 client_request_msg request (key, msgflg);
133 if (request.make_request () == -1 || request.retval () == -1)
135 syscall_printf ("-1 [%d] = msgget ()", request.error_code ());
136 set_errno (request.error_code ());
137 if (request.error_code () == ENOSYS)
141 return request.retval ();
145 msgrcv (int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg)
147 syscall_printf ("msgrcv (msqid = %d, msgp = %p, msgsz = %d, "
148 "msgtyp = %d, msgflg = 0x%x)",
149 msqid, msgp, msgsz, msgtyp, msgflg);
151 if (efault.faulted (EFAULT))
153 client_request_msg request (msqid, msgp, msgsz, msgtyp, msgflg);
154 if (request.make_request () == -1 || request.rcvval () == -1)
156 syscall_printf ("-1 [%d] = msgrcv ()", request.error_code ());
157 set_errno (request.error_code ());
158 if (request.error_code () == ENOSYS)
162 return request.rcvval ();
166 msgsnd (int msqid, const void *msgp, size_t msgsz, int msgflg)
168 syscall_printf ("msgsnd (msqid = %d, msgp = %p, msgsz = %d, msgflg = 0x%x)",
169 msqid, msgp, msgsz, msgflg);
171 if (efault.faulted (EFAULT))
173 client_request_msg request (msqid, msgp, msgsz, msgflg);
174 if (request.make_request () == -1 || request.retval () == -1)
176 syscall_printf ("-1 [%d] = msgsnd ()", request.error_code ());
177 set_errno (request.error_code ());
178 if (request.error_code () == ENOSYS)
182 return request.retval ();