xref: /xnu-11215.61.5/libsyscall/wrappers/persona.c (revision 4f1223e81cd707a65cc109d0b8ad6653699da3c4)
1*4f1223e8SApple OSS Distributions /*
2*4f1223e8SApple OSS Distributions  * Copyright (c) 2015 Apple Inc. All rights reserved.
3*4f1223e8SApple OSS Distributions  *
4*4f1223e8SApple OSS Distributions  * @APPLE_LICENSE_HEADER_START@
5*4f1223e8SApple OSS Distributions  *
6*4f1223e8SApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7*4f1223e8SApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8*4f1223e8SApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9*4f1223e8SApple OSS Distributions  * compliance with the License. Please obtain a copy of the License at
10*4f1223e8SApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this
11*4f1223e8SApple OSS Distributions  * file.
12*4f1223e8SApple OSS Distributions  *
13*4f1223e8SApple OSS Distributions  * The Original Code and all software distributed under the License are
14*4f1223e8SApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15*4f1223e8SApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16*4f1223e8SApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17*4f1223e8SApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18*4f1223e8SApple OSS Distributions  * Please see the License for the specific language governing rights and
19*4f1223e8SApple OSS Distributions  * limitations under the License.
20*4f1223e8SApple OSS Distributions  *
21*4f1223e8SApple OSS Distributions  * @APPLE_LICENSE_HEADER_END@
22*4f1223e8SApple OSS Distributions  */
23*4f1223e8SApple OSS Distributions #include <sys/cdefs.h>
24*4f1223e8SApple OSS Distributions #include <sys/types.h>
25*4f1223e8SApple OSS Distributions #include <stdarg.h>
26*4f1223e8SApple OSS Distributions #include <stdint.h>
27*4f1223e8SApple OSS Distributions #include <sys/persona.h>
28*4f1223e8SApple OSS Distributions 
29*4f1223e8SApple OSS Distributions #include "strings.h"
30*4f1223e8SApple OSS Distributions 
31*4f1223e8SApple OSS Distributions /* syscall entry point */
32*4f1223e8SApple OSS Distributions int __persona(uint32_t operation, uint32_t flags, struct kpersona_info *info, uid_t *id, size_t *idlen, char *path);
33*4f1223e8SApple OSS Distributions 
34*4f1223e8SApple OSS Distributions int
kpersona_alloc(struct kpersona_info * info,uid_t * id)35*4f1223e8SApple OSS Distributions kpersona_alloc(struct kpersona_info *info, uid_t *id)
36*4f1223e8SApple OSS Distributions {
37*4f1223e8SApple OSS Distributions 	size_t idlen = 1;
38*4f1223e8SApple OSS Distributions 	return __persona(PERSONA_OP_ALLOC, 0, info, id, &idlen, NULL);
39*4f1223e8SApple OSS Distributions }
40*4f1223e8SApple OSS Distributions 
41*4f1223e8SApple OSS Distributions int
kpersona_palloc(struct kpersona_info * info,uid_t * id,char path[MAXPATHLEN])42*4f1223e8SApple OSS Distributions kpersona_palloc(struct kpersona_info *info, uid_t *id, char path[MAXPATHLEN])
43*4f1223e8SApple OSS Distributions {
44*4f1223e8SApple OSS Distributions 	size_t idlen = 1;
45*4f1223e8SApple OSS Distributions 	return __persona(PERSONA_OP_PALLOC, 0, info, id, &idlen, path);
46*4f1223e8SApple OSS Distributions }
47*4f1223e8SApple OSS Distributions 
48*4f1223e8SApple OSS Distributions int
kpersona_dealloc(uid_t id)49*4f1223e8SApple OSS Distributions kpersona_dealloc(uid_t id)
50*4f1223e8SApple OSS Distributions {
51*4f1223e8SApple OSS Distributions 	size_t idlen = 1;
52*4f1223e8SApple OSS Distributions 	return __persona(PERSONA_OP_DEALLOC, 0, NULL, &id, &idlen, NULL);
53*4f1223e8SApple OSS Distributions }
54*4f1223e8SApple OSS Distributions 
55*4f1223e8SApple OSS Distributions int
kpersona_get(uid_t * id)56*4f1223e8SApple OSS Distributions kpersona_get(uid_t *id)
57*4f1223e8SApple OSS Distributions {
58*4f1223e8SApple OSS Distributions 	size_t idlen = 1;
59*4f1223e8SApple OSS Distributions 	return __persona(PERSONA_OP_GET, 0, NULL, id, &idlen, NULL);
60*4f1223e8SApple OSS Distributions }
61*4f1223e8SApple OSS Distributions 
62*4f1223e8SApple OSS Distributions int
kpersona_getpath(uid_t id,char path[MAXPATHLEN])63*4f1223e8SApple OSS Distributions kpersona_getpath(uid_t id, char path[MAXPATHLEN])
64*4f1223e8SApple OSS Distributions {
65*4f1223e8SApple OSS Distributions 	size_t idlen = 1;
66*4f1223e8SApple OSS Distributions 	return __persona(PERSONA_OP_GETPATH, 0, NULL, &id, &idlen, path);
67*4f1223e8SApple OSS Distributions }
68*4f1223e8SApple OSS Distributions 
69*4f1223e8SApple OSS Distributions int
kpersona_info(uid_t id,struct kpersona_info * info)70*4f1223e8SApple OSS Distributions kpersona_info(uid_t id, struct kpersona_info *info)
71*4f1223e8SApple OSS Distributions {
72*4f1223e8SApple OSS Distributions 	size_t idlen = 1;
73*4f1223e8SApple OSS Distributions 	return __persona(PERSONA_OP_INFO, 0, info, &id, &idlen, NULL);
74*4f1223e8SApple OSS Distributions }
75*4f1223e8SApple OSS Distributions 
76*4f1223e8SApple OSS Distributions int
kpersona_pidinfo(pid_t pid,struct kpersona_info * info)77*4f1223e8SApple OSS Distributions kpersona_pidinfo(pid_t pid, struct kpersona_info *info)
78*4f1223e8SApple OSS Distributions {
79*4f1223e8SApple OSS Distributions 	size_t idlen = 1;
80*4f1223e8SApple OSS Distributions 	uid_t id = (uid_t)pid;
81*4f1223e8SApple OSS Distributions 	return __persona(PERSONA_OP_PIDINFO, 0, info, &id, &idlen, NULL);
82*4f1223e8SApple OSS Distributions }
83*4f1223e8SApple OSS Distributions 
84*4f1223e8SApple OSS Distributions int
kpersona_find(const char * name,uid_t uid,uid_t * id,size_t * idlen)85*4f1223e8SApple OSS Distributions kpersona_find(const char *name, uid_t uid, uid_t *id, size_t *idlen)
86*4f1223e8SApple OSS Distributions {
87*4f1223e8SApple OSS Distributions 	int ret;
88*4f1223e8SApple OSS Distributions 	struct kpersona_info kinfo;
89*4f1223e8SApple OSS Distributions 	kinfo.persona_info_version = PERSONA_INFO_V1;
90*4f1223e8SApple OSS Distributions 	kinfo.persona_id = uid;
91*4f1223e8SApple OSS Distributions 	kinfo.persona_type = 0;
92*4f1223e8SApple OSS Distributions 	kinfo.persona_gid = 0;
93*4f1223e8SApple OSS Distributions 	kinfo.persona_ngroups = 0;
94*4f1223e8SApple OSS Distributions 	kinfo.persona_groups[0] = 0;
95*4f1223e8SApple OSS Distributions 	kinfo.persona_name[0] = 0;
96*4f1223e8SApple OSS Distributions 	if (name) {
97*4f1223e8SApple OSS Distributions 		strlcpy(kinfo.persona_name, name, sizeof(kinfo.persona_name));
98*4f1223e8SApple OSS Distributions 	}
99*4f1223e8SApple OSS Distributions 	ret = __persona(PERSONA_OP_FIND, 0, &kinfo, id, idlen, NULL);
100*4f1223e8SApple OSS Distributions 	if (ret < 0) {
101*4f1223e8SApple OSS Distributions 		return ret;
102*4f1223e8SApple OSS Distributions 	}
103*4f1223e8SApple OSS Distributions 	return (int)(*idlen);
104*4f1223e8SApple OSS Distributions }
105*4f1223e8SApple OSS Distributions 
106*4f1223e8SApple OSS Distributions int
kpersona_find_by_type(int persona_type,uid_t * id,size_t * idlen)107*4f1223e8SApple OSS Distributions kpersona_find_by_type(int persona_type, uid_t *id, size_t *idlen)
108*4f1223e8SApple OSS Distributions {
109*4f1223e8SApple OSS Distributions 	int ret;
110*4f1223e8SApple OSS Distributions 	struct kpersona_info kinfo;
111*4f1223e8SApple OSS Distributions 	kinfo.persona_info_version = PERSONA_INFO_V1;
112*4f1223e8SApple OSS Distributions 	kinfo.persona_type = persona_type;
113*4f1223e8SApple OSS Distributions 	kinfo.persona_id = -1;
114*4f1223e8SApple OSS Distributions 	kinfo.persona_gid = 0;
115*4f1223e8SApple OSS Distributions 	kinfo.persona_ngroups = 0;
116*4f1223e8SApple OSS Distributions 	kinfo.persona_groups[0] = 0;
117*4f1223e8SApple OSS Distributions 	kinfo.persona_name[0] = 0;
118*4f1223e8SApple OSS Distributions 	ret = __persona(PERSONA_OP_FIND_BY_TYPE, 0, &kinfo, id, idlen, NULL);
119*4f1223e8SApple OSS Distributions 	if (ret < 0) {
120*4f1223e8SApple OSS Distributions 		return ret;
121*4f1223e8SApple OSS Distributions 	}
122*4f1223e8SApple OSS Distributions 	return (int)(*idlen);
123*4f1223e8SApple OSS Distributions }
124