]> sourceware.org Git - newlib-cygwin.git/blob - winsup/cygwin/msg.cc
Throughout, update copyrights to reflect dates which correspond to main-branch
[newlib-cygwin.git] / winsup / cygwin / msg.cc
1 /* msg.cc: XSI IPC interface for Cygwin.
2
3 Copyright 2002, 2003, 2004, 2005, 2008, 2009 Red Hat, Inc.
4
5 This file is part of Cygwin.
6
7 This software is a copyrighted work licensed under the terms of the
8 Cygwin license. Please consult the file "CYGWIN_LICENSE" for
9 details. */
10
11 #include "winsup.h"
12 #include <unistd.h>
13
14 #include "sigproc.h"
15 #include "cygtls.h"
16
17 #include "cygserver_msg.h"
18
19 /*
20 * client_request_msg Constructors
21 */
22
23 client_request_msg::client_request_msg (int msqid,
24 int cmd,
25 struct msqid_ds *buf)
26 : client_request (CYGSERVER_REQUEST_MSG, &_parameters, sizeof (_parameters))
27 {
28 _parameters.in.msgop = MSGOP_msgctl;
29 ipc_set_proc_info (_parameters.in.ipcblk);
30
31 _parameters.in.ctlargs.msqid = msqid;
32 _parameters.in.ctlargs.cmd = cmd;
33 _parameters.in.ctlargs.buf = buf;
34
35 msglen (sizeof (_parameters.in));
36 }
37
38 client_request_msg::client_request_msg (key_t key,
39 int msgflg)
40 : client_request (CYGSERVER_REQUEST_MSG, &_parameters, sizeof (_parameters))
41 {
42 _parameters.in.msgop = MSGOP_msgget;
43 ipc_set_proc_info (_parameters.in.ipcblk);
44
45 _parameters.in.getargs.key = key;
46 _parameters.in.getargs.msgflg = msgflg;
47
48 msglen (sizeof (_parameters.in));
49 }
50
51 client_request_msg::client_request_msg (int msqid,
52 void *msgp,
53 size_t msgsz,
54 long msgtyp,
55 int msgflg)
56 : client_request (CYGSERVER_REQUEST_MSG, &_parameters, sizeof (_parameters))
57 {
58 _parameters.in.msgop = MSGOP_msgrcv;
59 ipc_set_proc_info (_parameters.in.ipcblk);
60
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;
66
67 msglen (sizeof (_parameters.in));
68 }
69
70 client_request_msg::client_request_msg (int msqid,
71 const void *msgp,
72 size_t msgsz,
73 int msgflg)
74 : client_request (CYGSERVER_REQUEST_MSG, &_parameters, sizeof (_parameters))
75 {
76 _parameters.in.msgop = MSGOP_msgsnd;
77 ipc_set_proc_info (_parameters.in.ipcblk);
78
79 _parameters.in.sndargs.msqid = msqid;
80 _parameters.in.sndargs.msgp = msgp;
81 _parameters.in.sndargs.msgsz = msgsz;
82 _parameters.in.sndargs.msgflg = msgflg;
83
84 msglen (sizeof (_parameters.in));
85 }
86
87 /*
88 * XSI message queue API. These are exported by the DLL.
89 */
90
91 extern "C" int
92 msgctl (int msqid, int cmd, struct msqid_ds *buf)
93 {
94 syscall_printf ("msgctl (msqid = %d, cmd = 0x%x, buf = %p)",
95 msqid, cmd, buf);
96 myfault efault;
97 if (efault.faulted (EFAULT))
98 return -1;
99 switch (cmd)
100 {
101 case IPC_STAT:
102 break;
103 case IPC_SET:
104 break;
105 case IPC_RMID:
106 break;
107 case IPC_INFO:
108 break;
109 case MSG_INFO:
110 break;
111 default:
112 syscall_printf ("-1 [%d] = msgctl ()", EINVAL);
113 set_errno (EINVAL);
114 return -1;
115 }
116 client_request_msg request (msqid, cmd, buf);
117 if (request.make_request () == -1 || request.retval () == -1)
118 {
119 syscall_printf ("-1 [%d] = msgctl ()", request.error_code ());
120 set_errno (request.error_code ());
121 if (request.error_code () == ENOSYS)
122 raise (SIGSYS);
123 return -1;
124 }
125 return request.retval ();
126 }
127
128 extern "C" int
129 msgget (key_t key, int msgflg)
130 {
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)
134 {
135 syscall_printf ("-1 [%d] = msgget ()", request.error_code ());
136 set_errno (request.error_code ());
137 if (request.error_code () == ENOSYS)
138 raise (SIGSYS);
139 return -1;
140 }
141 return request.retval ();
142 }
143
144 extern "C" ssize_t
145 msgrcv (int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg)
146 {
147 syscall_printf ("msgrcv (msqid = %d, msgp = %p, msgsz = %d, "
148 "msgtyp = %d, msgflg = 0x%x)",
149 msqid, msgp, msgsz, msgtyp, msgflg);
150 myfault efault;
151 if (efault.faulted (EFAULT))
152 return -1;
153 client_request_msg request (msqid, msgp, msgsz, msgtyp, msgflg);
154 if (request.make_request () == -1 || request.rcvval () == -1)
155 {
156 syscall_printf ("-1 [%d] = msgrcv ()", request.error_code ());
157 set_errno (request.error_code ());
158 if (request.error_code () == ENOSYS)
159 raise (SIGSYS);
160 return -1;
161 }
162 return request.rcvval ();
163 }
164
165 extern "C" int
166 msgsnd (int msqid, const void *msgp, size_t msgsz, int msgflg)
167 {
168 syscall_printf ("msgsnd (msqid = %d, msgp = %p, msgsz = %d, msgflg = 0x%x)",
169 msqid, msgp, msgsz, msgflg);
170 myfault efault;
171 if (efault.faulted (EFAULT))
172 return -1;
173 client_request_msg request (msqid, msgp, msgsz, msgflg);
174 if (request.make_request () == -1 || request.retval () == -1)
175 {
176 syscall_printf ("-1 [%d] = msgsnd ()", request.error_code ());
177 set_errno (request.error_code ());
178 if (request.error_code () == ENOSYS)
179 raise (SIGSYS);
180 return -1;
181 }
182 return request.retval ();
183 }
This page took 0.042182 seconds and 5 git commands to generate.