Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Update.
	Add changes which were in this form in the original patch by
	Eric Norum <eric.norum@usask.ca>.
	* include/rpc/rpc.h: Remove svc_fdset, rpc_createerr, svc_pollfd, and
	svc_max_pollfd.
	* sunrpc/rpc/rpc.h: Declare __rpc_thread_svc_fdset,
	__rpc_thread_createerr, __rpc_thread_svc_pollfd, and
	__rpc_thread_svc_max_pollfd.
	Define svc_fdset, get_rpc_createerr, svc_pollfd, and
	svc_max_pollfd.
	* sunrpc/rpc_thread.c: Handle first thread special, it uses the
	global variables.
	Define __rpc_thread_svc_fdset, __rpc_thread_createerr,
	__rpc_thread_svc_pollfd, and __rpc_thread_svc_max_pollfd.
	* sunrpc/Versions [libc] (GLIBC_2.2.3): Export  __rpc_thread_svc_fdset,
	__rpc_thread_createerr, __rpc_thread_svc_pollfd, and
	__rpc_thread_svc_max_pollfd.
	* sunrpc/clnt_gen.c: Replace use of rpc_createerr by call to
	get_rpc_createerr.
	* sunrpc/clnt_perr.c: Likewise.
	* sunrpc/clnt_simp.c: Likewise.
	* sunrpc/clnt_tcp.c: Likewise.
	* sunrpc/clnt_udp.c: Likewise.
	* sunrpc/clnt_unix.c: Likewise.
	* sunrpc/pm_getport.c: Likewise.
  • Loading branch information
Ulrich Drepper committed Mar 26, 2001
1 parent 5e31149 commit 543cf8a
Show file tree
Hide file tree
Showing 12 changed files with 180 additions and 48 deletions.
25 changes: 25 additions & 0 deletions ChangeLog
@@ -1,5 +1,30 @@
2001-03-25 Ulrich Drepper <drepper@redhat.com>

Add changes which were in this form in the original patch by
Eric Norum <eric.norum@usask.ca>.
* include/rpc/rpc.h: Remove svc_fdset, rpc_createerr, svc_pollfd, and
svc_max_pollfd.
* sunrpc/rpc/rpc.h: Declare __rpc_thread_svc_fdset,
__rpc_thread_createerr, __rpc_thread_svc_pollfd, and
__rpc_thread_svc_max_pollfd.
Define svc_fdset, get_rpc_createerr, svc_pollfd, and
svc_max_pollfd.
* sunrpc/rpc_thread.c: Handle first thread special, it uses the
global variables.
Define __rpc_thread_svc_fdset, __rpc_thread_createerr,
__rpc_thread_svc_pollfd, and __rpc_thread_svc_max_pollfd.
* sunrpc/Versions [libc] (GLIBC_2.2.3): Export __rpc_thread_svc_fdset,
__rpc_thread_createerr, __rpc_thread_svc_pollfd, and
__rpc_thread_svc_max_pollfd.
* sunrpc/clnt_gen.c: Replace use of rpc_createerr by call to
get_rpc_createerr.
* sunrpc/clnt_perr.c: Likewise.
* sunrpc/clnt_simp.c: Likewise.
* sunrpc/clnt_tcp.c: Likewise.
* sunrpc/clnt_udp.c: Likewise.
* sunrpc/clnt_unix.c: Likewise.
* sunrpc/pm_getport.c: Likewise.

* sysdeps/unix/sysv/linux/i386/getgroups.c (__getgroups): getgroups32
syscall checks for negative n so don't test here as well.

Expand Down
8 changes: 0 additions & 8 deletions include/rpc/rpc.h
Expand Up @@ -48,14 +48,6 @@ extern void __rpc_thread_destroy (void);

#define RPC_THREAD_VARIABLE(x) (__rpc_thread_variables()->x)

/*
* Global variables
*/
#define svc_fdset RPC_THREAD_VARIABLE(svc_fdset_s)
#define rpc_createerr RPC_THREAD_VARIABLE(rpc_createerr_s)
#define svc_pollfd RPC_THREAD_VARIABLE(svc_pollfd_s)
#define svc_max_pollfd RPC_THREAD_VARIABLE(svc_max_pollfd_s)

#endif /* _RPC_THREAD_SAFE_ */

#endif
3 changes: 2 additions & 1 deletion sunrpc/Versions
Expand Up @@ -110,6 +110,7 @@ libc {
svc_getreq_common; svc_getreq_poll; svc_max_pollfd; svc_pollfd;
}
GLIBC_2.2.3 {
__rpc_thread_destroy;
__rpc_thread_destroy; __rpc_thread_svc_fdset; __rpc_thread_createerr;
__rpc_thread_svc_pollfd; __rpc_thread_svc_max_pollfd;
}
}
19 changes: 12 additions & 7 deletions sunrpc/clnt_gen.c
Expand Up @@ -87,7 +87,7 @@ clnt_create (const char *hostname, u_long prog, u_long vers,
|| h == NULL)
if (herr != NETDB_INTERNAL || errno != ERANGE)
{
rpc_createerr.cf_stat = RPC_UNKNOWNHOST;
get_rpc_createerr().cf_stat = RPC_UNKNOWNHOST;
return NULL;
}
else
Expand All @@ -102,8 +102,9 @@ clnt_create (const char *hostname, u_long prog, u_long vers,
/*
* Only support INET for now
*/
rpc_createerr.cf_stat = RPC_SYSTEMERROR;
rpc_createerr.cf_error.re_errno = EAFNOSUPPORT;
struct rpc_createerr *ce = &get_rpc_createerr ();
ce->cf_stat = RPC_SYSTEMERROR;
ce->cf_error.re_errno = EAFNOSUPPORT;
return NULL;
}
sin.sin_family = h->h_addrtype;
Expand All @@ -117,8 +118,9 @@ clnt_create (const char *hostname, u_long prog, u_long vers,
|| p == NULL)
if (errno != ERANGE)
{
rpc_createerr.cf_stat = RPC_UNKNOWNPROTO;
rpc_createerr.cf_error.re_errno = EPFNOSUPPORT;
struct rpc_createerr *ce = &get_rpc_createerr ();
ce->cf_stat = RPC_UNKNOWNPROTO;
ce->cf_error.re_errno = EPFNOSUPPORT;
return NULL;
}
else
Expand Down Expand Up @@ -163,8 +165,11 @@ clnt_create (const char *hostname, u_long prog, u_long vers,
#endif
break;
default:
rpc_createerr.cf_stat = RPC_SYSTEMERROR;
rpc_createerr.cf_error.re_errno = EPFNOSUPPORT;
{
struct rpc_createerr *ce = &get_rpc_createerr ();
ce->cf_stat = RPC_SYSTEMERROR;
ce->cf_error.re_errno = EPFNOSUPPORT;
}
return (NULL);
}
return client;
Expand Down
10 changes: 6 additions & 4 deletions sunrpc/clnt_perr.c
Expand Up @@ -292,22 +292,24 @@ clnt_spcreateerror (const char *msg)
char *str = _buf ();
char *cp;
int len;
struct rpc_createerr *ce;

if (str == NULL)
return NULL;
ce = &get_rpc_createerr ();
len = sprintf (str, "%s: ", msg);
cp = str + len;
cp = stpcpy (cp, clnt_sperrno (rpc_createerr.cf_stat));
switch (rpc_createerr.cf_stat)
cp = stpcpy (cp, clnt_sperrno (ce->cf_stat));
switch (ce->cf_stat)
{
case RPC_PMAPFAILURE:
cp = stpcpy (stpcpy (cp, " - "),
clnt_sperrno (rpc_createerr.cf_error.re_status));
clnt_sperrno (ce->cf_error.re_status));
break;

case RPC_SYSTEMERROR:
cp = stpcpy (stpcpy (cp, " - "),
__strerror_r (rpc_createerr.cf_error.re_errno,
__strerror_r (ce->cf_error.re_errno,
chrbuf, sizeof chrbuf));
break;
default:
Expand Down
2 changes: 1 addition & 1 deletion sunrpc/clnt_simp.c
Expand Up @@ -127,7 +127,7 @@ callrpc (const char *host, u_long prognum, u_long versnum, u_long procnum,
server_addr.sin_port = 0;
if ((crp->client = clntudp_create (&server_addr, (u_long) prognum,
(u_long) versnum, timeout, &crp->socket)) == NULL)
return (int) rpc_createerr.cf_stat;
return (int) get_rpc_createerr().cf_stat;
crp->valid = 1;
crp->oldprognum = prognum;
crp->oldversnum = versnum;
Expand Down
15 changes: 9 additions & 6 deletions sunrpc/clnt_tcp.c
Expand Up @@ -123,17 +123,19 @@ clnttcp_create (struct sockaddr_in *raddr, u_long prog, u_long vers,
h = (CLIENT *) mem_alloc (sizeof (*h));
if (h == NULL)
{
struct rpc_createerr *ce = &get_rpc_createerr ();
(void) fprintf (stderr, _("clnttcp_create: out of memory\n"));
rpc_createerr.cf_stat = RPC_SYSTEMERROR;
rpc_createerr.cf_error.re_errno = errno;
ce->cf_stat = RPC_SYSTEMERROR;
ce->cf_error.re_errno = errno;
goto fooy;
}
/* ct = (struct ct_data *) mem_alloc (sizeof (*ct)); */
if (ct == NULL)
{
struct rpc_createerr *ce = &get_rpc_createerr ();
(void) fprintf (stderr, _("clnttcp_create: out of memory\n"));
rpc_createerr.cf_stat = RPC_SYSTEMERROR;
rpc_createerr.cf_error.re_errno = errno;
ce->cf_stat = RPC_SYSTEMERROR;
ce->cf_error.re_errno = errno;
goto fooy;
}

Expand Down Expand Up @@ -163,8 +165,9 @@ clnttcp_create (struct sockaddr_in *raddr, u_long prog, u_long vers,
|| (__connect (*sockp, (struct sockaddr *) raddr,
sizeof (*raddr)) < 0))
{
rpc_createerr.cf_stat = RPC_SYSTEMERROR;
rpc_createerr.cf_error.re_errno = errno;
struct rpc_createerr *ce = &get_rpc_createerr ();
ce->cf_stat = RPC_SYSTEMERROR;
ce->cf_error.re_errno = errno;
if (*sockp >= 0)
(void) __close (*sockp);
goto fooy;
Expand Down
15 changes: 9 additions & 6 deletions sunrpc/clnt_udp.c
Expand Up @@ -128,19 +128,21 @@ clntudp_bufcreate (struct sockaddr_in *raddr, u_long program, u_long version,
cl = (CLIENT *) mem_alloc (sizeof (CLIENT));
if (cl == NULL)
{
struct rpc_createerr *ce = &get_rpc_createerr ();
(void) fprintf (stderr, _("clntudp_create: out of memory\n"));
rpc_createerr.cf_stat = RPC_SYSTEMERROR;
rpc_createerr.cf_error.re_errno = errno;
ce->cf_stat = RPC_SYSTEMERROR;
ce->cf_error.re_errno = errno;
goto fooy;
}
sendsz = ((sendsz + 3) / 4) * 4;
recvsz = ((recvsz + 3) / 4) * 4;
cu = (struct cu_data *) mem_alloc (sizeof (*cu) + sendsz + recvsz);
if (cu == NULL)
{
struct rpc_createerr *ce = &get_rpc_createerr ();
(void) fprintf (stderr, _("clntudp_create: out of memory\n"));
rpc_createerr.cf_stat = RPC_SYSTEMERROR;
rpc_createerr.cf_error.re_errno = errno;
ce->cf_stat = RPC_SYSTEMERROR;
ce->cf_error.re_errno = errno;
goto fooy;
}
cu->cu_outbuf = &cu->cu_inbuf[recvsz];
Expand Down Expand Up @@ -183,8 +185,9 @@ clntudp_bufcreate (struct sockaddr_in *raddr, u_long program, u_long version,
*sockp = __socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (*sockp < 0)
{
rpc_createerr.cf_stat = RPC_SYSTEMERROR;
rpc_createerr.cf_error.re_errno = errno;
struct rpc_createerr *ce = &get_rpc_createerr ();
ce->cf_stat = RPC_SYSTEMERROR;
ce->cf_error.re_errno = errno;
goto fooy;
}
/* attempt to bind to prov port */
Expand Down
15 changes: 9 additions & 6 deletions sunrpc/clnt_unix.c
Expand Up @@ -121,17 +121,19 @@ clntunix_create (struct sockaddr_un *raddr, u_long prog, u_long vers,
h = (CLIENT *) mem_alloc (sizeof (*h));
if (h == NULL)
{
struct rpc_createerr *ce = &get_rpc_createerr ();
(void) fputs (_("clntunix_create: out of memory\n"), stderr);
rpc_createerr.cf_stat = RPC_SYSTEMERROR;
rpc_createerr.cf_error.re_errno = errno;
ce->cf_stat = RPC_SYSTEMERROR;
ce->cf_error.re_errno = errno;
goto fooy;
}
/* ct = (struct ct_data *) mem_alloc (sizeof (*ct)); */
if (ct == NULL)
{
struct rpc_createerr *ce = &get_rpc_createerr ();
(void) fputs (_("clntunix_create: out of memory\n"), stderr);
rpc_createerr.cf_stat = RPC_SYSTEMERROR;
rpc_createerr.cf_error.re_errno = errno;
ce->cf_stat = RPC_SYSTEMERROR;
ce->cf_error.re_errno = errno;
goto fooy;
}

Expand All @@ -145,8 +147,9 @@ clntunix_create (struct sockaddr_un *raddr, u_long prog, u_long vers,
if (*sockp < 0
|| __connect (*sockp, (struct sockaddr *) raddr, len) < 0)
{
rpc_createerr.cf_stat = RPC_SYSTEMERROR;
rpc_createerr.cf_error.re_errno = errno;
struct rpc_createerr *ce = &get_rpc_createerr ();
ce->cf_stat = RPC_SYSTEMERROR;
ce->cf_error.re_errno = errno;
if (*sockp != -1)
__close (*sockp);
goto fooy;
Expand Down
7 changes: 4 additions & 3 deletions sunrpc/pm_getport.c
Expand Up @@ -70,6 +70,7 @@ pmap_getport (address, program, version, protocol)
PMAPVERS, timeout, &socket, RPCSMALLMSGSIZE, RPCSMALLMSGSIZE);
if (client != (CLIENT *) NULL)
{
struct rpc_createerr *ce = &get_rpc_createerr ();
parms.pm_prog = program;
parms.pm_vers = version;
parms.pm_prot = protocol;
Expand All @@ -78,12 +79,12 @@ pmap_getport (address, program, version, protocol)
(caddr_t)&parms, (xdrproc_t)xdr_u_short,
(caddr_t)&port, tottimeout) != RPC_SUCCESS)
{
rpc_createerr.cf_stat = RPC_PMAPFAILURE;
clnt_geterr (client, &rpc_createerr.cf_error);
ce->cf_stat = RPC_PMAPFAILURE;
clnt_geterr (client, &ce->cf_error);
}
else if (port == 0)
{
rpc_createerr.cf_stat = RPC_PROGNOTREGISTERED;
ce->cf_stat = RPC_PROGNOTREGISTERED;
}
CLNT_DESTROY (client);
}
Expand Down
24 changes: 24 additions & 0 deletions sunrpc/rpc/rpc.h
Expand Up @@ -67,4 +67,28 @@
/* routines for parsing /etc/rpc */
#include <rpc/netdb.h> /* structures and routines to parse /etc/rpc */


/* Global variables, protected for multi-threaded applications. */
extern fd_set *__rpc_thread_svc_fdset (void) __attribute__ ((__const__));
#define svc_fdset (*__rpc_thread_svc_fdset ())

extern struct rpc_createerr *__rpc_thread_createerr (void)
__attribute__ ((__const__));
#define get_rpc_createerr() (*__rpc_thread_createerr ())
/* The people who "engineered" RPC should bee punished for naming the
data structure and the variable the same. We cannot always define the
macro 'rpc_createerr' because this would prevent people from defining
object of type 'struct rpc_createerr'. So we leave it up to the user
to select transparent replacement also of this variable. */
#ifdef _RPC_MT_VARS
# define rpc_createerr (*__rpc_thread_createerr ())
#endif

extern struct pollfd **__rpc_thread_svc_pollfd (void)
__attribute__ ((__const__));
#define svc_pollfd (*__rpc_thread_svc_pollfd ())

extern int *__rpc_thread_svc_max_pollfd (void) __attribute__ ((__const__));
#define svc_max_pollfd (*__rpc_thread_svc_max_pollfd ())

#endif /* rpc/rpc.h */

0 comments on commit 543cf8a

Please sign in to comment.