ReactOS  0.4.13-dev-92-gf251225
rpc.h File Reference
#include <rpc/types.h>
#include "winsock2.h"
#include <rpc/xdr.h>
#include <rpc/auth.h>
#include <rpc/clnt.h>
#include <rpc/rpc_msg.h>
#include <rpc/auth_unix.h>
#include <rpc/auth_des.h>
#include <rpc/svc_auth.h>
#include <rpc/svc.h>
#include <rpc/pmap_clnt.h>
#include <rpc/pmap_prot.h>
#include <rpc/rpcb_clnt.h>
#include <rpc/rpcent.h>
Include dependency graph for rpc.h:

Go to the source code of this file.

Macros

#define UDPMSGSIZE   8800
 

Functions

__BEGIN_DECLS int get_myaddress (struct sockaddr_in *)
 
int bindresvport (SOCKET, struct sockaddr_in *) __THROW
 
int registerrpc (int, int, int, char *(*)(char [UDPMSGSIZE]), xdrproc_t, xdrproc_t)
 
int callrpc (const char *, int, int, int, xdrproc_t, void *, xdrproc_t, void *)
 
int getrpcport (char *, int, int, int)
 
chartaddr2uaddr (const struct netconfig *, const struct netbuf *)
 
struct netbufuaddr2taddr (const struct netconfig *, const char *)
 
void freeuaddr (char *)
 
void freenetbuf (struct netbuf *)
 
int bindresvport_sa (SOCKET, struct sockaddr *)
 
__END_DECLS __BEGIN_DECLS SOCKET __rpc_nconf2fd (const struct netconfig *)
 
int __rpc_nconf2sockinfo (const struct netconfig *, struct __rpc_sockinfo *)
 
int __rpc_fd2sockinfo (SOCKET, struct __rpc_sockinfo *)
 
u_int __rpc_get_t_size (int, int, int)
 

Macro Definition Documentation

◆ UDPMSGSIZE

#define UDPMSGSIZE   8800

Definition at line 80 of file rpc.h.

Function Documentation

◆ __rpc_fd2sockinfo()

int __rpc_fd2sockinfo ( SOCKET  ,
struct __rpc_sockinfo  
)

Definition at line 481 of file rpc_generic.c.

482 {
483  socklen_t len;
484  int type, proto;
485  struct sockaddr_storage ss;
486 
487 #ifdef _WIN32
488  WSAPROTOCOL_INFO proto_info;
489  int proto_info_size = sizeof(proto_info);
490  if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL_INFO, (char *)&proto_info, &proto_info_size) == SOCKET_ERROR) {
491 #ifndef __REACTOS__
492  int err = WSAGetLastError();
493 #endif
494  return 0;
495  }
496  len = proto_info.iMaxSockAddr;
497  ss.ss_family = (ADDRESS_FAMILY)proto_info.iAddressFamily;
498 #else
499  len = sizeof ss;
500  if (getsockname(fd, (struct sockaddr *)&ss, &len) == SOCKET_ERROR) {
501  return 0;
502  }
503 #endif
504  sip->si_alen = len;
505 
506  len = sizeof type;
507  if (getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&type, &len) == SOCKET_ERROR) {
508 #ifndef __REACTOS__
509  int err = WSAGetLastError();
510 #endif
511  return 0;
512  }
513 
514  /* XXX */
515 #ifdef AF_LOCAL
516  if (ss.ss_family != AF_LOCAL) {
517 #endif
518  if (type == SOCK_STREAM)
519  proto = IPPROTO_TCP;
520  else if (type == SOCK_DGRAM)
521  proto = IPPROTO_UDP;
522  else
523  return 0;
524 #ifdef AF_LOCAL
525  } else
526  proto = 0;
527 #endif
528 
529  sip->si_af = ss.ss_family;
530  sip->si_proto = proto;
531  sip->si_socktype = type;
532 
533  return 1;
534 }
#define SOCKET_ERROR
Definition: winsock.h:333
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
static int fd
Definition: io.c:51
#define SOL_SOCKET
Definition: winsock.h:398
INT WSAAPI WSAGetLastError(VOID)
Definition: dllmain.c:112
if(!(yy_init))
Definition: macro.lex.yy.c:714
int socklen_t
Definition: tcp.c:35
#define SO_PROTOCOL_INFO
Definition: winsock2.h:253
USHORT ADDRESS_FAMILY
Definition: ws2def.h:25
#define SO_TYPE
Definition: winsock.h:195
GLenum GLsizei len
Definition: glext.h:6722
#define err(...)
INT WSAAPI getsockopt(IN SOCKET s, IN INT level, IN INT optname, OUT CHAR FAR *optval, IN OUT INT FAR *optlen)
Definition: sockctrl.c:271
#define SOCK_STREAM
Definition: tcpip.h:118
#define ss
Definition: i386-dis.c:432
#define SOCK_DGRAM
Definition: winsock.h:336
INT WSAAPI getsockname(IN SOCKET s, OUT LPSOCKADDR name, IN OUT INT FAR *namelen)
Definition: sockctrl.c:213

Referenced by __rpcgettp(), clnt_dg_create(), clnt_tli_create(), clnt_vc_create(), makefd_xprt(), rendezvous_request(), rpc_reg(), svc_dg_create(), svc_tli_create(), and svc_vc_create().

◆ __rpc_get_t_size()

u_int __rpc_get_t_size ( int  ,
int  ,
int   
)

Definition at line 139 of file rpc_generic.c.

142 {
143  int maxsize, defsize;
144 
145  maxsize = 256 * 1024; /* XXX */
146  switch (proto) {
147  case IPPROTO_TCP:
148  defsize = 1024 * 1024; /* XXX */
149  break;
150  case IPPROTO_UDP:
151  defsize = UDPMSGSIZE;
152  break;
153  default:
154  defsize = RPC_MAXDATASIZE;
155  break;
156  }
157  if (size == 0)
158  return defsize;
159 #if 1
160  /* cbodley- give us the size we ask for, or we'll get fragmented! */
161  return (u_int)size;
162 #else
163  /* Check whether the value is within the upper max limit */
164  return (size > maxsize ? (u_int)maxsize : (u_int)size);
165 #endif
166 }
GLsizeiptr size
Definition: glext.h:5919
UINT32 u_int
Definition: types.h:82
#define RPC_MAXDATASIZE
Definition: rpc_com.h:51
#define UDPMSGSIZE
Definition: svc_raw.c:49

Referenced by clnt_dg_create(), clnt_vc_create(), local_rpcb(), rpc_broadcast_exp(), rpc_reg(), svc_dg_create(), and svc_vc_create().

◆ __rpc_nconf2fd()

Definition at line 562 of file rpc_generic.c.

563 {
564  struct __rpc_sockinfo si;
565  SOCKET fd;
566 
567  if (!__rpc_nconf2sockinfo(nconf, &si))
568  return 0;
569 
570  if ((fd = socket(si.si_af, si.si_socktype, si.si_proto)) != INVALID_SOCKET &&
571  si.si_af == AF_INET6) {
572  int val = 1;
573 
574  setsockopt(fd, SOL_IPV6, IPV6_V6ONLY, (const char *)&val, sizeof(val));
575  }
576  return fd;
577 }
SOCKET WSAAPI socket(IN INT af, IN INT type, IN INT protocol)
Definition: socklife.c:143
static int fd
Definition: io.c:51
INT WSAAPI setsockopt(IN SOCKET s, IN INT level, IN INT optname, IN CONST CHAR FAR *optval, IN INT optlen)
Definition: sockctrl.c:421
#define AF_INET6
Definition: winsock.h:369
GLuint GLfloat * val
Definition: glext.h:7180
#define INVALID_SOCKET
Definition: winsock.h:332
#define IPV6_V6ONLY
Definition: ws2ipdef.h:108
#define SOL_IPV6
Definition: wintirpc.h:84
int __rpc_nconf2sockinfo(const struct netconfig *nconf, struct __rpc_sockinfo *sip)
Definition: rpc_generic.c:540
UINT_PTR SOCKET
Definition: winsock.h:47

Referenced by clnt_tli_create(), and svc_tli_create().

◆ __rpc_nconf2sockinfo()

int __rpc_nconf2sockinfo ( const struct netconfig ,
struct __rpc_sockinfo  
)

Definition at line 540 of file rpc_generic.c.

541 {
542  int i;
543 
544  for (i = 0; i < (sizeof na_cvt) / (sizeof (struct netid_af)); i++)
545  if (strcmp(na_cvt[i].netid, nconf->nc_netid) == 0 || (
546  strcmp(nconf->nc_netid, "unix") == 0 &&
547  strcmp(na_cvt[i].netid, "local") == 0)) {
548  sip->si_af = na_cvt[i].af;
549  sip->si_proto = na_cvt[i].protocol;
550  sip->si_socktype =
551  __rpc_seman2socktype((int)nconf->nc_semantics);
552  if (sip->si_socktype == -1)
553  return 0;
554  sip->si_alen = __rpc_get_a_size(sip->si_af);
555  return 1;
556  }
557 
558  return 0;
559 }
int __rpc_seman2socktype(int semantics)
Definition: rpc_generic.c:842
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static const struct netid_af na_cvt[]
Definition: rpc_generic.c:88
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
u_int __rpc_get_a_size(int af)
Definition: rpc_generic.c:172

Referenced by __rpc_nconf2fd(), getclnthandle(), rpc_broadcast_exp(), svc_tli_create(), taddr2uaddr(), and uaddr2taddr().

◆ bindresvport()

int bindresvport ( SOCKET  ,
struct sockaddr_in  
)

Definition at line 53 of file bindresvport.c.

56 {
57  return bindresvport_sa(sd, (struct sockaddr *)sin);
58 }
static const WCHAR sd[]
Definition: suminfo.c:287
_STLP_DECLSPEC complex< float > _STLP_CALL sin(const complex< float > &)
int bindresvport_sa(SOCKET sd, struct sockaddr *sa)
Definition: bindresvport.c:161

Referenced by clnt_tli_create(), and svc_tli_create().

◆ bindresvport_sa()

int bindresvport_sa ( SOCKET  ,
struct sockaddr  
)

Definition at line 161 of file bindresvport.c.

164 {
165 #ifdef IPV6_PORTRANGE
166  int old;
167 #endif
168  int error, af;
169  struct sockaddr_storage myaddr;
170  struct sockaddr_in *sin;
171 #ifdef INET6
172  struct sockaddr_in6 *sin6;
173 #endif
174  int proto, portrange, portlow;
175  u_int16_t *portp;
176  socklen_t salen;
177 #ifdef _WIN32
178  WSAPROTOCOL_INFO proto_info;
179  int proto_info_size = sizeof(proto_info);
180 #endif
181 
182  if (sa == NULL) {
183  salen = sizeof(myaddr);
184  sa = (struct sockaddr *)&myaddr;
185 
186 #ifdef _WIN32
187  memset(sa, 0, salen);
188  if (error = getsockopt(sd, SOL_SOCKET, SO_PROTOCOL_INFO, (char *)&proto_info, &proto_info_size) == SOCKET_ERROR) {
189 #ifndef __REACTOS__
190  int sockerr = WSAGetLastError();
191 #endif
192  return -1;
193  }
194  af = proto_info.iAddressFamily;
195 #else
196  if (getsockname(sd, sa, &salen) == -1)
197  return -1; /* errno is correctly set */
198 
199  af = sa->sa_family;
200  memset(sa, 0, salen);
201 #endif
202  } else
203  af = sa->sa_family;
204 
205  switch (af) {
206  case AF_INET:
207  proto = IPPROTO_IP;
208  portrange = IP_PORTRANGE;
209  portlow = IP_PORTRANGE_LOW;
210  sin = (struct sockaddr_in *)sa;
211  salen = sizeof(struct sockaddr_in);
212  portp = &sin->sin_port;
213  break;
214 #ifdef INET6
215  case AF_INET6:
216  proto = IPPROTO_IPV6;
217 #ifdef IPV6_PORTRANGE
218  portrange = IPV6_PORTRANGE;
219  portlow = IPV6_PORTRANGE_LOW;
220 #endif
221  sin6 = (struct sockaddr_in6 *)sa;
222  salen = sizeof(struct sockaddr_in6);
223  portp = &sin6->sin6_port;
224  break;
225 #endif /* INET6 */
226  default:
228  return (-1);
229  }
230  sa->sa_family = (ADDRESS_FAMILY) af;
231 
232 #ifdef IPV6_PORTRANGE
233  if (*portp == 0) {
234  socklen_t oldlen = sizeof(old);
235 
236  error = getsockopt(sd, proto, portrange, &old, &oldlen);
237  if (error < 0)
238  return (error);
239 
240  error = setsockopt(sd, proto, portrange, &portlow,
241  sizeof(portlow));
242  if (error < 0)
243  return (error);
244  }
245 #endif
246 
247  error = bind(sd, sa, salen);
248  if (error) {
249 #ifndef __REACTOS__
250  int err = WSAGetLastError();
251 #endif
252  }
253 
254 #ifdef IPV6_PORTRANGE
255  if (*portp == 0) {
256  int saved_errno = errno;
257 
258  if (error < 0) {
259  if (setsockopt(sd, proto, portrange, &old,
260  sizeof(old)) < 0)
261  errno = saved_errno;
262  return (error);
263  }
264 
265  if (sa != (struct sockaddr *)&myaddr) {
266  /* Hmm, what did the kernel assign? */
267  if (getsockname(sd, sa, &salen) < 0)
268  errno = saved_errno;
269  return (error);
270  }
271  }
272 #endif
273  return (error);
274 }
#define SOCKET_ERROR
Definition: winsock.h:333
#define error(str)
Definition: mkdosfs.c:1605
USHORT sin6_port
Definition: ws2ipdef.h:180
INT WSAAPI bind(IN SOCKET s, IN CONST struct sockaddr *name, IN INT namelen)
Definition: socklife.c:36
#define WSAEPFNOSUPPORT
Definition: winerror.h:1959
int errno
#define SOL_SOCKET
Definition: winsock.h:398
INT WSAAPI setsockopt(IN SOCKET s, IN INT level, IN INT optname, IN CONST CHAR FAR *optval, IN INT optlen)
Definition: sockctrl.c:421
smooth NULL
Definition: ftsmooth.c:416
#define AF_INET6
Definition: winsock.h:369
#define IPPROTO_IP
Definition: winsock.h:255
INT WSAAPI WSAGetLastError(VOID)
Definition: dllmain.c:112
#define IP_PORTRANGE
Definition: bindresvport.c:154
int socklen_t
Definition: tcp.c:35
#define SO_PROTOCOL_INFO
Definition: winsock2.h:253
USHORT ADDRESS_FAMILY
Definition: ws2def.h:25
unsigned short u_int16_t
Definition: rosdhcp.h:34
static const WCHAR sd[]
Definition: suminfo.c:287
#define err(...)
INT WSAAPI getsockopt(IN SOCKET s, IN INT level, IN INT optname, OUT CHAR FAR *optval, IN OUT INT FAR *optlen)
Definition: sockctrl.c:271
#define IP_PORTRANGE_LOW
Definition: bindresvport.c:155
#define AF_INET
Definition: tcpip.h:117
_STLP_DECLSPEC complex< float > _STLP_CALL sin(const complex< float > &)
#define memset(x, y, z)
Definition: compat.h:39
INT WSAAPI getsockname(IN SOCKET s, OUT LPSOCKADDR name, IN OUT INT FAR *namelen)
Definition: sockctrl.c:213
static struct sockaddr_in sa
Definition: adnsresfilter.c:69

Referenced by bindresvport(), and clnt_dg_create().

◆ callrpc()

int callrpc ( const char ,
int  ,
int  ,
int  ,
xdrproc_t  ,
void ,
xdrproc_t  ,
void  
)

◆ freenetbuf()

void freenetbuf ( struct netbuf )

Definition at line 633 of file rpc_generic.c.

634 {
635  if (nbuf) {
636  free(nbuf->buf);
637  free(nbuf);
638  }
639 }
#define free
Definition: debug_ros.c:5

Referenced by get_client_for_netaddr().

◆ freeuaddr()

void freeuaddr ( char )

Definition at line 628 of file rpc_generic.c.

629 {
630  free(uaddr);
631 }
#define free
Definition: debug_ros.c:5

Referenced by nfs41_server_resolve().

◆ get_myaddress()

__BEGIN_DECLS int get_myaddress ( struct sockaddr_in )

◆ getrpcport()

int getrpcport ( char ,
int  ,
int  ,
int   
)

Definition at line 47 of file getrpcport.c.

50 {
51  struct sockaddr_in addr;
52  struct hostent *hp;
53 
54  assert(host != NULL);
55 
56  if ((hp = gethostbyname(host)) == NULL)
57  return (0);
58  memset(&addr, 0, sizeof(addr));
59  addr.sin_family = AF_INET;
60  addr.sin_port = 0;
61  if (hp->h_length > sizeof(addr))
62  hp->h_length = sizeof(addr);
63  memcpy(&addr.sin_addr.s_addr, hp->h_addr, (size_t)hp->h_length);
64  /* Inconsistent interfaces need casts! :-( */
65  return (pmap_getport(&addr, (u_long)prognum, (u_long)versnum,
66  (u_int)proto));
67 }
unsigned long u_long
Definition: linux.h:269
char * host
Definition: whois.c:55
#define assert(x)
Definition: debug.h:53
short h_length
Definition: winsock.h:137
smooth NULL
Definition: ftsmooth.c:416
u_short pmap_getport(struct sockaddr_in *address, u_long program, u_long version, u_int protocol)
Definition: pmap_getport.c:74
PHOSTENT WSAAPI gethostbyname(IN const char FAR *name)
Definition: getxbyxx.c:221
GLenum const GLvoid * addr
Definition: glext.h:9621
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
UINT32 u_int
Definition: types.h:82
#define AF_INET
Definition: tcpip.h:117
#define memset(x, y, z)
Definition: compat.h:39

◆ registerrpc()

int registerrpc ( int  ,
int  ,
int  ,
char *)(char[UDPMSGSIZE],
xdrproc_t  ,
xdrproc_t   
)

◆ taddr2uaddr()

char* taddr2uaddr ( const struct netconfig ,
const struct netbuf  
)

Definition at line 609 of file rpc_generic.c.

610 {
611  struct __rpc_sockinfo si;
612 
613  if (!__rpc_nconf2sockinfo(nconf, &si))
614  return NULL;
615  return __rpc_taddr2uaddr_af(si.si_af, nbuf);
616 }
smooth NULL
Definition: ftsmooth.c:416
char * __rpc_taddr2uaddr_af(int af, const struct netbuf *nbuf)
Definition: rpc_generic.c:663
int __rpc_nconf2sockinfo(const struct netconfig *nconf, struct __rpc_sockinfo *sip)
Definition: rpc_generic.c:540

Referenced by cache_get(), cache_set(), getclnthandle(), nfs41_server_resolve(), and rpcb_set().

◆ uaddr2taddr()

struct netbuf* uaddr2taddr ( const struct netconfig ,
const char  
)

Definition at line 619 of file rpc_generic.c.

620 {
621  struct __rpc_sockinfo si;
622 
623  if (!__rpc_nconf2sockinfo(nconf, &si))
624  return NULL;
625  return __rpc_uaddr2taddr_af(si.si_af, uaddr);
626 }
smooth NULL
Definition: ftsmooth.c:416
struct netbuf * __rpc_uaddr2taddr_af(int af, const char *uaddr)
Definition: rpc_generic.c:734
int __rpc_nconf2sockinfo(const struct netconfig *nconf, struct __rpc_sockinfo *sip)
Definition: rpc_generic.c:540

Referenced by __rpcb_findaddr_timed(), get_client_for_netaddr(), pmap_set(), and rpc_broadcast_exp().