Deleted Added
full compact
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 ---