X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=support%2Fnfs%2Frpc_socket.c;h=aa6a2055772a2fe2f178be8340fe2f6b1683b2c8;hp=9c20f61e5101d5fc8d3d50ff338bbfec7a0dca6c;hb=409b89cc7106154780400c6b2bdce46bc9d5db4b;hpb=5600327322a78a3a803368c0fe4f923cf14a4cf7 diff --git a/support/nfs/rpc_socket.c b/support/nfs/rpc_socket.c index 9c20f61..aa6a205 100644 --- a/support/nfs/rpc_socket.c +++ b/support/nfs/rpc_socket.c @@ -26,6 +26,8 @@ #include #include + +#include #include #include #include @@ -38,6 +40,7 @@ #include #include +#include "sockaddr.h" #include "nfsrpc.h" #ifdef HAVE_LIBTIRPC @@ -51,6 +54,7 @@ #define NFSRPC_TIMEOUT_UDP (3) #define NFSRPC_TIMEOUT_TCP (10) + /* * Set up an RPC client for communicating via a AF_LOCAL socket. * @@ -121,10 +125,10 @@ static int nfs_bind(const int sock, const sa_family_t family) switch (family) { case AF_INET: - return bind(sock, (struct sockaddr *)&sin, + return bind(sock, (struct sockaddr *)(char *)&sin, (socklen_t)sizeof(sin)); case AF_INET6: - return bind(sock, (struct sockaddr *)&sin6, + return bind(sock, (struct sockaddr *)(char *)&sin6, (socklen_t)sizeof(sin6)); } @@ -153,9 +157,9 @@ static int nfs_bindresvport(const int sock, const sa_family_t family) switch (family) { case AF_INET: - return bindresvport_sa(sock, (struct sockaddr *)&sin); + return bindresvport_sa(sock, (struct sockaddr *)(char *)&sin); case AF_INET6: - return bindresvport_sa(sock, (struct sockaddr *)&sin6); + return bindresvport_sa(sock, (struct sockaddr *)(char *)&sin6); } errno = EAFNOSUPPORT; @@ -415,49 +419,6 @@ static CLIENT *nfs_get_tcpclient(const struct sockaddr *sap, return client; } -/** - * nfs_get_port - extract port value from a socket address - * @sap: pointer to socket address - * - * Returns port value in host byte order. - */ -uint16_t -nfs_get_port(const struct sockaddr *sap) -{ - const struct sockaddr_in *sin = (const struct sockaddr_in *)sap; - const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)sap; - - switch (sap->sa_family) { - case AF_INET: - return ntohs(sin->sin_port); - case AF_INET6: - return ntohs(sin6->sin6_port); - } - return 0; -} - -/** - * nfs_set_port - set port value in a socket address - * @sap: pointer to socket address - * @port: port value to set - * - */ -void -nfs_set_port(struct sockaddr *sap, const uint16_t port) -{ - struct sockaddr_in *sin = (struct sockaddr_in *)sap; - struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sap; - - switch (sap->sa_family) { - case AF_INET: - sin->sin_port = htons(port); - break; - case AF_INET6: - sin6->sin6_port = htons(port); - break; - } -} - /** * nfs_get_rpcclient - acquire an RPC client * @sap: pointer to socket address of RPC server @@ -596,3 +557,24 @@ rpcprog_t nfs_getrpcbyname(const rpcprog_t program, const char *table[]) return program; } + +/* + * AUTH_SYS doesn't allow more than 16 gids in the supplemental group list. + * If there are more than that, trying to determine which ones to include + * in the list is problematic. This function creates an auth handle that + * only has the primary gid in the supplemental gids list. It's intended to + * be used for protocols where credentials really don't matter much (the MNT + * protocol, for instance). + */ +AUTH * +nfs_authsys_create(void) +{ + char machname[MAXHOSTNAMELEN + 1]; + uid_t uid = geteuid(); + gid_t gid = getegid(); + + if (gethostname(machname, sizeof(machname)) == -1) + return NULL; + + return authsys_create(machname, uid, gid, 1, &gid); +}