OSDN Git Service

* path.cc (conv_path_list): Take cygwin_conv_path_t as third parameter.
[pf3gnuchains/pf3gnuchains4x.git] / winsup / cygwin / msg.cc
1 /* msg.cc: XSI IPC interface for Cygwin.
2
3    Copyright 2003, 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 }