| #ifndef _LINUX_MSG_H | 
 | #define _LINUX_MSG_H | 
 |  | 
 | #include <linux/list.h> | 
 | #include <uapi/linux/msg.h> | 
 |  | 
 | /* one msg_msg structure for each message */ | 
 | struct msg_msg { | 
 | 	struct list_head m_list;  | 
 | 	long  m_type;           | 
 | 	int m_ts;           /* message text size */ | 
 | 	struct msg_msgseg* next; | 
 | 	void *security; | 
 | 	/* the actual message follows immediately */ | 
 | }; | 
 |  | 
 | /* one msq_queue structure for each present queue on the system */ | 
 | struct msg_queue { | 
 | 	struct kern_ipc_perm q_perm; | 
 | 	time_t q_stime;			/* last msgsnd time */ | 
 | 	time_t q_rtime;			/* last msgrcv time */ | 
 | 	time_t q_ctime;			/* last change time */ | 
 | 	unsigned long q_cbytes;		/* current number of bytes on queue */ | 
 | 	unsigned long q_qnum;		/* number of messages in queue */ | 
 | 	unsigned long q_qbytes;		/* max number of bytes on queue */ | 
 | 	pid_t q_lspid;			/* pid of last msgsnd */ | 
 | 	pid_t q_lrpid;			/* last receive pid */ | 
 |  | 
 | 	struct list_head q_messages; | 
 | 	struct list_head q_receivers; | 
 | 	struct list_head q_senders; | 
 | }; | 
 |  | 
 | /* Helper routines for sys_msgsnd and sys_msgrcv */ | 
 | extern long do_msgsnd(int msqid, long mtype, void __user *mtext, | 
 | 			size_t msgsz, int msgflg); | 
 | extern long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, | 
 | 		      int msgflg, | 
 | 		      long (*msg_fill)(void __user *, struct msg_msg *, | 
 | 				       size_t)); | 
 |  | 
 | #endif /* _LINUX_MSG_H */ |