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
149
150
151
152
153
154
155
156
157
158
159
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (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 2005 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _RPC_SVC_MT_H
#define _RPC_SVC_MT_H
#pragma ident "%Z%%M% %I% %E% SMI"
#include <synch.h> /* needed for mutex_t declaration */
/*
* Private service definitions
*/
#ifdef __cplusplus
extern "C" {
#endif
/*
* SVC flags
*/
#define SVC_VERSQUIET 0x0001 /* keep quiet about version mismatch */
#define SVC_DEFUNCT 0x0002 /* xprt is defunct, release asap */
#define SVC_DGRAM 0x0004 /* datagram type */
#define SVC_RENDEZVOUS 0x0008 /* rendezvous */
#define SVC_CONNECTION 0x000c /* connection */
#define SVC_DOOR 0x0010 /* door ipc */
#define SVC_TYPE_MASK 0x001c /* type mask */
#define SVC_FAILED 0x0020 /* send/receive failed, used for VC */
#define SVC_ARGS_CHECK 0x0040 /* flag to check for argument completion */
#define svc_flags(xprt) (SVCEXT(xprt)->flags)
#define version_keepquiet(xprt) (svc_flags(xprt) & SVC_VERSQUIET)
#define svc_defunct(xprt) ((svc_flags(xprt) & SVC_DEFUNCT) ? TRUE : FALSE)
#define svc_failed(xprt) ((svc_flags(xprt) & SVC_FAILED) ? TRUE : FALSE)
#define svc_type(xprt) (svc_flags(xprt) & SVC_TYPE_MASK)
#define svc_send_mutex(xprt) (SVCEXT(xprt)->send_mutex)
/*
* Copy of GSS parameters, needed for MT operation
*/
typedef struct {
bool_t established;
rpc_gss_service_t service;
uint_t qop_rcvd;
void *context;
uint_t seq_num;
} svc_rpc_gss_parms_t;
/*
* Interface to server-side authentication flavors, may vary with
* each request.
*
* NOTE: This structure is part of an interface, and must not change.
*/
typedef struct {
struct svc_auth_ops {
int (*svc_ah_wrap)();
int (*svc_ah_unwrap)();
} svc_ah_ops;
caddr_t svc_ah_private;
svc_rpc_gss_parms_t svc_gss_parms;
rpc_gss_rawcred_t raw_cred;
} SVCAUTH;
/*
* The xp_p3 field the the service handle points to the SVCXPRT_EXT
* extension structure.
*/
typedef struct svcxprt_list_t {
struct svcxprt_list_t *next;
SVCXPRT *xprt;
} SVCXPRT_LIST;
typedef struct svcxprt_ext_t {
int flags; /* VERSQUIET, DEFUNCT flag */
SVCXPRT *parent; /* points to parent (NULL in parent) */
struct rpc_msg *msg; /* message */
struct svc_req *req; /* request */
char *cred_area; /* auth work area */
int refcnt; /* number of parent references */
SVCXPRT_LIST *my_xlist; /* list header for this copy */
mutex_t send_mutex; /* for sequencing sends */
SVCAUTH xp_auth; /* flavor of current request */
} SVCXPRT_EXT;
#define SVCEXT(xprt) ((SVCXPRT_EXT *)((xprt)->xp_p3))
#define SVC_XP_AUTH(xprt) (SVCEXT(xprt)->xp_auth)
#define SVCAUTH_WRAP(auth, xdrs, xfunc, xwhere) \
((*((auth)->svc_ah_ops.svc_ah_wrap))(auth, xdrs, xfunc, xwhere))
#define SVCAUTH_UNWRAP(auth, xdrs, xfunc, xwhere) \
((*((auth)->svc_ah_ops.svc_ah_unwrap))(auth, xdrs, xfunc, xwhere))
/*
* Global/module private data and functions
*/
extern SVCXPRT **svc_xports;
extern XDR **svc_xdrs;
extern int svc_mt_mode;
extern mutex_t svc_thr_mutex;
extern cond_t svc_thr_fdwait;
extern int svc_nfds;
extern int svc_nfds_set;
extern int svc_max_fd;
extern mutex_t svc_mutex;
extern mutex_t svc_exit_mutex;
extern int svc_pipe[2];
extern bool_t svc_polling;
SVCXPRT *svc_xprt_alloc();
SVCXPRT *svc_dg_xprtcopy();
SVCXPRT *svc_vc_xprtcopy();
SVCXPRT *svc_fd_xprtcopy();
SVCXPRT *svc_copy();
void svc_xprt_free();
void svc_xprt_destroy();
void svc_dg_xprtfree();
void svc_vc_xprtfree();
void svc_fd_xprtfree();
void svc_door_xprtfree();
void svc_args_done();
void _svc_dg_destroy_private();
void _svc_vc_destroy_private();
void _svc_destroy_private();
#define RPC_DOOR_DIR "/var/run/rpc_door"
#define RPC_DOOR_RENDEZVOUS "/var/run/rpc_door/rpc_%d.%d"
#ifdef __cplusplus
}
#endif
#endif /* !_RPC_SVC_MT_H */
|