diff options
author | Alexandra Ellwood <lxs@mit.edu> | 2008-09-28 23:39:25 +0000 |
---|---|---|
committer | Alexandra Ellwood <lxs@mit.edu> | 2008-09-28 23:39:25 +0000 |
commit | b4ffa8094837bc6033930f407777f43ab2f2a02c (patch) | |
tree | 281dd4161ac06f54f09b1963b78e227b60096491 /src/util | |
parent | b1889eb48a41f81198dce718d46d27973933b402 (diff) | |
download | krb5-b4ffa8094837bc6033930f407777f43ab2f2a02c.tar.gz krb5-b4ffa8094837bc6033930f407777f43ab2f2a02c.tar.xz krb5-b4ffa8094837bc6033930f407777f43ab2f2a02c.zip |
Place structure in thread specific data to store client connection
port so that multiple services can be supported simultaneously.
ticket: 6055
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@20773 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/mac/k5_mig_client.c | 57 | ||||
-rw-r--r-- | src/util/mac/k5_mig_client.h | 3 |
2 files changed, 49 insertions, 11 deletions
diff --git a/src/util/mac/k5_mig_client.c b/src/util/mac/k5_mig_client.c index 5ffe7deb8d..d0556fa842 100644 --- a/src/util/mac/k5_mig_client.c +++ b/src/util/mac/k5_mig_client.c @@ -31,6 +31,18 @@ #include "k5_mig_replyServer.h" #include "k5-thread.h" +#define KIPC_SERVICE_COUNT 3 + +typedef struct k5_ipc_request_port { + char *service_id; + mach_port_t port; +} k5_ipc_request_port; + +static k5_ipc_request_port k5_ipc_known_ports[KIPC_SERVICE_COUNT] = { +{ "edu.mit.Kerberos.CCacheServer", MACH_PORT_NULL }, +{ "edu.mit.Kerberos.KerberosAgent", MACH_PORT_NULL }, +{ "edu.mit.Kerberos.OldKerberosAgent", MACH_PORT_NULL } }; + MAKE_INIT_FUNCTION(k5_cli_ipc_thread_init); MAKE_FINI_FUNCTION(k5_cli_ipc_thread_fini); @@ -132,7 +144,8 @@ kern_return_t k5_ipc_client_reply (mach_port_t in_reply_port, /* ------------------------------------------------------------------------ */ -int32_t k5_ipc_send_request (int32_t in_launch_server, +int32_t k5_ipc_send_request (const char *in_service_id, + int32_t in_launch_server, k5_ipc_stream in_request_stream, k5_ipc_stream *out_reply_stream) { @@ -178,17 +191,40 @@ int32_t k5_ipc_send_request (int32_t in_launch_server, } if (!err) { - request_port = k5_getspecific (K5_KEY_IPC_REQUEST_PORT); + k5_ipc_request_port *request_ports = NULL; - if (!request_port) { - request_port = malloc (sizeof (mach_port_t)); + request_ports = k5_getspecific (K5_KEY_IPC_REQUEST_PORT); + + if (!request_ports) { + int size = sizeof (*request_ports) * KIPC_SERVICE_COUNT; + + request_ports = malloc (size); if (!request_port) { err = ENOMEM; } if (!err) { - *request_port = MACH_PORT_NULL; - err = k5_setspecific (K5_KEY_IPC_REQUEST_PORT, request_port); + int i; + + for (i = 0; i < KIPC_SERVICE_COUNT; i++) { + request_ports[i].service_id = k5_ipc_known_ports [i].service_id; + request_ports[i].port = k5_ipc_known_ports [i].port; + } + + err = k5_setspecific (K5_KEY_IPC_REQUEST_PORT, request_ports); } } + + if (!err) { + int i, found = 0; + + for (i = 0; i < KIPC_SERVICE_COUNT; i++) { + if (!strcmp (in_service_id, request_ports[i].service_id)) { + found = 1; + request_port = &request_ports[i].port; + } + } + + if (!found) { err = EINVAL; } + } } if (!err) { @@ -196,8 +232,8 @@ int32_t k5_ipc_send_request (int32_t in_launch_server, } if (!err) { - err = kipc_client_lookup_server (K5_IPC_SERVER_ID, - in_launch_server, TRUE, &server_port); + err = kipc_client_lookup_server (in_service_id, in_launch_server, + TRUE, &server_port); } while (!err && !done) { @@ -224,8 +260,9 @@ int32_t k5_ipc_send_request (int32_t in_launch_server, } /* Look up server name again without using the cached copy */ - err = kipc_client_lookup_server (K5_IPC_SERVER_ID, - in_launch_server, FALSE, &server_port); + err = kipc_client_lookup_server (in_service_id, + in_launch_server, + FALSE, &server_port); } else { /* Talked to server, though we may have gotten an error */ diff --git a/src/util/mac/k5_mig_client.h b/src/util/mac/k5_mig_client.h index b5eefdc3af..10cc43f885 100644 --- a/src/util/mac/k5_mig_client.h +++ b/src/util/mac/k5_mig_client.h @@ -29,7 +29,8 @@ #include "k5-ipc_stream.h" -int32_t k5_ipc_send_request (int32_t in_launch_server, +int32_t k5_ipc_send_request (const char *in_service_id, + int32_t in_launch_server, k5_ipc_stream in_request_stream, k5_ipc_stream *out_reply_stream); |