Skip to content

Commit

Permalink
On Mac OS X, try poking launchd to get the portmapper launched before
Browse files Browse the repository at this point in the history
we try to connect to it.

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@20364 dc483132-0cff-0310-8789-dd5450dbe970
  • Loading branch information
raeburn committed Jun 6, 2008
1 parent 32db760 commit d318f9a
Showing 1 changed file with 55 additions and 3 deletions.
58 changes: 55 additions & 3 deletions src/lib/rpc/pmap_clnt.c
Expand Up @@ -43,6 +43,12 @@ static char sccsid[] = "@(#)pmap_clnt.c 1.37 87/08/11 Copyr 1984 Sun Micro";
#include <gssrpc/pmap_prot.h>
#include <gssrpc/pmap_clnt.h>

#if TARGET_OS_MAC
#include <sys/un.h>
#include <string.h>
#include <syslog.h>
#endif

static struct timeval timeout = { 5, 0 };
static struct timeval tottimeout = { 60, 0 };

Expand All @@ -60,27 +66,73 @@ pmap_set(
u_int port)
{
struct sockaddr_in myaddress;
int socket = -1;
int sock = -1;
register CLIENT *client;
struct pmap parms;
bool_t rslt;

get_myaddress(&myaddress);
client = clntudp_bufcreate(&myaddress, PMAPPROG, PMAPVERS,
timeout, &socket, RPCSMALLMSGSIZE, RPCSMALLMSGSIZE);
timeout, &sock, RPCSMALLMSGSIZE, RPCSMALLMSGSIZE);
if (client == (CLIENT *)NULL)
return (FALSE);
parms.pm_prog = program;
parms.pm_vers = version;
parms.pm_prot = protocol;
parms.pm_port = port;
#if TARGET_OS_MAC
{
/*
* Poke launchd, then wait for portmap to start up.
*
* My impression is that the protocol involves getting
* something back from the server. So wait, briefly, to
* see if it's going to send us something. Then continue
* on, regardless. I don't actually check what the data
* is, because I have no idea what sort of validation, if
* any, is needed.
*
* However, for whatever reason, the socket seems to be
* mode 700 owner root on my system, so if you don't
* change its ownership or mode, and if the program isn't
* running as root, you still lose.
*/
#define TICKLER_SOCKET "/var/run/portmap.socket"
int tickle;
struct sockaddr_un a = {
.sun_family = AF_UNIX,
.sun_path = TICKLER_SOCKET,
.sun_len = (sizeof(TICKLER_SOCKET)
+ offsetof(struct sockaddr_un, sun_path)),
};

if (sizeof(TICKLER_SOCKET) <= sizeof(a.sun_path)) {
tickle = socket(AF_UNIX, SOCK_STREAM, 0);
if (tickle >= 0) {
if (connect(tickle, (struct sockaddr *)&a, a.sun_len) == 0
&& tickle < FD_SETSIZE) {
fd_set readfds;
struct timeval tv;

FD_ZERO(&readfds);
/* XXX Range check. */
FD_SET(tickle, &readfds);
tv.tv_sec = 5;
tv.tv_usec = 0;
(void) select(tickle+1, &readfds, 0, 0, &tv);
}
close(tickle);
}
}
}
#endif
if (CLNT_CALL(client, PMAPPROC_SET, xdr_pmap, &parms, xdr_bool, &rslt,
tottimeout) != RPC_SUCCESS) {
clnt_perror(client, "Cannot register service");
return (FALSE);
}
CLNT_DESTROY(client);
(void)close(socket);
(void)close(sock);
return (rslt);
}

Expand Down

0 comments on commit d318f9a

Please sign in to comment.