182 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			182 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C++
		
	
	
	
| /* msg.cc: XSI IPC interface for Cygwin.
 | |
| 
 | |
| This file is part of Cygwin.
 | |
| 
 | |
| This software is a copyrighted work licensed under the terms of the
 | |
| Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
 | |
| details. */
 | |
| 
 | |
| #include "winsup.h"
 | |
| #include <unistd.h>
 | |
| 
 | |
| #include "sigproc.h"
 | |
| #include "cygtls.h"
 | |
| 
 | |
| #include "cygserver_msg.h"
 | |
| 
 | |
| /*
 | |
|  * client_request_msg Constructors
 | |
|  */
 | |
| 
 | |
| client_request_msg::client_request_msg (int msqid,
 | |
| 					int cmd,
 | |
| 					struct msqid_ds *buf)
 | |
|   : client_request (CYGSERVER_REQUEST_MSG, &_parameters, sizeof (_parameters))
 | |
| {
 | |
|   _parameters.in.msgop = MSGOP_msgctl;
 | |
|   ipc_set_proc_info (_parameters.in.ipcblk);
 | |
| 
 | |
|    _parameters.in.ctlargs.msqid = msqid;
 | |
|    _parameters.in.ctlargs.cmd = cmd;
 | |
|    _parameters.in.ctlargs.buf = buf;
 | |
| 
 | |
|   msglen (sizeof (_parameters.in));
 | |
| }
 | |
| 
 | |
| client_request_msg::client_request_msg (key_t key,
 | |
| 					int msgflg)
 | |
|   : client_request (CYGSERVER_REQUEST_MSG, &_parameters, sizeof (_parameters))
 | |
| {
 | |
|   _parameters.in.msgop = MSGOP_msgget;
 | |
|   ipc_set_proc_info (_parameters.in.ipcblk);
 | |
| 
 | |
|   _parameters.in.getargs.key = key;
 | |
|   _parameters.in.getargs.msgflg = msgflg;
 | |
| 
 | |
|   msglen (sizeof (_parameters.in));
 | |
| }
 | |
| 
 | |
| client_request_msg::client_request_msg (int msqid,
 | |
| 					void *msgp,
 | |
| 					size_t msgsz,
 | |
| 					long msgtyp,
 | |
| 					int msgflg)
 | |
|   : client_request (CYGSERVER_REQUEST_MSG, &_parameters, sizeof (_parameters))
 | |
| {
 | |
|   _parameters.in.msgop = MSGOP_msgrcv;
 | |
|   ipc_set_proc_info (_parameters.in.ipcblk);
 | |
| 
 | |
|   _parameters.in.rcvargs.msqid = msqid;
 | |
|   _parameters.in.rcvargs.msgp = msgp;
 | |
|   _parameters.in.rcvargs.msgsz = msgsz;
 | |
|   _parameters.in.rcvargs.msgtyp = msgtyp;
 | |
|   _parameters.in.rcvargs.msgflg = msgflg;
 | |
| 
 | |
|   msglen (sizeof (_parameters.in));
 | |
| }
 | |
| 
 | |
| client_request_msg::client_request_msg (int msqid,
 | |
| 					const void *msgp,
 | |
| 					size_t msgsz,
 | |
| 					int msgflg)
 | |
|   : client_request (CYGSERVER_REQUEST_MSG, &_parameters, sizeof (_parameters))
 | |
| {
 | |
|   _parameters.in.msgop = MSGOP_msgsnd;
 | |
|   ipc_set_proc_info (_parameters.in.ipcblk);
 | |
| 
 | |
|   _parameters.in.sndargs.msqid = msqid;
 | |
|   _parameters.in.sndargs.msgp = msgp;
 | |
|   _parameters.in.sndargs.msgsz = msgsz;
 | |
|   _parameters.in.sndargs.msgflg = msgflg;
 | |
| 
 | |
|   msglen (sizeof (_parameters.in));
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * XSI message queue API.  These are exported by the DLL.
 | |
|  */
 | |
| 
 | |
| extern "C" int
 | |
| msgctl (int msqid, int cmd, struct msqid_ds *buf)
 | |
| {
 | |
|   syscall_printf ("msgctl (msqid = %d, cmd = %y, buf = %p)", msqid, cmd, buf);
 | |
|   __try
 | |
|     {
 | |
|       switch (cmd)
 | |
| 	{
 | |
| 	  case IPC_STAT:
 | |
| 	    break;
 | |
| 	  case IPC_SET:
 | |
| 	    break;
 | |
| 	  case IPC_RMID:
 | |
| 	    break;
 | |
| 	  case IPC_INFO:
 | |
| 	    break;
 | |
| 	  case MSG_INFO:
 | |
| 	    break;
 | |
| 	  default:
 | |
| 	    syscall_printf ("-1 [%d] = msgctl ()", EINVAL);
 | |
| 	    set_errno (EINVAL);
 | |
| 	    __leave;
 | |
| 	}
 | |
|       client_request_msg request (msqid, cmd, buf);
 | |
|       if (request.make_request () == -1 || request.retval () == -1)
 | |
| 	{
 | |
| 	  syscall_printf ("-1 [%d] = msgctl ()", request.error_code ());
 | |
| 	  set_errno (request.error_code ());
 | |
| 	  __leave;
 | |
| 	}
 | |
|       return request.retval ();
 | |
|     }
 | |
|   __except (EFAULT) {}
 | |
|   __endtry
 | |
|   return -1;
 | |
| }
 | |
| 
 | |
| extern "C" int
 | |
| msgget (key_t key, int msgflg)
 | |
| {
 | |
|   syscall_printf ("msgget (key = %U, msgflg = %y)", key, msgflg);
 | |
|   client_request_msg request (key, msgflg);
 | |
|   if (request.make_request () == -1 || request.retval () == -1)
 | |
|     {
 | |
|       syscall_printf ("-1 [%d] = msgget ()", request.error_code ());
 | |
|       set_errno (request.error_code ());
 | |
|       return -1;
 | |
|     }
 | |
|   return request.retval ();
 | |
| }
 | |
| 
 | |
| extern "C" ssize_t
 | |
| msgrcv (int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg)
 | |
| {
 | |
|   syscall_printf ("msgrcv (msqid = %d, msgp = %p, msgsz = %ld, "
 | |
| 		  "msgtyp = %d, msgflg = %y)",
 | |
| 		  msqid, msgp, msgsz, msgtyp, msgflg);
 | |
|   __try
 | |
|     {
 | |
|       client_request_msg request (msqid, msgp, msgsz, msgtyp, msgflg);
 | |
|       if (request.make_request () == -1 || request.rcvval () == -1)
 | |
| 	{
 | |
| 	  syscall_printf ("-1 [%d] = msgrcv ()", request.error_code ());
 | |
| 	  set_errno (request.error_code ());
 | |
| 	  __leave;
 | |
| 	}
 | |
|       return request.rcvval ();
 | |
|     }
 | |
|   __except (EFAULT) {}
 | |
|   __endtry
 | |
|   return -1;
 | |
| }
 | |
| 
 | |
| extern "C" int
 | |
| msgsnd (int msqid, const void *msgp, size_t msgsz, int msgflg)
 | |
| {
 | |
|   syscall_printf ("msgsnd (msqid = %d, msgp = %p, msgsz = %ld, msgflg = %y)",
 | |
| 		  msqid, msgp, msgsz, msgflg);
 | |
|   __try
 | |
|     {
 | |
|       client_request_msg request (msqid, msgp, msgsz, msgflg);
 | |
|       if (request.make_request () == -1 || request.retval () == -1)
 | |
| 	{
 | |
| 	  syscall_printf ("-1 [%d] = msgsnd ()", request.error_code ());
 | |
| 	  set_errno (request.error_code ());
 | |
| 	  __leave;
 | |
| 	}
 | |
|       return request.retval ();
 | |
|     }
 | |
|   __except (EFAULT) {}
 | |
|   __endtry
 | |
|   return -1;
 | |
| }
 |