| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | #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_msgctlstatic __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#endifstruct 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_msgrcvstatic inline _syscall5(ssize_t, __syscall_msgrcv, int, msqid, void *, msgp,			size_t, msgsz, long int, msgtyp, int, msgflg)#endifstatic 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_msgsndstatic 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
 |