1/*- 2 * Copyright (c) 1995 Steven Wallace 3 * Copyright (c) 1994, 1995 Scott Bartram 4 * Copyright (c) 1992, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * This software was developed by the Computer Systems Engineering group 8 * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and --- 33 unchanged lines hidden (view full) --- 42 * SUCH DAMAGE. 43 * 44 * from: Header: sun_misc.c,v 1.16 93/04/07 02:46:27 torek Exp 45 * 46 * @(#)sun_misc.c 8.1 (Berkeley) 6/18/93 47 */ 48 49#include <sys/cdefs.h> |
50__FBSDID("$FreeBSD: head/sys/i386/ibcs2/ibcs2_misc.c 194498 2009-06-19 17:10:35Z brooks $"); |
51 52/* 53 * IBCS2 compatibility module. 54 * 55 * IBCS2 system calls that are implemented differently in BSD are 56 * handled here. 57 */ 58#include <sys/param.h> --- 593 unchanged lines hidden (view full) --- 652 return (error); 653} 654 655int 656ibcs2_getgroups(td, uap) 657 struct thread *td; 658 struct ibcs2_getgroups_args *uap; 659{ |
660 ibcs2_gid_t *iset; 661 gid_t *gp; |
662 u_int i, ngrp; 663 int error; 664 665 if (uap->gidsetsize < 0) 666 return (EINVAL); 667 ngrp = MIN(uap->gidsetsize, NGROUPS_MAX); |
668 gp = malloc(ngrp * sizeof(*gp), M_TEMP, M_WAITOK); |
669 error = kern_getgroups(td, &ngrp, gp); 670 if (error) |
671 goto out; |
672 if (uap->gidsetsize > 0) { |
673 iset = malloc(ngrp * sizeof(*iset), M_TEMP, M_WAITOK); |
674 for (i = 0; i < ngrp; i++) 675 iset[i] = (ibcs2_gid_t)gp[i]; 676 error = copyout(iset, uap->gidset, ngrp * sizeof(ibcs2_gid_t)); |
677 free(iset, M_TEMP); |
678 } 679 if (error == 0) 680 td->td_retval[0] = ngrp; |
681out: 682 free(gp, M_TEMP); |
683 return (error); 684} 685 686int 687ibcs2_setgroups(td, uap) 688 struct thread *td; 689 struct ibcs2_setgroups_args *uap; 690{ |
691 ibcs2_gid_t *iset; 692 gid_t *gp; |
693 int error, i; 694 695 if (uap->gidsetsize < 0 || uap->gidsetsize > NGROUPS_MAX) 696 return (EINVAL); |
697 if (uap->gidsetsize && uap->gidset == NULL) 698 return (EINVAL); 699 gp = malloc(uap->gidsetsize * sizeof(*gp), M_TEMP, M_WAITOK); 700 if (uap->gidsetsize) { 701 iset = malloc(uap->gidsetsize * sizeof(*iset), M_TEMP, M_WAITOK); |
702 error = copyin(uap->gidset, iset, sizeof(ibcs2_gid_t) * 703 uap->gidsetsize); |
704 if (error) { 705 free(iset, M_TEMP); 706 goto out; 707 } |
708 for (i = 0; i < uap->gidsetsize; i++) 709 gp[i] = (gid_t)iset[i]; 710 } |
711 712 error = kern_setgroups(td, uap->gidsetsize, gp); 713out: 714 free(gp, M_TEMP); 715 return (error); |
716} 717 718int 719ibcs2_setuid(td, uap) 720 struct thread *td; 721 struct ibcs2_setuid_args *uap; 722{ 723 struct setuid_args sa; --- 536 unchanged lines hidden --- |