sysv_msg.c (100523) | sysv_msg.c (101772) |
---|---|
1/* $FreeBSD: head/sys/kern/sysv_msg.c 100523 2002-07-22 18:27:54Z alfred $ */ | 1/* $FreeBSD: head/sys/kern/sysv_msg.c 101772 2002-08-13 08:00:36Z alfred $ */ |
2 3/* 4 * Implementation of SVID messages 5 * 6 * Author: Daniel Boulet 7 * 8 * Copyright 1993 Daniel Boulet and RTMX Inc. 9 * --- 114 unchanged lines hidden (view full) --- 124 125static int nfree_msgmaps; /* # of free map entries */ 126static short free_msgmaps; /* head of linked list of free map entries */ 127static struct msg *free_msghdrs;/* list of free msg headers */ 128static char *msgpool; /* MSGMAX byte long msg buffer pool */ 129static struct msgmap *msgmaps; /* MSGSEG msgmap structures */ 130static struct msg *msghdrs; /* MSGTQL msg headers */ 131static struct msqid_ds *msqids; /* MSGMNI msqid_ds struct's */ | 2 3/* 4 * Implementation of SVID messages 5 * 6 * Author: Daniel Boulet 7 * 8 * Copyright 1993 Daniel Boulet and RTMX Inc. 9 * --- 114 unchanged lines hidden (view full) --- 124 125static int nfree_msgmaps; /* # of free map entries */ 126static short free_msgmaps; /* head of linked list of free map entries */ 127static struct msg *free_msghdrs;/* list of free msg headers */ 128static char *msgpool; /* MSGMAX byte long msg buffer pool */ 129static struct msgmap *msgmaps; /* MSGSEG msgmap structures */ 130static struct msg *msghdrs; /* MSGTQL msg headers */ 131static struct msqid_ds *msqids; /* MSGMNI msqid_ds struct's */ |
132static struct mtx msq_mtx; /* global mutex for message queues. */ |
|
132 133static void 134msginit() 135{ 136 register int i; 137 138 TUNABLE_INT_FETCH("kern.ipc.msgseg", &msginfo.msgseg); 139 TUNABLE_INT_FETCH("kern.ipc.msgssz", &msginfo.msgssz); --- 58 unchanged lines hidden (view full) --- 198 if (msqids == NULL) 199 panic("msqids is NULL"); 200 201 for (i = 0; i < msginfo.msgmni; i++) { 202 msqids[i].msg_qbytes = 0; /* implies entry is available */ 203 msqids[i].msg_perm.seq = 0; /* reset to a known value */ 204 msqids[i].msg_perm.mode = 0; 205 } | 133 134static void 135msginit() 136{ 137 register int i; 138 139 TUNABLE_INT_FETCH("kern.ipc.msgseg", &msginfo.msgseg); 140 TUNABLE_INT_FETCH("kern.ipc.msgssz", &msginfo.msgssz); --- 58 unchanged lines hidden (view full) --- 199 if (msqids == NULL) 200 panic("msqids is NULL"); 201 202 for (i = 0; i < msginfo.msgmni; i++) { 203 msqids[i].msg_qbytes = 0; /* implies entry is available */ 204 msqids[i].msg_perm.seq = 0; /* reset to a known value */ 205 msqids[i].msg_perm.mode = 0; 206 } |
207 mtx_init(&msq_mtx, "msq", NULL, MTX_DEF); |
|
206} 207 208static int 209msgunload() 210{ 211 struct msqid_ds *msqptr; 212 int msqid; 213 --- 11 unchanged lines hidden (view full) --- 225 } 226 if (msqid != msginfo.msgmni) 227 return (EBUSY); 228 229 free(msgpool, M_MSG); 230 free(msgmaps, M_MSG); 231 free(msghdrs, M_MSG); 232 free(msqids, M_MSG); | 208} 209 210static int 211msgunload() 212{ 213 struct msqid_ds *msqptr; 214 int msqid; 215 --- 11 unchanged lines hidden (view full) --- 227 } 228 if (msqid != msginfo.msgmni) 229 return (EBUSY); 230 231 free(msgpool, M_MSG); 232 free(msgmaps, M_MSG); 233 free(msghdrs, M_MSG); 234 free(msqids, M_MSG); |
235 mtx_destroy(&msq_mtx); |
|
233 return (0); 234} 235 236 237static int 238sysvmsg_modload(struct module *module, int cmd, void *arg) 239{ 240 int error = 0; --- 49 unchanged lines hidden (view full) --- 290 } */ *uap; 291{ 292 int error; 293 294 if (!jail_sysvipc_allowed && jailed(td->td_ucred)) 295 return (ENOSYS); 296 if (uap->which >= sizeof(msgcalls)/sizeof(msgcalls[0])) 297 return (EINVAL); | 236 return (0); 237} 238 239 240static int 241sysvmsg_modload(struct module *module, int cmd, void *arg) 242{ 243 int error = 0; --- 49 unchanged lines hidden (view full) --- 293 } */ *uap; 294{ 295 int error; 296 297 if (!jail_sysvipc_allowed && jailed(td->td_ucred)) 298 return (ENOSYS); 299 if (uap->which >= sizeof(msgcalls)/sizeof(msgcalls[0])) 300 return (EINVAL); |
298 mtx_lock(&Giant); | |
299 error = (*msgcalls[uap->which])(td, &uap->a2); | 301 error = (*msgcalls[uap->which])(td, &uap->a2); |
300 mtx_unlock(&Giant); | |
301 return (error); 302} 303 304static void 305msg_freehdr(msghdr) 306 struct msg *msghdr; 307{ 308 while (msghdr->msg_ts > 0) { --- 38 unchanged lines hidden (view full) --- 347 int rval, error; 348 struct msqid_ds msqbuf; 349 register struct msqid_ds *msqptr; 350 351 DPRINTF(("call to msgctl(%d, %d, 0x%x)\n", msqid, cmd, user_msqptr)); 352 if (!jail_sysvipc_allowed && jailed(td->td_ucred)) 353 return (ENOSYS); 354 | 302 return (error); 303} 304 305static void 306msg_freehdr(msghdr) 307 struct msg *msghdr; 308{ 309 while (msghdr->msg_ts > 0) { --- 38 unchanged lines hidden (view full) --- 348 int rval, error; 349 struct msqid_ds msqbuf; 350 register struct msqid_ds *msqptr; 351 352 DPRINTF(("call to msgctl(%d, %d, 0x%x)\n", msqid, cmd, user_msqptr)); 353 if (!jail_sysvipc_allowed && jailed(td->td_ucred)) 354 return (ENOSYS); 355 |
355 mtx_lock(&Giant); | |
356 msqid = IPCID_TO_IX(msqid); 357 358 if (msqid < 0 || msqid >= msginfo.msgmni) { 359 DPRINTF(("msqid (%d) out of range (0<=msqid<%d)\n", msqid, 360 msginfo.msgmni)); | 356 msqid = IPCID_TO_IX(msqid); 357 358 if (msqid < 0 || msqid >= msginfo.msgmni) { 359 DPRINTF(("msqid (%d) out of range (0<=msqid<%d)\n", msqid, 360 msginfo.msgmni)); |
361 error = EINVAL; 362 goto done2; | 361 return (EINVAL); |
363 } | 362 } |
363 if (cmd == IPC_SET && 364 (error = copyin(user_msqptr, &msqbuf, sizeof(msqbuf))) != 0) 365 return (error); |
|
364 365 msqptr = &msqids[msqid]; 366 | 366 367 msqptr = &msqids[msqid]; 368 |
369 mtx_lock(&msq_mtx); |
|
367 if (msqptr->msg_qbytes == 0) { 368 DPRINTF(("no such msqid\n")); 369 error = EINVAL; 370 goto done2; 371 } 372 if (msqptr->msg_perm.seq != IPCID_TO_SEQ(uap->msqid)) { 373 DPRINTF(("wrong sequence number\n")); 374 error = EINVAL; --- 33 unchanged lines hidden (view full) --- 408 wakeup(msqptr); 409 } 410 411 break; 412 413 case IPC_SET: 414 if ((error = ipcperm(td, &msqptr->msg_perm, IPC_M))) 415 goto done2; | 370 if (msqptr->msg_qbytes == 0) { 371 DPRINTF(("no such msqid\n")); 372 error = EINVAL; 373 goto done2; 374 } 375 if (msqptr->msg_perm.seq != IPCID_TO_SEQ(uap->msqid)) { 376 DPRINTF(("wrong sequence number\n")); 377 error = EINVAL; --- 33 unchanged lines hidden (view full) --- 411 wakeup(msqptr); 412 } 413 414 break; 415 416 case IPC_SET: 417 if ((error = ipcperm(td, &msqptr->msg_perm, IPC_M))) 418 goto done2; |
416 if ((error = copyin(user_msqptr, &msqbuf, sizeof(msqbuf))) != 0) 417 goto done2; | |
418 if (msqbuf.msg_qbytes > msqptr->msg_qbytes) { 419 error = suser(td); 420 if (error) 421 goto done2; 422 } 423 if (msqbuf.msg_qbytes > msginfo.msgmnb) { 424 DPRINTF(("can't increase msg_qbytes beyond %d" 425 "(truncating)\n", msginfo.msgmnb)); --- 12 unchanged lines hidden (view full) --- 438 msqptr->msg_ctime = time_second; 439 break; 440 441 case IPC_STAT: 442 if ((error = ipcperm(td, &msqptr->msg_perm, IPC_R))) { 443 DPRINTF(("requester doesn't have read access\n")); 444 goto done2; 445 } | 419 if (msqbuf.msg_qbytes > msqptr->msg_qbytes) { 420 error = suser(td); 421 if (error) 422 goto done2; 423 } 424 if (msqbuf.msg_qbytes > msginfo.msgmnb) { 425 DPRINTF(("can't increase msg_qbytes beyond %d" 426 "(truncating)\n", msginfo.msgmnb)); --- 12 unchanged lines hidden (view full) --- 439 msqptr->msg_ctime = time_second; 440 break; 441 442 case IPC_STAT: 443 if ((error = ipcperm(td, &msqptr->msg_perm, IPC_R))) { 444 DPRINTF(("requester doesn't have read access\n")); 445 goto done2; 446 } |
446 error = copyout(msqptr, user_msqptr, sizeof(struct msqid_ds)); | |
447 break; 448 449 default: 450 DPRINTF(("invalid command %d\n", cmd)); 451 error = EINVAL; 452 goto done2; 453 } 454 455 if (error == 0) 456 td->td_retval[0] = rval; 457done2: | 447 break; 448 449 default: 450 DPRINTF(("invalid command %d\n", cmd)); 451 error = EINVAL; 452 goto done2; 453 } 454 455 if (error == 0) 456 td->td_retval[0] = rval; 457done2: |
458 mtx_unlock(&Giant); | 458 mtx_unlock(&msq_mtx); 459 if (cmd == IPC_STAT && error == 0) 460 error = copyout(msqptr, user_msqptr, sizeof(struct msqid_ds)); |
459 return(error); 460} 461 462#ifndef _SYS_SYSPROTO_H_ 463struct msgget_args { 464 key_t key; 465 int msgflg; 466}; --- 13 unchanged lines hidden (view full) --- 480 struct ucred *cred = td->td_ucred; 481 register struct msqid_ds *msqptr = NULL; 482 483 DPRINTF(("msgget(0x%x, 0%o)\n", key, msgflg)); 484 485 if (!jail_sysvipc_allowed && jailed(td->td_ucred)) 486 return (ENOSYS); 487 | 461 return(error); 462} 463 464#ifndef _SYS_SYSPROTO_H_ 465struct msgget_args { 466 key_t key; 467 int msgflg; 468}; --- 13 unchanged lines hidden (view full) --- 482 struct ucred *cred = td->td_ucred; 483 register struct msqid_ds *msqptr = NULL; 484 485 DPRINTF(("msgget(0x%x, 0%o)\n", key, msgflg)); 486 487 if (!jail_sysvipc_allowed && jailed(td->td_ucred)) 488 return (ENOSYS); 489 |
488 mtx_lock(&Giant); | 490 mtx_lock(&msq_mtx); |
489 if (key != IPC_PRIVATE) { 490 for (msqid = 0; msqid < msginfo.msgmni; msqid++) { 491 msqptr = &msqids[msqid]; 492 if (msqptr->msg_qbytes != 0 && 493 msqptr->msg_perm.key == key) 494 break; 495 } 496 if (msqid < msginfo.msgmni) { --- 55 unchanged lines hidden (view full) --- 552 error = ENOENT; 553 goto done2; 554 } 555 556found: 557 /* Construct the unique msqid */ 558 td->td_retval[0] = IXSEQ_TO_IPCID(msqid, msqptr->msg_perm); 559done2: | 491 if (key != IPC_PRIVATE) { 492 for (msqid = 0; msqid < msginfo.msgmni; msqid++) { 493 msqptr = &msqids[msqid]; 494 if (msqptr->msg_qbytes != 0 && 495 msqptr->msg_perm.key == key) 496 break; 497 } 498 if (msqid < msginfo.msgmni) { --- 55 unchanged lines hidden (view full) --- 554 error = ENOENT; 555 goto done2; 556 } 557 558found: 559 /* Construct the unique msqid */ 560 td->td_retval[0] = IXSEQ_TO_IPCID(msqid, msqptr->msg_perm); 561done2: |
560 mtx_unlock(&Giant); | 562 mtx_unlock(&msq_mtx); |
561 return (error); 562} 563 564#ifndef _SYS_SYSPROTO_H_ 565struct msgsnd_args { 566 int msqid; 567 void *msgp; 568 size_t msgsz; --- 18 unchanged lines hidden (view full) --- 587 register struct msg *msghdr; 588 short next; 589 590 DPRINTF(("call to msgsnd(%d, 0x%x, %d, %d)\n", msqid, user_msgp, msgsz, 591 msgflg)); 592 if (!jail_sysvipc_allowed && jailed(td->td_ucred)) 593 return (ENOSYS); 594 | 563 return (error); 564} 565 566#ifndef _SYS_SYSPROTO_H_ 567struct msgsnd_args { 568 int msqid; 569 void *msgp; 570 size_t msgsz; --- 18 unchanged lines hidden (view full) --- 589 register struct msg *msghdr; 590 short next; 591 592 DPRINTF(("call to msgsnd(%d, 0x%x, %d, %d)\n", msqid, user_msgp, msgsz, 593 msgflg)); 594 if (!jail_sysvipc_allowed && jailed(td->td_ucred)) 595 return (ENOSYS); 596 |
595 mtx_lock(&Giant); | 597 mtx_lock(&msq_mtx); |
596 msqid = IPCID_TO_IX(msqid); 597 598 if (msqid < 0 || msqid >= msginfo.msgmni) { 599 DPRINTF(("msqid (%d) out of range (0<=msqid<%d)\n", msqid, 600 msginfo.msgmni)); 601 error = EINVAL; 602 goto done2; 603 } --- 65 unchanged lines hidden (view full) --- 669 } else { 670 /* Force later arrivals to wait for our 671 request */ 672 DPRINTF(("we own the msqid_ds\n")); 673 msqptr->msg_perm.mode |= MSG_LOCKED; 674 we_own_it = 1; 675 } 676 DPRINTF(("goodnight\n")); | 598 msqid = IPCID_TO_IX(msqid); 599 600 if (msqid < 0 || msqid >= msginfo.msgmni) { 601 DPRINTF(("msqid (%d) out of range (0<=msqid<%d)\n", msqid, 602 msginfo.msgmni)); 603 error = EINVAL; 604 goto done2; 605 } --- 65 unchanged lines hidden (view full) --- 671 } else { 672 /* Force later arrivals to wait for our 673 request */ 674 DPRINTF(("we own the msqid_ds\n")); 675 msqptr->msg_perm.mode |= MSG_LOCKED; 676 we_own_it = 1; 677 } 678 DPRINTF(("goodnight\n")); |
677 error = tsleep(msqptr, (PZERO - 4) | PCATCH, | 679 error = msleep(msqptr, &msq_mtx, (PZERO - 4) | PCATCH, |
678 "msgwait", 0); 679 DPRINTF(("good morning, error=%d\n", error)); 680 if (we_own_it) 681 msqptr->msg_perm.mode &= ~MSG_LOCKED; 682 if (error != 0) { 683 DPRINTF(("msgsnd: interrupted system call\n")); 684 error = EINTR; 685 goto done2; --- 68 unchanged lines hidden (view full) --- 754 msghdr->msg_spot = next; 755 segs_needed--; 756 } 757 758 /* 759 * Copy in the message type 760 */ 761 | 680 "msgwait", 0); 681 DPRINTF(("good morning, error=%d\n", error)); 682 if (we_own_it) 683 msqptr->msg_perm.mode &= ~MSG_LOCKED; 684 if (error != 0) { 685 DPRINTF(("msgsnd: interrupted system call\n")); 686 error = EINTR; 687 goto done2; --- 68 unchanged lines hidden (view full) --- 756 msghdr->msg_spot = next; 757 segs_needed--; 758 } 759 760 /* 761 * Copy in the message type 762 */ 763 |
764 mtx_unlock(&msq_mtx); |
|
762 if ((error = copyin(user_msgp, &msghdr->msg_type, 763 sizeof(msghdr->msg_type))) != 0) { | 765 if ((error = copyin(user_msgp, &msghdr->msg_type, 766 sizeof(msghdr->msg_type))) != 0) { |
767 mtx_lock(&msq_mtx); |
|
764 DPRINTF(("error %d copying the message type\n", error)); 765 msg_freehdr(msghdr); 766 msqptr->msg_perm.mode &= ~MSG_LOCKED; 767 wakeup(msqptr); 768 goto done2; 769 } | 768 DPRINTF(("error %d copying the message type\n", error)); 769 msg_freehdr(msghdr); 770 msqptr->msg_perm.mode &= ~MSG_LOCKED; 771 wakeup(msqptr); 772 goto done2; 773 } |
774 mtx_lock(&msq_mtx); |
|
770 user_msgp = (char *)user_msgp + sizeof(msghdr->msg_type); 771 772 /* 773 * Validate the message type 774 */ 775 776 if (msghdr->msg_type < 1) { 777 msg_freehdr(msghdr); --- 14 unchanged lines hidden (view full) --- 792 if (msgsz > msginfo.msgssz) 793 tlen = msginfo.msgssz; 794 else 795 tlen = msgsz; 796 if (next <= -1) 797 panic("next too low #2"); 798 if (next >= msginfo.msgseg) 799 panic("next out of range #2"); | 775 user_msgp = (char *)user_msgp + sizeof(msghdr->msg_type); 776 777 /* 778 * Validate the message type 779 */ 780 781 if (msghdr->msg_type < 1) { 782 msg_freehdr(msghdr); --- 14 unchanged lines hidden (view full) --- 797 if (msgsz > msginfo.msgssz) 798 tlen = msginfo.msgssz; 799 else 800 tlen = msgsz; 801 if (next <= -1) 802 panic("next too low #2"); 803 if (next >= msginfo.msgseg) 804 panic("next out of range #2"); |
805 mtx_unlock(&msq_mtx); |
|
800 if ((error = copyin(user_msgp, &msgpool[next * msginfo.msgssz], 801 tlen)) != 0) { | 806 if ((error = copyin(user_msgp, &msgpool[next * msginfo.msgssz], 807 tlen)) != 0) { |
808 mtx_lock(&msq_mtx); |
|
802 DPRINTF(("error %d copying in message segment\n", 803 error)); 804 msg_freehdr(msghdr); 805 msqptr->msg_perm.mode &= ~MSG_LOCKED; 806 wakeup(msqptr); 807 goto done2; 808 } | 809 DPRINTF(("error %d copying in message segment\n", 810 error)); 811 msg_freehdr(msghdr); 812 msqptr->msg_perm.mode &= ~MSG_LOCKED; 813 wakeup(msqptr); 814 goto done2; 815 } |
816 mtx_lock(&msq_mtx); |
|
809 msgsz -= tlen; 810 user_msgp = (char *)user_msgp + tlen; 811 next = msgmaps[next].next; 812 } 813 if (next != -1) 814 panic("didn't use all the msg segments"); 815 816 /* --- 29 unchanged lines hidden (view full) --- 846 msqptr->msg_cbytes += msghdr->msg_ts; 847 msqptr->msg_qnum++; 848 msqptr->msg_lspid = td->td_proc->p_pid; 849 msqptr->msg_stime = time_second; 850 851 wakeup(msqptr); 852 td->td_retval[0] = 0; 853done2: | 817 msgsz -= tlen; 818 user_msgp = (char *)user_msgp + tlen; 819 next = msgmaps[next].next; 820 } 821 if (next != -1) 822 panic("didn't use all the msg segments"); 823 824 /* --- 29 unchanged lines hidden (view full) --- 854 msqptr->msg_cbytes += msghdr->msg_ts; 855 msqptr->msg_qnum++; 856 msqptr->msg_lspid = td->td_proc->p_pid; 857 msqptr->msg_stime = time_second; 858 859 wakeup(msqptr); 860 td->td_retval[0] = 0; 861done2: |
854 mtx_unlock(&Giant); | 862 mtx_unlock(&msq_mtx); |
855 return (error); 856} 857 858#ifndef _SYS_SYSPROTO_H_ 859struct msgrcv_args { 860 int msqid; 861 void *msgp; 862 size_t msgsz; --- 22 unchanged lines hidden (view full) --- 885 short next; 886 887 DPRINTF(("call to msgrcv(%d, 0x%x, %d, %ld, %d)\n", msqid, user_msgp, 888 msgsz, msgtyp, msgflg)); 889 890 if (!jail_sysvipc_allowed && jailed(td->td_ucred)) 891 return (ENOSYS); 892 | 863 return (error); 864} 865 866#ifndef _SYS_SYSPROTO_H_ 867struct msgrcv_args { 868 int msqid; 869 void *msgp; 870 size_t msgsz; --- 22 unchanged lines hidden (view full) --- 893 short next; 894 895 DPRINTF(("call to msgrcv(%d, 0x%x, %d, %ld, %d)\n", msqid, user_msgp, 896 msgsz, msgtyp, msgflg)); 897 898 if (!jail_sysvipc_allowed && jailed(td->td_ucred)) 899 return (ENOSYS); 900 |
893 mtx_lock(&Giant); | |
894 msqid = IPCID_TO_IX(msqid); 895 896 if (msqid < 0 || msqid >= msginfo.msgmni) { 897 DPRINTF(("msqid (%d) out of range (0<=msqid<%d)\n", msqid, 898 msginfo.msgmni)); | 901 msqid = IPCID_TO_IX(msqid); 902 903 if (msqid < 0 || msqid >= msginfo.msgmni) { 904 DPRINTF(("msqid (%d) out of range (0<=msqid<%d)\n", msqid, 905 msginfo.msgmni)); |
899 error = EINVAL; 900 goto done2; | 906 return (EINVAL); |
901 } 902 903 msqptr = &msqids[msqid]; | 907 } 908 909 msqptr = &msqids[msqid]; |
910 mtx_lock(&msq_mtx); |
|
904 if (msqptr->msg_qbytes == 0) { 905 DPRINTF(("no such message queue id\n")); 906 error = EINVAL; 907 goto done2; 908 } 909 if (msqptr->msg_perm.seq != IPCID_TO_SEQ(uap->msqid)) { 910 DPRINTF(("wrong sequence number\n")); 911 error = EINVAL; --- 103 unchanged lines hidden (view full) --- 1015 goto done2; 1016 } 1017 1018 /* 1019 * Wait for something to happen 1020 */ 1021 1022 DPRINTF(("msgrcv: goodnight\n")); | 911 if (msqptr->msg_qbytes == 0) { 912 DPRINTF(("no such message queue id\n")); 913 error = EINVAL; 914 goto done2; 915 } 916 if (msqptr->msg_perm.seq != IPCID_TO_SEQ(uap->msqid)) { 917 DPRINTF(("wrong sequence number\n")); 918 error = EINVAL; --- 103 unchanged lines hidden (view full) --- 1022 goto done2; 1023 } 1024 1025 /* 1026 * Wait for something to happen 1027 */ 1028 1029 DPRINTF(("msgrcv: goodnight\n")); |
1023 error = tsleep(msqptr, (PZERO - 4) | PCATCH, "msgwait", 0); | 1030 error = msleep(msqptr, &msq_mtx, (PZERO - 4) | PCATCH, 1031 "msgwait", 0); |
1024 DPRINTF(("msgrcv: good morning (error=%d)\n", error)); 1025 1026 if (error != 0) { 1027 DPRINTF(("msgsnd: interrupted system call\n")); 1028 error = EINTR; 1029 goto done2; 1030 } 1031 --- 30 unchanged lines hidden (view full) --- 1062 msghdr->msg_ts)); 1063 if (msgsz > msghdr->msg_ts) 1064 msgsz = msghdr->msg_ts; 1065 1066 /* 1067 * Return the type to the user. 1068 */ 1069 | 1032 DPRINTF(("msgrcv: good morning (error=%d)\n", error)); 1033 1034 if (error != 0) { 1035 DPRINTF(("msgsnd: interrupted system call\n")); 1036 error = EINTR; 1037 goto done2; 1038 } 1039 --- 30 unchanged lines hidden (view full) --- 1070 msghdr->msg_ts)); 1071 if (msgsz > msghdr->msg_ts) 1072 msgsz = msghdr->msg_ts; 1073 1074 /* 1075 * Return the type to the user. 1076 */ 1077 |
1078 mtx_unlock(&msq_mtx); |
|
1070 error = copyout(&(msghdr->msg_type), user_msgp, 1071 sizeof(msghdr->msg_type)); | 1079 error = copyout(&(msghdr->msg_type), user_msgp, 1080 sizeof(msghdr->msg_type)); |
1081 mtx_lock(&msq_mtx); |
|
1072 if (error != 0) { 1073 DPRINTF(("error (%d) copying out message type\n", error)); 1074 msg_freehdr(msghdr); 1075 wakeup(msqptr); 1076 goto done2; 1077 } 1078 user_msgp = (char *)user_msgp + sizeof(msghdr->msg_type); 1079 --- 8 unchanged lines hidden (view full) --- 1088 if (msgsz - len > msginfo.msgssz) 1089 tlen = msginfo.msgssz; 1090 else 1091 tlen = msgsz - len; 1092 if (next <= -1) 1093 panic("next too low #3"); 1094 if (next >= msginfo.msgseg) 1095 panic("next out of range #3"); | 1082 if (error != 0) { 1083 DPRINTF(("error (%d) copying out message type\n", error)); 1084 msg_freehdr(msghdr); 1085 wakeup(msqptr); 1086 goto done2; 1087 } 1088 user_msgp = (char *)user_msgp + sizeof(msghdr->msg_type); 1089 --- 8 unchanged lines hidden (view full) --- 1098 if (msgsz - len > msginfo.msgssz) 1099 tlen = msginfo.msgssz; 1100 else 1101 tlen = msgsz - len; 1102 if (next <= -1) 1103 panic("next too low #3"); 1104 if (next >= msginfo.msgseg) 1105 panic("next out of range #3"); |
1106 mtx_unlock(&msq_mtx); |
|
1096 error = copyout(&msgpool[next * msginfo.msgssz], 1097 user_msgp, tlen); | 1107 error = copyout(&msgpool[next * msginfo.msgssz], 1108 user_msgp, tlen); |
1109 mtx_lock(&msq_mtx); |
|
1098 if (error != 0) { 1099 DPRINTF(("error (%d) copying out message segment\n", 1100 error)); 1101 msg_freehdr(msghdr); 1102 wakeup(msqptr); 1103 goto done2; 1104 } 1105 user_msgp = (char *)user_msgp + tlen; 1106 next = msgmaps[next].next; 1107 } 1108 1109 /* 1110 * Done, return the actual number of bytes copied out. 1111 */ 1112 1113 msg_freehdr(msghdr); 1114 wakeup(msqptr); 1115 td->td_retval[0] = msgsz; 1116done2: | 1110 if (error != 0) { 1111 DPRINTF(("error (%d) copying out message segment\n", 1112 error)); 1113 msg_freehdr(msghdr); 1114 wakeup(msqptr); 1115 goto done2; 1116 } 1117 user_msgp = (char *)user_msgp + tlen; 1118 next = msgmaps[next].next; 1119 } 1120 1121 /* 1122 * Done, return the actual number of bytes copied out. 1123 */ 1124 1125 msg_freehdr(msghdr); 1126 wakeup(msqptr); 1127 td->td_retval[0] = msgsz; 1128done2: |
1117 mtx_unlock(&Giant); | 1129 mtx_unlock(&msq_mtx); |
1118 return (error); 1119} 1120 1121static int 1122sysctl_msqids(SYSCTL_HANDLER_ARGS) 1123{ 1124 1125 return (SYSCTL_OUT(req, msqids, --- 12 unchanged lines hidden --- | 1130 return (error); 1131} 1132 1133static int 1134sysctl_msqids(SYSCTL_HANDLER_ARGS) 1135{ 1136 1137 return (SYSCTL_OUT(req, msqids, --- 12 unchanged lines hidden --- |