nscd_door.h revision 4142:0d7fa83a8b00
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22/*
23 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27#ifndef	_NSCD_DOOR_H
28#define	_NSCD_DOOR_H
29
30#pragma ident	"%Z%%M%	%I%	%E% SMI"
31
32/*
33 * Definitions for nscd to nscd door interfaces
34 */
35
36#ifdef	__cplusplus
37extern "C" {
38#endif
39
40#include <alloca.h>
41#include <nss_dbdefs.h>
42
43/* door for Trusted Extensions */
44#define	TSOL_NAME_SERVICE_DOOR	"/var/tsol/doors/name_service_door"
45
46/* nscd v2 nscd -> nscd call numbers */
47#define	NSCD_PING	(NSCD_CALLCAT_N2N|0x01)
48#define	NSCD_GETADMIN	(NSCD_CALLCAT_N2N|0x02)
49#define	NSCD_SETADMIN	(NSCD_CALLCAT_N2N|0x03)
50#define	NSCD_GETPUADMIN	(NSCD_CALLCAT_N2N|0x04)
51#define	NSCD_SETPUADMIN	(NSCD_CALLCAT_N2N|0x05)
52#define	NSCD_KILLSERVER	(NSCD_CALLCAT_N2N|0x06)
53
54#define	NSCD_IMHERE	(NSCD_CALLCAT_N2N|0x10)	/* IMHERE+WHOAMI */
55#define	NSCD_FORK	(NSCD_CALLCAT_N2N|0x20)
56#define	NSCD_SETUID	(NSCD_CALLCAT_N2N|0x30)
57#define	NSCD_KILL	(NSCD_CALLCAT_N2N|0x40)
58#define	NSCD_PULSE	(NSCD_CALLCAT_N2N|0x50)
59#define	NSCD_REFRESH	(NSCD_CALLCAT_N2N|0x60)
60
61/* nscd v2 nscd identities */
62
63#define	NSCD_MAIN	0x00000001
64#define	NSCD_FORKER	0x00000002
65#define	NSCD_CHILD	0x00000004
66#define	NSCD_WHOAMI	0x0000000F
67
68#define	NSCD_ALLOC_DOORBUF(cn, dsz, uptr, usz) \
69	usz = (sizeof (nss_pheader_t) + (dsz)); \
70	uptr = alloca(usz); \
71	(void) memset(uptr, 0, usz); \
72	((nss_pheader_t *)uptr)->nsc_callnumber = (cn); \
73	((nss_pheader_t *)uptr)->p_version = NSCD_HEADER_REV; \
74	((nss_pheader_t *)uptr)->pbufsiz = usz; \
75	((nss_pheader_t *)uptr)->data_off = sizeof (nss_pheader_t); \
76	((nss_pheader_t *)uptr)->key_off = sizeof (nss_pheader_t); \
77	((nss_pheader_t *)uptr)->dbd_off = sizeof (nss_pheader_t); \
78	((nss_pheader_t *)uptr)->data_len = dsz;
79
80#define	NSCD_N2N_DOOR_DATA(type, buf) \
81	(type *)((void *)(((char *)(buf)) + sizeof (nss_pheader_t)))
82
83#define	NSCD_N2N_DOOR_BUF_SIZE(struct) \
84	sizeof (nss_pheader_t) + sizeof (struct)
85
86#define	NSCD_SET_STATUS(ph, st, errno) \
87	{ \
88		int	e = errno; \
89		(ph)->p_status = st; \
90		if (e != -1) \
91			(ph)->p_errno = e; \
92	}
93
94#define	NSCD_SET_HERRNO(ph, herrno) \
95	(ph)->p_herrno = herrno;
96
97
98#define	NSCD_RETURN_STATUS(ph, st, errno) \
99	{ \
100		int e = errno; \
101		(ph)->p_status = st; \
102		if (e != -1) \
103			(ph)->p_errno = e; \
104		return; \
105	}
106
107#define	NSCD_SET_STATUS_SUCCESS(ph) \
108	(ph)->p_status = NSS_SUCCESS; \
109	(ph)->p_errno = 0;
110
111#define	NSCD_RETURN_STATUS_SUCCESS(ph) \
112	(ph)->p_status = NSS_SUCCESS; \
113	(ph)->p_errno = 0; \
114	return;
115
116#define	NSCD_SET_N2N_STATUS(ph, st, errno, n2nst) \
117	{ \
118		int	e = errno; \
119		(ph)->p_status = st; \
120		if (e != -1) \
121			(ph)->p_errno = e; \
122		(ph)->nscdpriv = n2nst; \
123	}
124
125#define	NSCD_RETURN_N2N_STATUS(ph, st, errno, n2nst) \
126	{ \
127		int	e = errno; \
128		(ph)->p_status = st; \
129		if (e != -1) \
130			(ph)->p_errno = e; \
131		(ph)->nscdpriv = n2nst; \
132		return; \
133	}
134
135#define	NSCD_STATUS_IS_OK(ph) \
136	(((ph)->p_status) == NSS_SUCCESS)
137
138#define	NSCD_STATUS_IS_NOT_OK(ph) \
139	(((ph)->p_status) != NSS_SUCCESS)
140
141#define	NSCD_GET_STATUS(ph) \
142	(((nss_pheader_t *)(ph))->p_status)
143
144#define	NSCD_GET_ERRNO(ph) \
145	(((nss_pheader_t *)(ph))->p_errno)
146
147#define	NSCD_GET_HERRNO(ph) \
148	(((nss_pheader_t *)(ph))->p_herrno)
149
150#define	NSCD_GET_NSCD_STATUS(ph) \
151	(((nss_pheader_t *)(ph))->nscdpriv)
152
153#define	NSCD_CLEAR_STATUS(ph) \
154	(ph)->p_status = 0; \
155	(ph)->p_errno = 0; \
156	(ph)->nscdpriv = 0;
157
158#define	NSCD_COPY_STATUS(ph, ph1) \
159	(ph)->p_status = (ph1)->p_status; \
160	(ph)->p_errno = (ph1)->p_errno; \
161	(ph)->nscdpriv = (ph1)->nscdpriv;
162
163nss_status_t	_nscd_doorcall(int callnum);
164nss_status_t 	_nscd_doorcall_data(int callnum, void *indata,
165			int indlen, void *outdata, int outdlen,
166			nss_pheader_t *phdr);
167
168nss_status_t	 _nscd_doorcall_fd(int fd, int callnum, void *indata,
169			int indlen, void *outdata, int outdlen,
170			nss_pheader_t *phdr);
171
172nss_status_t	_nscd_doorcall_sendfd(int fd, int callnum,
173			void *indata, int indlen, nss_pheader_t *phdr);
174
175#ifdef	__cplusplus
176}
177#endif
178
179#endif	/* _NSCD_DOOR_H */
180