1/*- 2 * Implementation of SVID messages 3 * 4 * Author: Daniel Boulet 5 * 6 * Copyright 1993 Daniel Boulet and RTMX Inc. 7 * 8 * This system call was implemented by Daniel Boulet under contract from RTMX. --- 34 unchanged lines hidden (view full) --- 43 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 44 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 45 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 46 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 47 * SUCH DAMAGE. 48 */ 49 50#include <sys/cdefs.h> |
51__FBSDID("$FreeBSD: stable/10/sys/kern/sysv_msg.c 284665 2015-06-21 06:28:26Z trasz $"); |
52 53#include "opt_compat.h" 54#include "opt_sysvipc.h" 55 56#include <sys/param.h> 57#include <sys/systm.h> 58#include <sys/sysproto.h> 59#include <sys/kernel.h> --- 558 unchanged lines hidden (view full) --- 618 break; 619 } 620 if (msqid == msginfo.msgmni) { 621 DPRINTF(("no more msqid_ds's available\n")); 622 error = ENOSPC; 623 goto done2; 624 } 625#ifdef RACCT |
626 if (racct_enable) { 627 PROC_LOCK(td->td_proc); 628 error = racct_add(td->td_proc, RACCT_NMSGQ, 1); 629 PROC_UNLOCK(td->td_proc); 630 if (error != 0) { 631 error = ENOSPC; 632 goto done2; 633 } |
634 } 635#endif 636 DPRINTF(("msqid %d is available\n", msqid)); 637 msqkptr->u.msg_perm.key = key; 638 msqkptr->u.msg_perm.cuid = cred->cr_uid; 639 msqkptr->u.msg_perm.uid = cred->cr_uid; 640 msqkptr->u.msg_perm.cgid = cred->cr_gid; 641 msqkptr->u.msg_perm.gid = cred->cr_gid; --- 85 unchanged lines hidden (view full) --- 727 728#ifdef MAC 729 error = mac_sysvmsq_check_msqsnd(td->td_ucred, msqkptr); 730 if (error != 0) 731 goto done2; 732#endif 733 734#ifdef RACCT |
735 if (racct_enable) { 736 PROC_LOCK(td->td_proc); 737 if (racct_add(td->td_proc, RACCT_MSGQQUEUED, 1)) { 738 PROC_UNLOCK(td->td_proc); 739 error = EAGAIN; 740 goto done2; 741 } 742 saved_msgsz = msgsz; 743 if (racct_add(td->td_proc, RACCT_MSGQSIZE, msgsz)) { 744 racct_sub(td->td_proc, RACCT_MSGQQUEUED, 1); 745 PROC_UNLOCK(td->td_proc); 746 error = EAGAIN; 747 goto done2; 748 } |
749 PROC_UNLOCK(td->td_proc); |
750 } |
751#endif 752 753 segs_needed = (msgsz + msginfo.msgssz - 1) / msginfo.msgssz; 754 DPRINTF(("msgsz=%zu, msgssz=%d, segs_needed=%d\n", msgsz, 755 msginfo.msgssz, segs_needed)); 756 for (;;) { 757 int need_more_resources = 0; 758 --- 240 unchanged lines hidden (view full) --- 999 msqkptr->u.msg_qnum++; 1000 msqkptr->u.msg_lspid = td->td_proc->p_pid; 1001 msqkptr->u.msg_stime = time_second; 1002 1003 wakeup(msqkptr); 1004 td->td_retval[0] = 0; 1005done3: 1006#ifdef RACCT |
1007 if (racct_enable && error != 0) { |
1008 PROC_LOCK(td->td_proc); 1009 racct_sub(td->td_proc, RACCT_MSGQQUEUED, 1); 1010 racct_sub(td->td_proc, RACCT_MSGQSIZE, saved_msgsz); 1011 PROC_UNLOCK(td->td_proc); 1012 } 1013#endif 1014done2: 1015 mtx_unlock(&msq_mtx); --- 581 unchanged lines hidden --- |