1/* $NetBSD: check_bound.c,v 1.2 2000/06/22 08:09:26 fvdl Exp $ */
2/* $FreeBSD: head/usr.sbin/rpcbind/check_bound.c 293229 2016-01-06 00:00:11Z asomers $ */
3
4/*-
5 * Copyright (c) 2009, Sun Microsystems, Inc.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are met:
10 * - Redistributions of source code must retain the above copyright notice,
--- 34 unchanged lines hidden (view full) ---
45 * Checks to see whether the program is still bound to the
46 * claimed address and returns the universal merged address
47 *
48 */
49
50#include <sys/types.h>
51#include <sys/socket.h>
52#include <rpc/rpc.h>
53#include <rpc/svc_dg.h>
54#include <stdio.h>
55#include <netconfig.h>
56#include <syslog.h>
57#include <string.h>
58#include <unistd.h>
59#include <stdlib.h>
60
61#include "rpcbind.h"
--- 93 unchanged lines hidden (view full) ---
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.
158 */
159char *
160mergeaddr(SVCXPRT *xprt, char *netid, char *uaddr, char *saddr)
161{
162 struct fdlist *fdl;
163 struct svc_dg_data *dg_data;
164 char *c_uaddr, *s_uaddr, *m_uaddr, *allocated_uaddr = NULL;
165
166 for (fdl = fdhead; fdl; fdl = fdl->next)
167 if (strcmp(fdl->nconf->nc_netid, netid) == 0)
168 break;
169 if (fdl == NULL)
170 return (NULL);
171 if (check_bound(fdl, uaddr) == FALSE)
172 /* that server died */
173 return (nullstring);
174 /*
175 * Try to determine the local address on which the client contacted us,
176 * so we can send a reply from the same address. If it's unknown, then
177 * try to determine which address the client used, and pick a nearby
178 * local address.
179 *
180 * If saddr is not NULL, the remote client may have included the
181 * address by which it contacted us. Use that for the "client" uaddr,
182 * otherwise use the info from the SVCXPRT.
183 */
184 dg_data = (struct svc_dg_data*)xprt->xp_p2;
185 if (dg_data != NULL && dg_data->su_srcaddr.buf != NULL) {
186 c_uaddr = taddr2uaddr(fdl->nconf, &dg_data->su_srcaddr);
187 }
188 else if (saddr != NULL) {
189 c_uaddr = saddr;
190 } else {
191 c_uaddr = taddr2uaddr(fdl->nconf, svc_getrpccaller(xprt));
192 if (c_uaddr == NULL) {
193 syslog(LOG_ERR, "taddr2uaddr failed for %s",
194 fdl->nconf->nc_netid);
195 return (NULL);
196 }
--- 26 unchanged lines hidden (view full) ---
223 return (m_uaddr);
224}
225
226/*
227 * Returns a netconf structure from its internal list. This
228 * structure should not be freed.
229 */
230struct netconfig *
231rpcbind_get_conf(const char *netid)
232{
233 struct fdlist *fdl;
234
235 for (fdl = fdhead; fdl; fdl = fdl->next)
236 if (strcmp(fdl->nconf->nc_netid, netid) == 0)
237 break;
238 if (fdl == NULL)
239 return (NULL);
240 return (fdl->nconf);
241}
2/* $FreeBSD: head/usr.sbin/rpcbind/check_bound.c 293229 2016-01-06 00:00:11Z asomers $ */
3
4/*-
5 * Copyright (c) 2009, Sun Microsystems, Inc.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are met:
10 * - Redistributions of source code must retain the above copyright notice,
--- 34 unchanged lines hidden (view full) ---
45 * Checks to see whether the program is still bound to the
46 * claimed address and returns the universal merged address
47 *
48 */
49
50#include <sys/types.h>
51#include <sys/socket.h>
52#include <rpc/rpc.h>
53#include <rpc/svc_dg.h>
54#include <stdio.h>
55#include <netconfig.h>
56#include <syslog.h>
57#include <string.h>
58#include <unistd.h>
59#include <stdlib.h>
60
61#include "rpcbind.h"
--- 93 unchanged lines hidden (view full) ---
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.
158 */
159char *
160mergeaddr(SVCXPRT *xprt, char *netid, char *uaddr, char *saddr)
161{
162 struct fdlist *fdl;
163 struct svc_dg_data *dg_data;
164 char *c_uaddr, *s_uaddr, *m_uaddr, *allocated_uaddr = NULL;
165
166 for (fdl = fdhead; fdl; fdl = fdl->next)
167 if (strcmp(fdl->nconf->nc_netid, netid) == 0)
168 break;
169 if (fdl == NULL)
170 return (NULL);
171 if (check_bound(fdl, uaddr) == FALSE)
172 /* that server died */
173 return (nullstring);
174 /*
175 * Try to determine the local address on which the client contacted us,
176 * so we can send a reply from the same address. If it's unknown, then
177 * try to determine which address the client used, and pick a nearby
178 * local address.
179 *
180 * If saddr is not NULL, the remote client may have included the
181 * address by which it contacted us. Use that for the "client" uaddr,
182 * otherwise use the info from the SVCXPRT.
183 */
184 dg_data = (struct svc_dg_data*)xprt->xp_p2;
185 if (dg_data != NULL && dg_data->su_srcaddr.buf != NULL) {
186 c_uaddr = taddr2uaddr(fdl->nconf, &dg_data->su_srcaddr);
187 }
188 else if (saddr != NULL) {
189 c_uaddr = saddr;
190 } else {
191 c_uaddr = taddr2uaddr(fdl->nconf, svc_getrpccaller(xprt));
192 if (c_uaddr == NULL) {
193 syslog(LOG_ERR, "taddr2uaddr failed for %s",
194 fdl->nconf->nc_netid);
195 return (NULL);
196 }
--- 26 unchanged lines hidden (view full) ---
223 return (m_uaddr);
224}
225
226/*
227 * Returns a netconf structure from its internal list. This
228 * structure should not be freed.
229 */
230struct netconfig *
231rpcbind_get_conf(const char *netid)
232{
233 struct fdlist *fdl;
234
235 for (fdl = fdhead; fdl; fdl = fdl->next)
236 if (strcmp(fdl->nconf->nc_netid, netid) == 0)
237 break;
238 if (fdl == NULL)
239 return (NULL);
240 return (fdl->nconf);
241}