| 1 | #ifndef _LINUX_MSG_H
|
| 2 | #define _LINUX_MSG_H
|
| 3 |
|
| 4 | #include <linux/ipc.h>
|
| 5 |
|
| 6 |
|
| 7 | #define MSG_STAT 11
|
| 8 | #define MSG_INFO 12
|
| 9 |
|
| 10 |
|
| 11 | #define MSG_NOERROR 010000
|
| 12 | #define MSG_EXCEPT 020000
|
| 13 |
|
| 14 |
|
| 15 | struct msqid_ds {
|
| 16 | struct ipc_perm msg_perm;
|
| 17 | struct msg *msg_first;
|
| 18 | struct msg *msg_last;
|
| 19 | __kernel_time_t msg_stime;
|
| 20 | __kernel_time_t msg_rtime;
|
| 21 | __kernel_time_t msg_ctime;
|
| 22 | unsigned long msg_lcbytes;
|
| 23 | unsigned long msg_lqbytes;
|
| 24 | unsigned short msg_cbytes;
|
| 25 | unsigned short msg_qnum;
|
| 26 | unsigned short msg_qbytes;
|
| 27 | __kernel_ipc_pid_t msg_lspid;
|
| 28 | __kernel_ipc_pid_t msg_lrpid;
|
| 29 | };
|
| 30 |
|
| 31 |
|
| 32 | #include <asm/msgbuf.h>
|
| 33 |
|
| 34 |
|
| 35 | struct msgbuf {
|
| 36 | long mtype;
|
| 37 | char mtext[1];
|
| 38 | };
|
| 39 |
|
| 40 |
|
| 41 | struct msginfo {
|
| 42 | int msgpool;
|
| 43 | int msgmap;
|
| 44 | int msgmax;
|
| 45 | int msgmnb;
|
| 46 | int msgmni;
|
| 47 | int msgssz;
|
| 48 | int msgtql;
|
| 49 | unsigned short msgseg;
|
| 50 | };
|
| 51 |
|
| 52 | |
| 53 | * Scaling factor to compute msgmni:
|
| 54 | * the memory dedicated to msg queues (msgmni * msgmnb) should occupy
|
| 55 | * at most 1/MSG_MEM_SCALE of the lowmem (see the formula in ipc/msg.c):
|
| 56 | * up to 8MB : msgmni = 16 (MSGMNI)
|
| 57 | * 4 GB : msgmni = 8K
|
| 58 | * more than 16 GB : msgmni = 32K (IPCMNI)
|
| 59 |
|
| 60 | #define MSG_MEM_SCALE 32
|
| 61 |
|
| 62 | #define MSGMNI 16
|
| 63 | #define MSGMAX 8192
|
| 64 | #define MSGMNB 16384
|
| 65 |
|
| 66 |
|
| 67 | #define MSGPOOL (MSGMNI * MSGMNB / 1024)
|
| 68 | #define MSGTQL MSGMNB
|
| 69 | #define MSGMAP MSGMNB
|
| 70 | #define MSGSSZ 16
|
| 71 | #define __MSGSEG ((MSGPOOL * 1024) / MSGSSZ)
|
| 72 | #define MSGSEG (__MSGSEG <= 0xffff ? __MSGSEG : 0xffff)
|
| 73 |
|
| 74 | #ifdef __KERNEL__
|
| 75 | #include <linux/list.h>
|
| 76 |
|
| 77 |
|
| 78 | struct msg_msg {
|
| 79 | struct list_head m_list;
|
| 80 | long m_type;
|
| 81 | int m_ts;
|
| 82 | struct msg_msgseg* next;
|
| 83 | void *security;
|
| 84 |
|
| 85 | };
|
| 86 |
|
| 87 |
|
| 88 | struct msg_queue {
|
| 89 | struct kern_ipc_perm q_perm;
|
| 90 | time_t q_stime;
|
| 91 | time_t q_rtime;
|
| 92 | time_t q_ctime;
|
| 93 | unsigned long q_cbytes;
|
| 94 | unsigned long q_qnum;
|
| 95 | unsigned long q_qbytes;
|
| 96 | pid_t q_lspid;
|
| 97 | pid_t q_lrpid;
|
| 98 |
|
| 99 | struct list_head q_messages;
|
| 100 | struct list_head q_receivers;
|
| 101 | struct list_head q_senders;
|
| 102 | };
|
| 103 |
|
| 104 |
|
| 105 | extern long do_msgsnd(int msqid, long mtype, void __user *mtext,
|
| 106 | size_t msgsz, int msgflg);
|
| 107 | extern long do_msgrcv(int msqid, long *pmtype, void __user *mtext,
|
| 108 | size_t msgsz, long msgtyp, int msgflg);
|
| 109 |
|
| 110 | #endif
|
| 111 |
|
| 112 | #endif
|