summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/klpd.h
blob: 32769f438f20edd018771b7665119bfda8e3ec6a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
 */

#ifndef	_SYS_KLPD_H
#define	_SYS_KLPD_H

#include <sys/types.h>
#include <sys/priv.h>
#include <sys/procset.h>

#ifdef _KERNEL
#include <sys/cred.h>
#include <sys/sysmacros.h>
#include <sys/varargs.h>
#endif

#ifdef	__cplusplus
extern "C" {
#endif

#define	KLPDCALL_VERS		1

#define	KLPDARG_NOMORE		0		/* End of argument List */
#define	KLPDARG_NONE		0		/* No argument */
#define	KLPDARG_VNODE		1		/* vnode_t * */
#define	KLPDARG_INT		2		/* int */
#define	KLPDARG_PORT		3		/* int, port number */
#define	KLPDARG_TCPPORT		4		/* int, tcp port number */
#define	KLPDARG_UDPPORT		5		/* int, udp port number */
#define	KLPDARG_SCTPPORT	6		/* int, sctp port number */
#define	KLPDARG_SDPPORT		7		/* int, sdp port number */

#ifdef _KERNEL

struct klpd_reg;
struct credklpd;

int klpd_reg(int, idtype_t, id_t, priv_set_t *);
int klpd_unreg(int, idtype_t, id_t);
void klpd_freelist(struct klpd_reg **);
void klpd_rele(struct klpd_reg *);
int klpd_call(const cred_t *, const priv_set_t *, va_list);
void crklpd_hold(struct credklpd *);
void crklpd_rele(struct credklpd *);
int pfexec_reg(int);
int pfexec_unreg(int);
int pfexec_call(const cred_t *, struct pathname *, cred_t **, boolean_t *);
int get_forced_privs(const cred_t *, const char *, priv_set_t *);
int check_user_privs(const cred_t *, const priv_set_t *);

#endif /* _KERNEL */

typedef struct klpd_head {
	uint32_t	klh_vers;		/* Version */
	uint32_t	klh_len;		/* Length of full packet */
	uint32_t	klh_argoff;		/* Offset of argument */
	uint32_t	klh_privoff;		/* Offset of privilege set */
} klpd_head_t;

#define	KLH_PRIVSET(kh)	((priv_set_t *)(((kh)->klh_privoff == 0 ? NULL : \
			(char *)(kh) + (kh)->klh_privoff)))
#define	KLH_ARG(kh)	((void *)((kh)->klh_argoff != 0 ? \
			(char *)(kh) + (kh)->klh_argoff : NULL))

typedef struct klpd_arg {
	uint_t	kla_type;
	uint_t	kla_dlen;
	union {
		char	__cdata[1];
		int	__idata;
		uint_t	__uidata;
	} kla_data;
} klpd_arg_t;

#define	kla_str		kla_data.__cdata
#define	kla_int		kla_data.__idata
#define	kla_uint	kla_data.__uidata

#define	PFEXEC_ARG_VERS			0x1
#define	PFEXEC_EXEC_ATTRS		0x1	/* pfexec_reply_t */
#define	PFEXEC_FORCED_PRIVS		0x2	/* priv_set_t */
#define	PFEXEC_USER_PRIVS		0x3	/* uint32_t */

#define	PFEXEC_ARG_SIZE(bufsize)	\
	(offsetof(pfexec_arg_t, pfa_data) + (bufsize))

typedef struct pfexec_arg {
	uint_t	pfa_vers;		/* Caller version */
	uint_t	pfa_call;		/* Call type */
	uint_t	pfa_len;		/* Length of data */
	uid_t	pfa_uid;		/* Real uid of subject */
	union {
		char		__pfa_path[1];
		uint32_t	__pfa_buf[1];
	} pfa_data;
} pfexec_arg_t;

#define	pfa_path	pfa_data.__pfa_path
#define	pfa_buf		pfa_data.__pfa_buf

#define	PFEXEC_NOTSET		((uid_t)-1)

typedef struct pfexec_reply {
	uint_t		pfr_vers;
	uint_t		pfr_len;
	uid_t		pfr_ruid, pfr_euid;
	gid_t		pfr_rgid, pfr_egid;
	boolean_t	pfr_setcred;
	boolean_t	pfr_scrubenv;
	boolean_t	pfr_clearflag;
	boolean_t	pfr_allowed;
	uint_t		pfr_ioff;
	uint_t		pfr_loff;
} pfexec_reply_t;

#define	PFEXEC_REPLY_IPRIV(pfr)	\
	((pfr)->pfr_ioff ? (priv_set_t *)((char *)(pfr) + (pfr)->pfr_ioff) \
	:  (priv_set_t *)0)
#define	PFEXEC_REPLY_LPRIV(pfr)	\
	((pfr)->pfr_loff ? (priv_set_t *)((char *)(pfr) + (pfr)->pfr_loff) \
	:  (priv_set_t *)0)

#ifdef	__cplusplus
}
#endif

#endif	/* _SYS_KLPD_H */