/* 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 #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; }