| #include <errno.h> |
| #include <sys/msg.h> |
| #include "ipc.h" |
| #ifdef __UCLIBC_HAS_THREADS_NATIVE__ |
| #include "sysdep-cancel.h" |
| #else |
| #define SINGLE_THREAD_P 1 |
| #endif |
| |
| |
| #ifdef L_msgctl |
| |
| #ifdef __NR_msgctl |
| #define __NR___libc_msgctl __NR_msgctl |
| static __inline__ _syscall3(int, __libc_msgctl, int, msqid, int, cmd, struct msqid_ds *, buf) |
| #endif |
| /* Message queue control operation. */ |
| int msgctl(int msqid, int cmd, struct msqid_ds *buf) |
| { |
| #ifdef __NR_msgctl |
| return __libc_msgctl(msqid, cmd | __IPC_64, buf); |
| #else |
| return __syscall_ipc(IPCOP_msgctl, msqid, cmd | __IPC_64, 0, buf, 0); |
| #endif |
| } |
| #endif |
| |
| |
| #ifdef L_msgget |
| #ifdef __NR_msgget |
| _syscall2(int, msgget, key_t, key, int, msgflg) |
| #else |
| /* Get messages queue. */ |
| int msgget (key_t key, int msgflg) |
| { |
| return __syscall_ipc(IPCOP_msgget ,key ,msgflg ,0 ,0, 0); |
| } |
| #endif |
| #endif |
| |
| |
| struct new_msg_buf{ |
| struct msgbuf * oldmsg; |
| long int r_msgtyp; /* the fifth arg of __syscall_ipc */ |
| }; |
| /* Receive message from message queue. */ |
| |
| |
| #ifdef L_msgrcv |
| #ifdef __NR_msgrcv |
| #define __NR___syscall_msgrcv __NR_msgrcv |
| static inline _syscall5(ssize_t, __syscall_msgrcv, int, msqid, void *, msgp, |
| size_t, msgsz, long int, msgtyp, int, msgflg) |
| #endif |
| static inline ssize_t do_msgrcv (int msqid, void *msgp, size_t msgsz, |
| long int msgtyp, int msgflg) |
| { |
| #ifdef __NR_msgrcv |
| return __syscall_msgrcv(msqid, msgp, msgsz, msgtyp, msgflg); |
| #else |
| struct new_msg_buf temp; |
| |
| temp.r_msgtyp = msgtyp; |
| temp.oldmsg = msgp; |
| return __syscall_ipc(IPCOP_msgrcv ,msqid ,msgsz ,msgflg ,&temp, 0); |
| #endif |
| } |
| ssize_t msgrcv (int msqid, void *msgp, size_t msgsz, |
| long int msgtyp, int msgflg) |
| { |
| if (SINGLE_THREAD_P) |
| return do_msgrcv(msqid, msgp, msgsz, msgtyp, msgflg); |
| #ifdef __UCLIBC_HAS_THREADS_NATIVE__ |
| int oldtype = LIBC_CANCEL_ASYNC (); |
| int result = do_msgrcv(msqid, msgp, msgsz, msgtyp, msgflg); |
| LIBC_CANCEL_RESET (oldtype); |
| return result; |
| #endif |
| } |
| #endif |
| |
| |
| |
| #ifdef L_msgsnd |
| #ifdef __NR_msgsnd |
| #define __NR___syscall_msgsnd __NR_msgsnd |
| static inline _syscall4(int, __syscall_msgsnd, int, msqid, const void *, msgp, |
| size_t, msgsz, int, msgflg) |
| #endif |
| /* Send message to message queue. */ |
| static inline int do_msgsnd (int msqid, const void *msgp, size_t msgsz, |
| int msgflg) |
| { |
| #ifdef __NR_msgsnd |
| return __syscall_msgsnd(msqid, msgp, msgsz, msgflg); |
| #else |
| return __syscall_ipc(IPCOP_msgsnd, msqid, msgsz, msgflg, (void *)msgp, 0); |
| #endif |
| } |
| int msgsnd (int msqid, const void *msgp, size_t msgsz, int msgflg) |
| { |
| if (SINGLE_THREAD_P) |
| return do_msgsnd(msqid, msgp, msgsz, msgflg); |
| #ifdef __UCLIBC_HAS_THREADS_NATIVE__ |
| int oldtype = LIBC_CANCEL_ASYNC (); |
| int result = do_msgsnd(msqid, msgp, msgsz, msgflg); |
| LIBC_CANCEL_RESET (oldtype); |
| return result; |
| #endif |
| } |
| #endif |
| |