1 /* $NetBSD: kern_auth.c,v 1.20 2006/09/08 21:57:38 elad Exp $ */ 2 3 /*- 4 * Copyright (c) 2005, 2006 Elad Efrat <elad@NetBSD.org> 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by Elad Efrat. 18 * 4. The name of the author may not be used to endorse or promote products 19 * derived from this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 /* 34 * Todo: 35 * - Garbage collection to pool_put() unused scopes/listeners. 36 */ 37 38 #include <sys/cdefs.h> 39 __KERNEL_RCSID(0, "$NetBSD: kern_auth.c,v 1.20 2006/09/08 21:57:38 elad Exp $"); 40 41 #include <sys/types.h> 42 #include <sys/param.h> 43 #include <sys/queue.h> 44 #include <sys/time.h> 45 #include <sys/proc.h> 46 #include <sys/ucred.h> 47 #include <sys/pool.h> 48 #include <sys/kauth.h> 49 #include <sys/acct.h> 50 #include <sys/sysctl.h> 51 52 /* 53 * Credentials. 54 */ 55 struct kauth_cred { 56 struct simplelock cr_lock; /* lock on cr_refcnt */ 57 u_int cr_refcnt; /* reference count */ 58 uid_t cr_uid; /* user id */ 59 uid_t cr_euid; /* effective user id */ 60 uid_t cr_svuid; /* saved effective user id */ 61 gid_t cr_gid; /* group id */ 62 gid_t cr_egid; /* effective group id */ 63 gid_t cr_svgid; /* saved effective group id */ 64 u_int cr_ngroups; /* number of groups */ 65 gid_t cr_groups[NGROUPS]; /* group memberships */ 66 }; 67 68 /* 69 * Listener. 70 */ 71 struct kauth_listener { 72 kauth_scope_callback_t func; /* callback */ 73 kauth_scope_t scope; /* scope backpointer */ 74 u_int refcnt; /* reference count */ 75 SIMPLEQ_ENTRY(kauth_listener) listener_next; /* listener list */ 76 }; 77 78 /* 79 * Scope. 80 */ 81 struct kauth_scope { 82 const char *id; /* scope name */ 83 void *cookie; /* user cookie */ 84 u_int nlisteners; /* # of listeners */ 85 SIMPLEQ_HEAD(, kauth_listener) listenq; /* listener list */ 86 SIMPLEQ_ENTRY(kauth_scope) next_scope; /* scope list */ 87 }; 88 89 static POOL_INIT(kauth_scope_pool, sizeof(struct kauth_scope), 0, 0, 0, 90 "kauth_scopepl", &pool_allocator_nointr); 91 static POOL_INIT(kauth_listener_pool, sizeof(struct kauth_listener), 0, 0, 0, 92 "kauth_listenerpl", &pool_allocator_nointr); 93 static POOL_INIT(kauth_cred_pool, sizeof(struct kauth_cred), 0, 0, 0, 94 "kauth_credpl", &pool_allocator_nointr); 95 96 /* List of scopes and its lock. */ 97 static SIMPLEQ_HEAD(, kauth_scope) scope_list; 98 static struct simplelock scopes_lock; 99 100 /* Built-in scopes: generic, process. */ 101 static kauth_scope_t kauth_builtin_scope_generic; 102 static kauth_scope_t kauth_builtin_scope_system; 103 static kauth_scope_t kauth_builtin_scope_process; 104 static kauth_scope_t kauth_builtin_scope_network; 105 static kauth_scope_t kauth_builtin_scope_machdep; 106 107 /* Allocate new, empty kauth credentials. */ 108 kauth_cred_t 109 kauth_cred_alloc(void) 110 { 111 kauth_cred_t cred; 112 113 cred = pool_get(&kauth_cred_pool, PR_WAITOK); 114 memset(cred, 0, sizeof(*cred)); 115 simple_lock_init(&cred->cr_lock); 116 cred->cr_refcnt = 1; 117 118 return (cred); 119 } 120 121 /* Increment reference count to cred. */ 122 void 123 kauth_cred_hold(kauth_cred_t cred) 124 { 125 KASSERT(cred != NULL); 126 KASSERT(cred->cr_refcnt > 0); 127 128 simple_lock(&cred->cr_lock); 129 cred->cr_refcnt++; 130 simple_unlock(&cred->cr_lock); 131 } 132 133 /* Decrease reference count to cred. If reached zero, free it. */ 134 void 135 kauth_cred_free(kauth_cred_t cred) 136 { 137 u_int refcnt; 138 139 KASSERT(cred != NULL); 140 KASSERT(cred->cr_refcnt > 0); 141 142 simple_lock(&cred->cr_lock); 143 refcnt = --cred->cr_refcnt; 144 simple_unlock(&cred->cr_lock); 145 146 if (refcnt == 0) 147 pool_put(&kauth_cred_pool, cred); 148 } 149 150 void 151 kauth_cred_clone(kauth_cred_t from, kauth_cred_t to) 152 { 153 KASSERT(from != NULL); 154 KASSERT(to != NULL); 155 KASSERT(from->cr_refcnt > 0); 156 157 to->cr_uid = from->cr_uid; 158 to->cr_euid = from->cr_euid; 159 to->cr_svuid = from->cr_svuid; 160 to->cr_gid = from->cr_gid; 161 to->cr_egid = from->cr_egid; 162 to->cr_svgid = from->cr_svgid; 163 to->cr_ngroups = from->cr_ngroups; 164 memcpy(to->cr_groups, from->cr_groups, sizeof(to->cr_groups)); 165 } 166 167 /* 168 * Duplicate cred and return a new kauth_cred_t. 169 */ 170 kauth_cred_t 171 kauth_cred_dup(kauth_cred_t cred) 172 { 173 kauth_cred_t new_cred; 174 175 KASSERT(cred != NULL); 176 KASSERT(cred->cr_refcnt > 0); 177 178 new_cred = kauth_cred_alloc(); 179 180 kauth_cred_clone(cred, new_cred); 181 182 return (new_cred); 183 } 184 185 /* 186 * Similar to crcopy(), only on a kauth_cred_t. 187 * XXX: Is this even needed? [kauth_cred_copy] 188 */ 189 kauth_cred_t 190 kauth_cred_copy(kauth_cred_t cred) 191 { 192 kauth_cred_t new_cred; 193 194 KASSERT(cred != NULL); 195 KASSERT(cred->cr_refcnt > 0); 196 197 /* If the provided credentials already have one reference, use them. */ 198 if (cred->cr_refcnt == 1) 199 return (cred); 200 201 new_cred = kauth_cred_alloc(); 202 203 kauth_cred_clone(cred, new_cred); 204 205 kauth_cred_free(cred); 206 207 return (new_cred); 208 } 209 210 uid_t 211 kauth_cred_getuid(kauth_cred_t cred) 212 { 213 KASSERT(cred != NULL); 214 215 return (cred->cr_uid); 216 } 217 218 uid_t 219 kauth_cred_geteuid(kauth_cred_t cred) 220 { 221 KASSERT(cred != NULL); 222 223 return (cred->cr_euid); 224 } 225 226 uid_t 227 kauth_cred_getsvuid(kauth_cred_t cred) 228 { 229 KASSERT(cred != NULL); 230 231 return (cred->cr_svuid); 232 } 233 234 gid_t 235 kauth_cred_getgid(kauth_cred_t cred) 236 { 237 KASSERT(cred != NULL); 238 239 return (cred->cr_gid); 240 } 241 242 gid_t 243 kauth_cred_getegid(kauth_cred_t cred) 244 { 245 KASSERT(cred != NULL); 246 247 return (cred->cr_egid); 248 } 249 250 gid_t 251 kauth_cred_getsvgid(kauth_cred_t cred) 252 { 253 KASSERT(cred != NULL); 254 255 return (cred->cr_svgid); 256 } 257 258 void 259 kauth_cred_setuid(kauth_cred_t cred, uid_t uid) 260 { 261 KASSERT(cred != NULL); 262 KASSERT(cred->cr_refcnt == 1); 263 264 cred->cr_uid = uid; 265 } 266 267 void 268 kauth_cred_seteuid(kauth_cred_t cred, uid_t uid) 269 { 270 KASSERT(cred != NULL); 271 KASSERT(cred->cr_refcnt == 1); 272 273 cred->cr_euid = uid; 274 } 275 276 void 277 kauth_cred_setsvuid(kauth_cred_t cred, uid_t uid) 278 { 279 KASSERT(cred != NULL); 280 KASSERT(cred->cr_refcnt == 1); 281 282 cred->cr_svuid = uid; 283 } 284 285 void 286 kauth_cred_setgid(kauth_cred_t cred, gid_t gid) 287 { 288 KASSERT(cred != NULL); 289 KASSERT(cred->cr_refcnt == 1); 290 291 cred->cr_gid = gid; 292 } 293 294 void 295 kauth_cred_setegid(kauth_cred_t cred, gid_t gid) 296 { 297 KASSERT(cred != NULL); 298 KASSERT(cred->cr_refcnt == 1); 299 300 cred->cr_egid = gid; 301 } 302 303 void 304 kauth_cred_setsvgid(kauth_cred_t cred, gid_t gid) 305 { 306 KASSERT(cred != NULL); 307 KASSERT(cred->cr_refcnt == 1); 308 309 cred->cr_svgid = gid; 310 } 311 312 /* Checks if gid is a member of the groups in cred. */ 313 int 314 kauth_cred_ismember_gid(kauth_cred_t cred, gid_t gid, int *resultp) 315 { 316 int i; 317 318 KASSERT(cred != NULL); 319 KASSERT(resultp != NULL); 320 321 *resultp = 0; 322 323 for (i = 0; i < cred->cr_ngroups; i++) 324 if (cred->cr_groups[i] == gid) { 325 *resultp = 1; 326 break; 327 } 328 329 return (0); 330 } 331 332 u_int 333 kauth_cred_ngroups(kauth_cred_t cred) 334 { 335 KASSERT(cred != NULL); 336 337 return (cred->cr_ngroups); 338 } 339 340 /* 341 * Return the group at index idx from the groups in cred. 342 */ 343 gid_t 344 kauth_cred_group(kauth_cred_t cred, u_int idx) 345 { 346 KASSERT(cred != NULL); 347 KASSERT(idx < cred->cr_ngroups); 348 349 return (cred->cr_groups[idx]); 350 } 351 352 /* XXX elad: gmuid is unused for now. */ 353 int 354 kauth_cred_setgroups(kauth_cred_t cred, gid_t *grbuf, size_t len, uid_t gmuid) 355 { 356 KASSERT(cred != NULL); 357 KASSERT(cred->cr_refcnt == 1); 358 KASSERT(len <= sizeof(cred->cr_groups) / sizeof(cred->cr_groups[0])); 359 360 if (len) 361 memcpy(cred->cr_groups, grbuf, len * sizeof(cred->cr_groups[0])); 362 memset(cred->cr_groups + len, 0xff, 363 sizeof(cred->cr_groups) - (len * sizeof(cred->cr_groups[0]))); 364 365 cred->cr_ngroups = len; 366 367 return (0); 368 } 369 370 int 371 kauth_cred_getgroups(kauth_cred_t cred, gid_t *grbuf, size_t len) 372 { 373 KASSERT(cred != NULL); 374 KASSERT(len <= cred->cr_ngroups); 375 376 memset(grbuf, 0xff, sizeof(*grbuf) * len); 377 memcpy(grbuf, cred->cr_groups, sizeof(*grbuf) * len); 378 379 return (0); 380 } 381 382 /* 383 * Match uids in two credentials. 384 */ 385 int 386 kauth_cred_uidmatch(kauth_cred_t cred1, kauth_cred_t cred2) 387 { 388 KASSERT(cred1 != NULL); 389 KASSERT(cred2 != NULL); 390 391 if (cred1->cr_uid == cred2->cr_uid || 392 cred1->cr_euid == cred2->cr_uid || 393 cred1->cr_uid == cred2->cr_euid || 394 cred1->cr_euid == cred2->cr_euid) 395 return (1); 396 397 return (0); 398 } 399 400 u_int 401 kauth_cred_getrefcnt(kauth_cred_t cred) 402 { 403 KASSERT(cred != NULL); 404 405 return (cred->cr_refcnt); 406 } 407 408 /* 409 * Convert userland credentials (struct uucred) to kauth_cred_t. 410 * XXX: For NFS code. 411 */ 412 void 413 kauth_cred_uucvt(kauth_cred_t cred, const struct uucred *uuc) 414 { 415 KASSERT(cred != NULL); 416 KASSERT(uuc != NULL); 417 418 cred->cr_refcnt = 1; 419 cred->cr_uid = uuc->cr_uid; 420 cred->cr_euid = uuc->cr_uid; 421 cred->cr_svuid = uuc->cr_uid; 422 cred->cr_gid = uuc->cr_gid; 423 cred->cr_egid = uuc->cr_gid; 424 cred->cr_svgid = uuc->cr_gid; 425 cred->cr_ngroups = min(uuc->cr_ngroups, NGROUPS); 426 kauth_cred_setgroups(cred, __UNCONST(uuc->cr_groups), 427 cred->cr_ngroups, -1); 428 } 429 430 /* 431 * Compare kauth_cred_t and uucred credentials. 432 * XXX: Modelled after crcmp() for NFS. 433 */ 434 int 435 kauth_cred_uucmp(kauth_cred_t cred, const struct uucred *uuc) 436 { 437 KASSERT(cred != NULL); 438 KASSERT(uuc != NULL); 439 440 if (cred->cr_euid == uuc->cr_uid && 441 cred->cr_egid == uuc->cr_gid && 442 cred->cr_ngroups == uuc->cr_ngroups) { 443 int i; 444 445 /* Check if all groups from uuc appear in cred. */ 446 for (i = 0; i < uuc->cr_ngroups; i++) { 447 int ismember; 448 449 ismember = 0; 450 if (kauth_cred_ismember_gid(cred, uuc->cr_groups[i], 451 &ismember) != 0 || !ismember) 452 return (1); 453 } 454 455 return (0); 456 } 457 458 return (1); 459 } 460 461 /* 462 * Make a struct ucred out of a kauth_cred_t. For compatibility. 463 */ 464 void 465 kauth_cred_toucred(kauth_cred_t cred, struct ucred *uc) 466 { 467 KASSERT(cred != NULL); 468 KASSERT(uc != NULL); 469 470 uc->cr_ref = cred->cr_refcnt; 471 uc->cr_uid = cred->cr_euid; 472 uc->cr_gid = cred->cr_egid; 473 uc->cr_ngroups = min(cred->cr_ngroups, 474 sizeof(uc->cr_groups) / sizeof(uc->cr_groups[0])); 475 memcpy(uc->cr_groups, cred->cr_groups, 476 uc->cr_ngroups * sizeof(uc->cr_groups[0])); 477 } 478 479 /* 480 * Make a struct pcred out of a kauth_cred_t. For compatibility. 481 */ 482 void 483 kauth_cred_topcred(kauth_cred_t cred, struct pcred *pc) 484 { 485 KASSERT(cred != NULL); 486 KASSERT(pc != NULL); 487 488 pc->pc_ucred = NULL; 489 pc->p_ruid = cred->cr_uid; 490 pc->p_svuid = cred->cr_svuid; 491 pc->p_rgid = cred->cr_gid; 492 pc->p_svgid = cred->cr_svgid; 493 pc->p_refcnt = cred->cr_refcnt; 494 } 495 496 /* 497 * Return kauth_cred_t for the current LWP. 498 */ 499 kauth_cred_t 500 kauth_cred_get(void) 501 { 502 return (curlwp->l_cred); 503 } 504 505 /* 506 * Returns a scope matching the provided id. 507 * Requires the scope list lock to be held by the caller. 508 */ 509 static kauth_scope_t 510 kauth_ifindscope(const char *id) 511 { 512 kauth_scope_t scope; 513 514 /* XXX: assert lock on scope list? */ 515 516 scope = NULL; 517 SIMPLEQ_FOREACH(scope, &scope_list, next_scope) { 518 if (strcmp(scope->id, id) == 0) 519 break; 520 } 521 522 return (scope); 523 } 524 525 /* 526 * Register a new scope. 527 * 528 * id - identifier for the scope 529 * callback - the scope's default listener 530 * cookie - cookie to be passed to the listener(s) 531 */ 532 kauth_scope_t 533 kauth_register_scope(const char *id, kauth_scope_callback_t callback, 534 void *cookie) 535 { 536 kauth_scope_t scope; 537 kauth_listener_t listener; 538 539 /* Sanitize input */ 540 if (id == NULL) 541 return (NULL); 542 543 /* Allocate space for a new scope and listener. */ 544 scope = pool_get(&kauth_scope_pool, PR_WAITOK); 545 listener = pool_get(&kauth_listener_pool, PR_WAITOK); 546 547 /* Acquire scope list lock. */ 548 simple_lock(&scopes_lock); 549 550 /* Check we don't already have a scope with the same id */ 551 if (kauth_ifindscope(id) != NULL) { 552 simple_unlock(&scopes_lock); 553 554 pool_put(&kauth_scope_pool, scope); 555 pool_put(&kauth_listener_pool, listener); 556 557 return (NULL); 558 } 559 560 /* Initialize new scope with parameters */ 561 scope->id = id; 562 scope->cookie = cookie; 563 scope->nlisteners = 1; 564 565 SIMPLEQ_INIT(&scope->listenq); 566 567 /* Add default listener */ 568 if (callback != NULL) { 569 listener->func = callback; 570 listener->scope = scope; 571 listener->refcnt = 0; 572 SIMPLEQ_INSERT_HEAD(&scope->listenq, listener, listener_next); 573 } 574 575 /* Insert scope to scopes list */ 576 SIMPLEQ_INSERT_TAIL(&scope_list, scope, next_scope); 577 578 simple_unlock(&scopes_lock); 579 580 return (scope); 581 } 582 583 /* 584 * Initialize the kernel authorization subsystem. 585 * 586 * Initialize the scopes list lock. 587 * Register built-in scopes: generic, process. 588 */ 589 void 590 kauth_init(void) 591 { 592 SIMPLEQ_INIT(&scope_list); 593 simple_lock_init(&scopes_lock); 594 595 /* Register generic scope. */ 596 kauth_builtin_scope_generic = kauth_register_scope(KAUTH_SCOPE_GENERIC, 597 NULL, NULL); 598 599 /* Register system scope. */ 600 kauth_builtin_scope_system = kauth_register_scope(KAUTH_SCOPE_SYSTEM, 601 NULL, NULL); 602 603 /* Register process scope. */ 604 kauth_builtin_scope_process = kauth_register_scope(KAUTH_SCOPE_PROCESS, 605 NULL, NULL); 606 607 /* Register network scope. */ 608 kauth_builtin_scope_network = kauth_register_scope(KAUTH_SCOPE_NETWORK, 609 NULL, NULL); 610 611 /* Register machdep scope. */ 612 kauth_builtin_scope_machdep = kauth_register_scope(KAUTH_SCOPE_MACHDEP, 613 NULL, NULL); 614 } 615 616 /* 617 * Deregister a scope. 618 * Requires scope list lock to be held by the caller. 619 * 620 * scope - the scope to deregister 621 */ 622 void 623 kauth_deregister_scope(kauth_scope_t scope) 624 { 625 if (scope != NULL) { 626 /* Remove scope from list */ 627 SIMPLEQ_REMOVE(&scope_list, scope, kauth_scope, next_scope); 628 } 629 } 630 631 /* 632 * Register a listener. 633 * 634 * id - scope identifier. 635 * callback - the callback routine for the listener. 636 * cookie - cookie to pass unmoidfied to the callback. 637 */ 638 kauth_listener_t 639 kauth_listen_scope(const char *id, kauth_scope_callback_t callback, 640 void *cookie) 641 { 642 kauth_scope_t scope; 643 kauth_listener_t listener; 644 645 /* Find scope struct */ 646 simple_lock(&scopes_lock); 647 scope = kauth_ifindscope(id); 648 simple_unlock(&scopes_lock); 649 if (scope == NULL) 650 return (NULL); 651 652 /* Allocate listener */ 653 listener = pool_get(&kauth_listener_pool, PR_WAITOK); 654 655 /* Initialize listener with parameters */ 656 listener->func = callback; 657 listener->refcnt = 0; 658 659 /* Add listener to scope */ 660 SIMPLEQ_INSERT_TAIL(&scope->listenq, listener, listener_next); 661 662 /* Raise number of listeners on scope. */ 663 scope->nlisteners++; 664 listener->scope = scope; 665 666 return (listener); 667 } 668 669 /* 670 * Deregister a listener. 671 * 672 * listener - listener reference as returned from kauth_listen_scope(). 673 */ 674 void 675 kauth_unlisten_scope(kauth_listener_t listener) 676 { 677 if (listener != NULL) { 678 SIMPLEQ_REMOVE(&listener->scope->listenq, listener, 679 kauth_listener, listener_next); 680 listener->scope->nlisteners--; 681 } 682 } 683 684 /* 685 * Authorize a request. 686 * 687 * scope - the scope of the request as defined by KAUTH_SCOPE_* or as 688 * returned from kauth_register_scope(). 689 * credential - credentials of the user ("actor") making the request. 690 * action - request identifier. 691 * arg[0-3] - passed unmodified to listener(s). 692 */ 693 int 694 kauth_authorize_action(kauth_scope_t scope, kauth_cred_t cred, 695 kauth_action_t action, void *arg0, void *arg1, 696 void *arg2, void *arg3) 697 { 698 kauth_listener_t listener; 699 int error, allow, fail; 700 701 #if 0 /* defined(LOCKDEBUG) */ 702 spinlock_switchcheck(); 703 simple_lock_only_held(NULL, "kauth_authorize_action"); 704 #endif 705 706 /* Sanitize input */ 707 if (scope == NULL || cred == NULL) 708 return (EFAULT); 709 if (!action) 710 return (EINVAL); 711 712 /* Short-circuit requests coming from the kernel. */ 713 if (cred == NOCRED || cred == FSCRED) 714 return (0); 715 716 /* Short-circuit requests when there are no listeners. */ 717 if (SIMPLEQ_EMPTY(&scope->listenq)) 718 return (0); 719 720 fail = 0; 721 allow = 0; 722 SIMPLEQ_FOREACH(listener, &scope->listenq, listener_next) { 723 error = listener->func(cred, action, scope->cookie, arg0, 724 arg1, arg2, arg3); 725 726 if (error == KAUTH_RESULT_ALLOW) 727 allow = 1; 728 else if (error == KAUTH_RESULT_DENY) 729 fail = 1; 730 } 731 732 return ((allow && !fail) ? 0 : EPERM); 733 }; 734 735 /* 736 * Generic scope authorization wrapper. 737 */ 738 int 739 kauth_authorize_generic(kauth_cred_t cred, kauth_action_t action, void *arg0) 740 { 741 return (kauth_authorize_action(kauth_builtin_scope_generic, cred, 742 action, arg0, NULL, NULL, NULL)); 743 } 744 745 /* 746 * System scope authorization wrapper. 747 */ 748 int 749 kauth_authorize_system(kauth_cred_t cred, kauth_action_t action, 750 enum kauth_system_req req, void *arg1, void *arg2, void *arg3) 751 { 752 return (kauth_authorize_action(kauth_builtin_scope_system, cred, 753 action, (void *)req, arg1, arg2, arg3)); 754 } 755 756 /* 757 * Process scope authorization wrapper. 758 */ 759 int 760 kauth_authorize_process(kauth_cred_t cred, kauth_action_t action, 761 struct proc *p, void *arg1, void *arg2, void *arg3) 762 { 763 return (kauth_authorize_action(kauth_builtin_scope_process, cred, 764 action, p, arg1, arg2, arg3)); 765 } 766 767 /* 768 * Network scope authorization wrapper. 769 */ 770 int 771 kauth_authorize_network(kauth_cred_t cred, kauth_action_t action, 772 void *arg0, void *arg1, void *arg2, void *arg3) 773 { 774 return (kauth_authorize_action(kauth_builtin_scope_network, cred, 775 action, arg0, arg1, arg2, arg3)); 776 } 777 778 int 779 kauth_authorize_machdep(kauth_cred_t cred, kauth_action_t action, 780 void *arg0, void *arg1, void *arg2, void *arg3) 781 { 782 return (kauth_authorize_action(kauth_builtin_scope_machdep, cred, 783 action, arg0, arg1, arg2, arg3)); 784 } 785