kern_sysctl.c (31778) | kern_sysctl.c (38517) |
---|---|
1/*- 2 * Copyright (c) 1982, 1986, 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Mike Karels at Berkeley Software Design, Inc. 7 * 8 * Quite extensively rewritten by Poul-Henning Kamp of the FreeBSD --- 23 unchanged lines hidden (view full) --- 32 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 33 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 34 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 35 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 36 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 37 * SUCH DAMAGE. 38 * 39 * @(#)kern_sysctl.c 8.4 (Berkeley) 4/14/94 | 1/*- 2 * Copyright (c) 1982, 1986, 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Mike Karels at Berkeley Software Design, Inc. 7 * 8 * Quite extensively rewritten by Poul-Henning Kamp of the FreeBSD --- 23 unchanged lines hidden (view full) --- 32 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 33 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 34 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 35 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 36 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 37 * SUCH DAMAGE. 38 * 39 * @(#)kern_sysctl.c 8.4 (Berkeley) 4/14/94 |
40 * $Id: kern_sysctl.c,v 1.73 1997/11/06 19:29:15 phk Exp $ | 40 * $Id: kern_sysctl.c,v 1.74 1997/12/16 17:40:20 eivind Exp $ |
41 */ 42 43#include "opt_compat.h" 44 45#include <sys/param.h> 46#include <sys/buf.h> 47#include <sys/kernel.h> 48#include <sys/sysctl.h> --- 460 unchanged lines hidden (view full) --- 509 if (!arg1) 510 error = EPERM; 511 else 512 error = SYSCTL_IN(req, arg1, sizeof(int)); 513 return (error); 514} 515 516/* | 41 */ 42 43#include "opt_compat.h" 44 45#include <sys/param.h> 46#include <sys/buf.h> 47#include <sys/kernel.h> 48#include <sys/sysctl.h> --- 460 unchanged lines hidden (view full) --- 509 if (!arg1) 510 error = EPERM; 511 else 512 error = SYSCTL_IN(req, arg1, sizeof(int)); 513 return (error); 514} 515 516/* |
517 * Handle an integer, signed or unsigned. 518 * Two cases: 519 * a variable: point arg1 at it. 520 * a constant: pass it in arg2. 521 */ 522 523int 524sysctl_handle_long SYSCTL_HANDLER_ARGS 525{ 526 int error = 0; 527 528 if (arg1) 529 error = SYSCTL_OUT(req, arg1, sizeof(long)); 530 else 531 error = SYSCTL_OUT(req, &arg2, sizeof(long)); 532 533 if (error || !req->newptr) 534 return (error); 535 536 if (!arg1) 537 error = EPERM; 538 else 539 error = SYSCTL_IN(req, arg1, sizeof(long)); 540 return (error); 541} 542 543/* 544 * Handle an integer, signed or unsigned. 545 * Two cases: 546 * a variable: point arg1 at it. 547 * a constant: pass it in arg2. 548 */ 549 550int 551sysctl_handle_intptr SYSCTL_HANDLER_ARGS 552{ 553 int error = 0; 554 555 if (arg1) 556 error = SYSCTL_OUT(req, arg1, sizeof(intptr_t)); 557 else 558 error = SYSCTL_OUT(req, &arg2, sizeof(intptr_t)); 559 560 if (error || !req->newptr) 561 return (error); 562 563 if (!arg1) 564 error = EPERM; 565 else 566 error = SYSCTL_IN(req, arg1, sizeof(intptr_t)); 567 return (error); 568} 569 570/* |
|
517 * Handle our generic '\0' terminated 'C' string. 518 * Two cases: 519 * a variable string: point arg1 at it, arg2 is max length. 520 * a constant string: point arg1 at it, arg2 is zero. 521 */ 522 523int 524sysctl_handle_string SYSCTL_HANDLER_ARGS --- 36 unchanged lines hidden (view full) --- 561 return (error); 562} 563 564/* 565 * Transfer functions to/from kernel space. 566 * XXX: rather untested at this point 567 */ 568static int | 571 * Handle our generic '\0' terminated 'C' string. 572 * Two cases: 573 * a variable string: point arg1 at it, arg2 is max length. 574 * a constant string: point arg1 at it, arg2 is zero. 575 */ 576 577int 578sysctl_handle_string SYSCTL_HANDLER_ARGS --- 36 unchanged lines hidden (view full) --- 615 return (error); 616} 617 618/* 619 * Transfer functions to/from kernel space. 620 * XXX: rather untested at this point 621 */ 622static int |
569sysctl_old_kernel(struct sysctl_req *req, const void *p, int l) | 623sysctl_old_kernel(struct sysctl_req *req, const void *p, size_t l) |
570{ | 624{ |
571 int i = 0; | 625 size_t i = 0; |
572 573 if (req->oldptr) { | 626 627 if (req->oldptr) { |
574 i = min(req->oldlen - req->oldidx, l); | 628 i = l; 629 if (i > req->oldlen - req->oldidx) 630 i = req->oldlen - req->oldidx; |
575 if (i > 0) 576 bcopy(p, (char *)req->oldptr + req->oldidx, i); 577 } 578 req->oldidx += l; 579 if (req->oldptr && i != l) 580 return (ENOMEM); 581 return (0); 582} 583 584static int | 631 if (i > 0) 632 bcopy(p, (char *)req->oldptr + req->oldidx, i); 633 } 634 req->oldidx += l; 635 if (req->oldptr && i != l) 636 return (ENOMEM); 637 return (0); 638} 639 640static int |
585sysctl_new_kernel(struct sysctl_req *req, void *p, int l) | 641sysctl_new_kernel(struct sysctl_req *req, void *p, size_t l) |
586{ 587 if (!req->newptr) 588 return 0; 589 if (req->newlen - req->newidx < l) 590 return (EINVAL); 591 bcopy((char *)req->newptr + req->newidx, p, l); 592 req->newidx += l; 593 return (0); 594} 595 596int | 642{ 643 if (!req->newptr) 644 return 0; 645 if (req->newlen - req->newidx < l) 646 return (EINVAL); 647 bcopy((char *)req->newptr + req->newidx, p, l); 648 req->newidx += l; 649 return (0); 650} 651 652int |
597kernel_sysctl(struct proc *p, int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen, int *retval) | 653kernel_sysctl(struct proc *p, int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen, size_t *retval) |
598{ 599 int error = 0; 600 struct sysctl_req req; 601 602 bzero(&req, sizeof req); 603 604 req.p = p; 605 --- 45 unchanged lines hidden (view full) --- 651 } 652 return (error); 653} 654 655/* 656 * Transfer function to/from user space. 657 */ 658static int | 654{ 655 int error = 0; 656 struct sysctl_req req; 657 658 bzero(&req, sizeof req); 659 660 req.p = p; 661 --- 45 unchanged lines hidden (view full) --- 707 } 708 return (error); 709} 710 711/* 712 * Transfer function to/from user space. 713 */ 714static int |
659sysctl_old_user(struct sysctl_req *req, const void *p, int l) | 715sysctl_old_user(struct sysctl_req *req, const void *p, size_t l) |
660{ | 716{ |
661 int error = 0, i = 0; | 717 int error = 0; 718 size_t i = 0; |
662 663 if (req->lock == 1 && req->oldptr) { 664 vslock(req->oldptr, req->oldlen); 665 req->lock = 2; 666 } 667 if (req->oldptr) { | 719 720 if (req->lock == 1 && req->oldptr) { 721 vslock(req->oldptr, req->oldlen); 722 req->lock = 2; 723 } 724 if (req->oldptr) { |
668 i = min(req->oldlen - req->oldidx, l); | 725 i = l; 726 if (i > req->oldlen - req->oldidx) 727 i = req->oldlen - req->oldidx; |
669 if (i > 0) 670 error = copyout(p, (char *)req->oldptr + req->oldidx, 671 i); 672 } 673 req->oldidx += l; 674 if (error) 675 return (error); 676 if (req->oldptr && i < l) 677 return (ENOMEM); 678 return (0); 679} 680 681static int | 728 if (i > 0) 729 error = copyout(p, (char *)req->oldptr + req->oldidx, 730 i); 731 } 732 req->oldidx += l; 733 if (error) 734 return (error); 735 if (req->oldptr && i < l) 736 return (ENOMEM); 737 return (0); 738} 739 740static int |
682sysctl_new_user(struct sysctl_req *req, void *p, int l) | 741sysctl_new_user(struct sysctl_req *req, void *p, size_t l) |
683{ 684 int error; 685 686 if (!req->newptr) 687 return 0; 688 if (req->newlen - req->newidx < l) 689 return (EINVAL); 690 error = copyin((char *)req->newptr + req->newidx, p, l); --- 77 unchanged lines hidden (view full) --- 768 void *new; 769 size_t newlen; 770}; 771#endif 772 773int 774__sysctl(struct proc *p, struct sysctl_args *uap) 775{ | 742{ 743 int error; 744 745 if (!req->newptr) 746 return 0; 747 if (req->newlen - req->newidx < l) 748 return (EINVAL); 749 error = copyin((char *)req->newptr + req->newidx, p, l); --- 77 unchanged lines hidden (view full) --- 827 void *new; 828 size_t newlen; 829}; 830#endif 831 832int 833__sysctl(struct proc *p, struct sysctl_args *uap) 834{ |
776 int error, i, j, name[CTL_MAXNAME]; | 835 int error, i, name[CTL_MAXNAME]; 836 size_t j; |
777 778 if (uap->namelen > CTL_MAXNAME || uap->namelen < 2) 779 return (EINVAL); 780 781 error = copyin(uap->name, &name, uap->namelen * sizeof(int)); 782 if (error) 783 return (error); 784 --- 10 unchanged lines hidden (view full) --- 795 return (error); 796} 797 798/* 799 * This is used from various compatibility syscalls too. That's why name 800 * must be in kernel space. 801 */ 802int | 837 838 if (uap->namelen > CTL_MAXNAME || uap->namelen < 2) 839 return (EINVAL); 840 841 error = copyin(uap->name, &name, uap->namelen * sizeof(int)); 842 if (error) 843 return (error); 844 --- 10 unchanged lines hidden (view full) --- 855 return (error); 856} 857 858/* 859 * This is used from various compatibility syscalls too. That's why name 860 * must be in kernel space. 861 */ 862int |
803userland_sysctl(struct proc *p, int *name, u_int namelen, void *old, size_t *oldlenp, int inkernel, void *new, size_t newlen, int *retval) | 863userland_sysctl(struct proc *p, int *name, u_int namelen, void *old, size_t *oldlenp, int inkernel, void *new, size_t newlen, size_t *retval) |
804{ 805 int error = 0; 806 struct sysctl_req req, req2; 807 808 bzero(&req, sizeof req); 809 810 req.p = p; 811 --- 127 unchanged lines hidden (view full) --- 939 int arg; 940}; 941#endif 942 943int 944ogetkerninfo(struct proc *p, struct getkerninfo_args *uap) 945{ 946 int error, name[6]; | 864{ 865 int error = 0; 866 struct sysctl_req req, req2; 867 868 bzero(&req, sizeof req); 869 870 req.p = p; 871 --- 127 unchanged lines hidden (view full) --- 999 int arg; 1000}; 1001#endif 1002 1003int 1004ogetkerninfo(struct proc *p, struct getkerninfo_args *uap) 1005{ 1006 int error, name[6]; |
947 u_int size; | 1007 size_t size; |
948 949 switch (uap->op & 0xff00) { 950 951 case KINFO_RT: 952 name[0] = CTL_NET; 953 name[1] = PF_ROUTE; 954 name[2] = 0; 955 name[3] = (uap->op & 0xff0000) >> 16; --- 126 unchanged lines hidden --- | 1008 1009 switch (uap->op & 0xff00) { 1010 1011 case KINFO_RT: 1012 name[0] = CTL_NET; 1013 name[1] = PF_ROUTE; 1014 name[2] = 0; 1015 name[3] = (uap->op & 0xff0000) >> 16; --- 126 unchanged lines hidden --- |