1 /* $NetBSD: check_bound.c,v 1.1 2010/07/26 15:53:00 pooka Exp $ */
4 * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
5 * unrestricted use provided that this legend is included on all tape
6 * media and as a part of the software program in whole or part. Users
7 * may copy or modify Sun RPC without charge, but are not authorized
8 * to license or distribute it to anyone else except as part of a product or
9 * program developed by the user.
11 * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
12 * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
13 * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
15 * Sun RPC is provided with no support and without any obligation on the
16 * part of Sun Microsystems, Inc. to assist in its use, correction,
17 * modification or enhancement.
19 * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
20 * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
21 * OR ANY PART THEREOF.
23 * In no event will Sun Microsystems, Inc. be liable for any lost revenue
24 * or profits or other special, indirect and consequential damages, even if
25 * Sun has been advised of the possibility of such damages.
27 * Sun Microsystems, Inc.
29 * Mountain View, California 94043
32 * Copyright (c) 1986 - 1991 by Sun Microsystems, Inc.
35 /* #ident "@(#)check_bound.c 1.15 93/07/05 SMI" */
39 static char sccsid
[] = "@(#)check_bound.c 1.11 89/04/21 Copyr 1989 Sun Micro";
45 * Checks to see whether the program is still bound to the
46 * claimed address and returns the univeral merged address
50 #include <sys/types.h>
51 #include <sys/socket.h>
54 #include <netconfig.h>
60 #include <rump/rump.h>
61 #include <rump/rump_syscalls.h>
67 struct netconfig
*nconf
;
72 static struct fdlist
*fdhead
; /* Link list of the check fd's */
73 static struct fdlist
*fdtail
;
74 static const char emptystring
[] = "";
76 static bool_t
check_bound(struct fdlist
*, const char *uaddr
);
79 * Returns 1 if the given address is bound for the given addr & transport
80 * For all error cases, we assume that the address is bound
81 * Returns 0 for success.
84 check_bound(struct fdlist
*fdl
, const char *uaddr
)
90 if (fdl
->check_binding
== FALSE
)
93 na
= uaddr2taddr(fdl
->nconf
, uaddr
);
95 return (TRUE
); /* punt, should never happen */
97 fd
= __rpc_nconf2fd(fdl
->nconf
);
103 ans
= bind(fd
, (struct sockaddr
*)na
->buf
, na
->len
);
108 return (ans
== 0 ? FALSE
: TRUE
);
112 add_bndlist(struct netconfig
*nconf
, struct netbuf
*baddr
)
115 struct netconfig
*newnconf
;
117 newnconf
= getnetconfigent(nconf
->nc_netid
);
118 if (newnconf
== NULL
)
120 fdl
= (struct fdlist
*)malloc((u_int
)sizeof (struct fdlist
));
122 freenetconfigent(newnconf
);
123 syslog(LOG_ERR
, "no memory!");
126 fdl
->nconf
= newnconf
;
128 if (fdhead
== NULL
) {
135 /* XXX no bound checking for now */
136 fdl
->check_binding
= FALSE
;
142 is_bound(const char *netid
, const char *uaddr
)
146 for (fdl
= fdhead
; fdl
; fdl
= fdl
->next
)
147 if (strcmp(fdl
->nconf
->nc_netid
, netid
) == 0)
151 return (check_bound(fdl
, uaddr
));
155 * Returns NULL if there was some system error.
156 * Returns "" if the address was not bound, i.e the server crashed.
157 * Returns the merged address otherwise.
160 mergeaddr(SVCXPRT
*xprt
, char *netid
, char *uaddr
, char *saddr
)
163 char *c_uaddr
, *s_uaddr
, *m_uaddr
, *allocated_uaddr
= NULL
;
165 for (fdl
= fdhead
; fdl
; fdl
= fdl
->next
)
166 if (strcmp(fdl
->nconf
->nc_netid
, netid
) == 0)
170 if (check_bound(fdl
, uaddr
) == FALSE
)
171 /* that server died */
172 return strdup(emptystring
);
174 * If saddr is not NULL, the remote client may have included the
175 * address by which it contacted us. Use that for the "client" uaddr,
176 * otherwise use the info from the SVCXPRT.
181 c_uaddr
= taddr2uaddr(fdl
->nconf
, svc_getrpccaller(xprt
));
182 if (c_uaddr
== NULL
) {
183 syslog(LOG_ERR
, "taddr2uaddr failed for %s",
184 fdl
->nconf
->nc_netid
);
187 allocated_uaddr
= c_uaddr
;
193 fprintf(stderr
, "mergeaddr: client uaddr = %s\n",
196 fprintf(stderr
, "mergeaddr: contact uaddr = %s\n",
203 * This is all we should need for IP 4 and 6
205 m_uaddr
= addrmerge(svc_getrpccaller(xprt
), s_uaddr
, c_uaddr
, netid
);
208 fprintf(stderr
, "mergeaddr: uaddr = %s, merged uaddr = %s\n",
211 if (allocated_uaddr
!= NULL
)
212 free(allocated_uaddr
);
217 * Returns a netconf structure from its internal list. This
218 * structure should not be freed.
221 rpcbind_get_conf(const char *netid
)
225 for (fdl
= fdhead
; fdl
; fdl
= fdl
->next
)
226 if (strcmp(fdl
->nconf
->nc_netid
, netid
) == 0)