summaryrefslogtreecommitdiffstats
path: root/src/kim
diff options
context:
space:
mode:
Diffstat (limited to 'src/kim')
-rw-r--r--src/kim/lib/kim_library_private.h1
-rw-r--r--src/kim/lib/kim_options.c28
-rw-r--r--src/kim/lib/kim_selection_hints.c155
-rw-r--r--src/kim/lib/kim_string.c17
-rw-r--r--src/kim/lib/kim_string_private.h2
5 files changed, 90 insertions, 113 deletions
diff --git a/src/kim/lib/kim_library_private.h b/src/kim/lib/kim_library_private.h
index 83c06d791..160fba3a5 100644
--- a/src/kim/lib/kim_library_private.h
+++ b/src/kim/lib/kim_library_private.h
@@ -28,6 +28,7 @@
#define KIM_LIBRARY_PRIVATE_H
#include <kim/kim.h>
+#include <kim/kim_library.h>
kim_error kim_library_init (void);
diff --git a/src/kim/lib/kim_options.c b/src/kim/lib/kim_options.c
index 8cefa2ecf..06c25ae88 100644
--- a/src/kim/lib/kim_options.c
+++ b/src/kim/lib/kim_options.c
@@ -49,7 +49,7 @@ kim_default_renewal_lifetime,
kim_default_forwardable,
kim_default_proxiable,
kim_default_addressless,
-NULL,
+kim_empty_string,
NULL,
NULL };
@@ -384,17 +384,16 @@ kim_error kim_options_set_service_name (kim_options io_options,
kim_string in_service_name)
{
kim_error err = KIM_NO_ERROR;
- kim_string service_name = NULL;
if (!err && !io_options) { err = check_error (KIM_NULL_PARAMETER_ERR); }
- if (!err && in_service_name) {
- err = kim_string_copy (&service_name, in_service_name);
- }
-
if (!err) {
kim_string_free (&io_options->service_name);
- io_options->service_name = service_name;
+ if (in_service_name) {
+ err = kim_string_copy (&io_options->service_name, in_service_name);
+ } else {
+ io_options->service_name = kim_empty_string;
+ }
}
return check_error (err);
@@ -411,7 +410,8 @@ kim_error kim_options_get_service_name (kim_options in_options,
if (!err && !out_service_name) { err = check_error (KIM_NULL_PARAMETER_ERR); }
if (!err) {
- if (in_options->service_name) {
+ if (in_options->service_name &&
+ in_options->service_name != kim_empty_string) {
err = kim_string_copy (out_service_name, in_options->service_name);
} else {
*out_service_name = NULL;
@@ -428,7 +428,11 @@ kim_error kim_options_get_service_name (kim_options in_options,
char *kim_options_service_name (kim_options in_options)
{
if (in_options) {
- return (char *) in_options->service_name;
+ if (in_options->service_name == kim_empty_string) {
+ return NULL;
+ } else {
+ return (char *) in_options->service_name;
+ }
}
check_error (KIM_NULL_PARAMETER_ERR); /* log bad options input */
return NULL;
@@ -560,9 +564,7 @@ kim_error kim_options_write_to_stream (kim_options in_options,
}
if (!err) {
- kim_string service_name = (options->service_name ?
- options->service_name : "");
- err = k5_ipc_stream_write_string (io_stream, service_name);
+ err = k5_ipc_stream_write_string (io_stream, options->service_name);
}
if (options != in_options) { kim_options_free (&options); }
@@ -618,7 +620,7 @@ kim_error kim_options_read_from_stream (kim_options io_options,
if (service_name[0]) {
err = kim_string_copy (&io_options->service_name, service_name);
} else {
- io_options->service_name = NULL;
+ io_options->service_name = kim_empty_string;
}
}
diff --git a/src/kim/lib/kim_selection_hints.c b/src/kim/lib/kim_selection_hints.c
index 795435359..c9d5df16d 100644
--- a/src/kim/lib/kim_selection_hints.c
+++ b/src/kim/lib/kim_selection_hints.c
@@ -42,16 +42,16 @@ struct kim_selection_hints_opaque {
struct kim_selection_hints_opaque kim_selection_hints_initializer = {
NULL,
- NULL,
+ kim_empty_string,
KIM_OPTIONS_DEFAULT,
TRUE,
TRUE,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL
+ kim_empty_string,
+ kim_empty_string,
+ kim_empty_string,
+ kim_empty_string,
+ kim_empty_string,
+ kim_empty_string
};
/* ------------------------------------------------------------------------ */
@@ -196,26 +196,32 @@ kim_error kim_selection_hints_set_hint (kim_selection_hints io_selection_hints,
if (!err) {
if (!strcmp (in_hint_key, kim_hint_key_client_realm)) {
+ kim_string_free (&io_selection_hints->client_realm);
err = kim_string_copy (&io_selection_hints->client_realm,
in_hint_string);
} else if (!strcmp (in_hint_key, kim_hint_key_user)) {
+ kim_string_free (&io_selection_hints->user);
err = kim_string_copy (&io_selection_hints->user,
in_hint_string);
} else if (!strcmp (in_hint_key, kim_hint_key_service_realm)) {
+ kim_string_free (&io_selection_hints->service_realm);
err = kim_string_copy (&io_selection_hints->service_realm,
in_hint_string);
} else if (!strcmp (in_hint_key, kim_hint_key_service)) {
+ kim_string_free (&io_selection_hints->service);
err = kim_string_copy (&io_selection_hints->service,
in_hint_string);
} else if (!strcmp (in_hint_key, kim_hint_key_server)) {
+ kim_string_free (&io_selection_hints->server);
err = kim_string_copy (&io_selection_hints->server,
in_hint_string);
} else if (!strcmp (in_hint_key, kim_hint_key_service_identity)) {
+ kim_string_free (&io_selection_hints->service_identity);
err = kim_string_copy (&io_selection_hints->service_identity,
in_hint_string);
@@ -235,6 +241,7 @@ kim_error kim_selection_hints_get_hint (kim_selection_hints in_selection_hints,
kim_string *out_hint_string)
{
kim_error err = KIM_NO_ERROR;
+ kim_string hint = NULL;
if (!err && !in_selection_hints) { err = check_error (KIM_NULL_PARAMETER_ERR); }
if (!err && !in_hint_key ) { err = check_error (KIM_NULL_PARAMETER_ERR); }
@@ -242,28 +249,22 @@ kim_error kim_selection_hints_get_hint (kim_selection_hints in_selection_hints,
if (!err) {
if (!strcmp (in_hint_key, kim_hint_key_client_realm)) {
- err = kim_string_copy (out_hint_string,
- in_selection_hints->client_realm);
+ hint = in_selection_hints->client_realm;
} else if (!strcmp (in_hint_key, kim_hint_key_user)) {
- err = kim_string_copy (out_hint_string,
- in_selection_hints->user);
+ hint = in_selection_hints->user;
} else if (!strcmp (in_hint_key, kim_hint_key_service_realm)) {
- err = kim_string_copy (out_hint_string,
- in_selection_hints->service_realm);
+ hint = in_selection_hints->service_realm;
} else if (!strcmp (in_hint_key, kim_hint_key_service)) {
- err = kim_string_copy (out_hint_string,
- in_selection_hints->service);
-
+ hint = in_selection_hints->service;
+
} else if (!strcmp (in_hint_key, kim_hint_key_server)) {
- err = kim_string_copy (out_hint_string,
- in_selection_hints->server);
+ hint = in_selection_hints->server;
} else if (!strcmp (in_hint_key, kim_hint_key_service_identity)) {
- err = kim_string_copy (out_hint_string,
- in_selection_hints->service_identity);
+ hint = in_selection_hints->service_identity;
} else {
err = kim_error_set_message_for_code (KIM_UNSUPPORTED_HINT_ERR,
@@ -271,6 +272,14 @@ kim_error kim_selection_hints_get_hint (kim_selection_hints in_selection_hints,
}
}
+ if (!err) {
+ if (hint && hint != kim_empty_string) {
+ err = kim_string_copy (out_hint_string, hint);
+ } else {
+ *out_hint_string = NULL;
+ }
+ }
+
return check_error (err);
}
@@ -302,7 +311,8 @@ kim_error kim_selection_hints_get_explanation (kim_selection_hints in_selection
if (!err && !out_explanation ) { err = check_error (KIM_NULL_PARAMETER_ERR); }
if (!err) {
- if (in_selection_hints->explanation) {
+ if (in_selection_hints->explanation &&
+ in_selection_hints->explanation != kim_empty_string) {
err = kim_string_copy (out_explanation, in_selection_hints->explanation);
} else {
*out_explanation = NULL;
@@ -576,49 +586,43 @@ kim_error kim_selection_hints_write_to_stream (kim_selection_hints in_selection_
}
if (!err) {
- kim_string explanation = (in_selection_hints->explanation ?
- in_selection_hints->explanation : "");
- err = k5_ipc_stream_write_string (io_stream, explanation);
+ err = k5_ipc_stream_write_string (io_stream,
+ in_selection_hints->explanation);
}
if (!err) {
- err = kim_options_write_to_stream (in_selection_hints->options, io_stream);
+ err = kim_options_write_to_stream (in_selection_hints->options,
+ io_stream);
}
if (!err) {
- kim_string service_identity = (in_selection_hints->service_identity ?
- in_selection_hints->service_identity : "");
- err = k5_ipc_stream_write_string (io_stream, service_identity);
+ err = k5_ipc_stream_write_string (io_stream,
+ in_selection_hints->service_identity);
}
if (!err) {
- kim_string client_realm = (in_selection_hints->client_realm ?
- in_selection_hints->client_realm : "");
- err = k5_ipc_stream_write_string (io_stream, client_realm);
+ err = k5_ipc_stream_write_string (io_stream,
+ in_selection_hints->client_realm);
}
if (!err) {
- kim_string user = (in_selection_hints->user ?
- in_selection_hints->user : "");
- err = k5_ipc_stream_write_string (io_stream, user);
+ err = k5_ipc_stream_write_string (io_stream,
+ in_selection_hints->user);
}
if (!err) {
- kim_string service_realm = (in_selection_hints->service_realm ?
- in_selection_hints->service_realm : "");
- err = k5_ipc_stream_write_string (io_stream, service_realm);
+ err = k5_ipc_stream_write_string (io_stream,
+ in_selection_hints->service_realm);
}
if (!err) {
- kim_string service = (in_selection_hints->service ?
- in_selection_hints->service : "");
- err = k5_ipc_stream_write_string (io_stream, service);
+ err = k5_ipc_stream_write_string (io_stream,
+ in_selection_hints->service);
}
if (!err) {
- kim_string server = (in_selection_hints->server ?
- in_selection_hints->server : "");
- err = k5_ipc_stream_write_string (io_stream, server);
+ err = k5_ipc_stream_write_string (io_stream,
+ in_selection_hints->server);
}
return check_error (err);
@@ -651,13 +655,8 @@ kim_error kim_selection_hints_read_from_stream (kim_selection_hints io_selection
err = k5_ipc_stream_read_string (io_stream, &explanation);
if (!err) {
- if (!explanation[0]) {
- err = kim_string_copy (&io_selection_hints->explanation,
- explanation);
- } else {
- err = kim_selection_hints_set_explanation (io_selection_hints,
- NULL);
- }
+ err = kim_string_copy (&io_selection_hints->explanation,
+ explanation);
}
k5_ipc_stream_free_string (explanation);
@@ -678,14 +677,8 @@ kim_error kim_selection_hints_read_from_stream (kim_selection_hints io_selection
err = k5_ipc_stream_read_string (io_stream, &service_identity);
if (!err) {
- if (!service_identity[0]) {
- err = kim_string_copy (&io_selection_hints->service_identity,
- service_identity);
- } else {
- err = kim_selection_hints_set_hint (io_selection_hints,
- kim_hint_key_service_identity,
- NULL);
- }
+ err = kim_string_copy (&io_selection_hints->service_identity,
+ service_identity);
}
k5_ipc_stream_free_string (service_identity);
@@ -696,14 +689,8 @@ kim_error kim_selection_hints_read_from_stream (kim_selection_hints io_selection
err = k5_ipc_stream_read_string (io_stream, &client_realm);
if (!err) {
- if (!client_realm[0]) {
- err = kim_string_copy (&io_selection_hints->client_realm,
- client_realm);
- } else {
- err = kim_selection_hints_set_hint (io_selection_hints,
- kim_hint_key_client_realm,
- NULL);
- }
+ err = kim_string_copy (&io_selection_hints->client_realm,
+ client_realm);
}
k5_ipc_stream_free_string (client_realm);
@@ -714,13 +701,7 @@ kim_error kim_selection_hints_read_from_stream (kim_selection_hints io_selection
err = k5_ipc_stream_read_string (io_stream, &user);
if (!err) {
- if (!user[0]) {
- err = kim_string_copy (&io_selection_hints->user, user);
- } else {
- err = kim_selection_hints_set_hint (io_selection_hints,
- kim_hint_key_user,
- NULL);
- }
+ err = kim_string_copy (&io_selection_hints->user, user);
}
k5_ipc_stream_free_string (user);
@@ -731,14 +712,8 @@ kim_error kim_selection_hints_read_from_stream (kim_selection_hints io_selection
err = k5_ipc_stream_read_string (io_stream, &service_realm);
if (!err) {
- if (!service_realm[0]) {
- err = kim_string_copy (&io_selection_hints->service_realm,
- service_realm);
- } else {
- err = kim_selection_hints_set_hint (io_selection_hints,
- kim_hint_key_service_realm,
- NULL);
- }
+ err = kim_string_copy (&io_selection_hints->service_realm,
+ service_realm);
}
k5_ipc_stream_free_string (service_realm);
@@ -749,13 +724,7 @@ kim_error kim_selection_hints_read_from_stream (kim_selection_hints io_selection
err = k5_ipc_stream_read_string (io_stream, &service);
if (!err) {
- if (!service[0]) {
- err = kim_string_copy (&io_selection_hints->service, service);
- } else {
- err = kim_selection_hints_set_hint (io_selection_hints,
- kim_hint_key_service,
- NULL);
- }
+ err = kim_string_copy (&io_selection_hints->service, service);
}
k5_ipc_stream_free_string (service);
@@ -766,16 +735,10 @@ kim_error kim_selection_hints_read_from_stream (kim_selection_hints io_selection
err = k5_ipc_stream_read_string (io_stream, &server);
if (!err) {
- if (!server[0]) {
- err = kim_string_copy (&io_selection_hints->server, server);
- } else {
- err = kim_selection_hints_set_hint (io_selection_hints,
- kim_hint_key_server,
- NULL);
- }
+ err = kim_string_copy (&io_selection_hints->server, server);
}
- k5_ipc_stream_free_string (server);
+ k5_ipc_stream_free_string (server);
}
return check_error (err);
diff --git a/src/kim/lib/kim_string.c b/src/kim/lib/kim_string.c
index b84a12c8e..8b9af7010 100644
--- a/src/kim/lib/kim_string.c
+++ b/src/kim/lib/kim_string.c
@@ -26,6 +26,8 @@
#include "kim_private.h"
+const char kim_empty_string[1] = "";
+
/* ------------------------------------------------------------------------ */
kim_error kim_string_create_from_format (kim_string *out_string,
@@ -136,12 +138,19 @@ kim_error kim_string_copy (kim_string *out_string,
if (!err && !in_string ) { err = check_error (KIM_NULL_PARAMETER_ERR); }
if (!err) {
- string = calloc (strlen (in_string) + 1, sizeof (char *));
- if (!string) { err = check_error (KIM_OUT_OF_MEMORY_ERR); }
+ if (in_string[0]) {
+ string = calloc (strlen (in_string) + 1, sizeof (char *));
+ if (!string) { err = check_error (KIM_OUT_OF_MEMORY_ERR); }
+
+ if (!err) {
+ strncpy ((char *) string, in_string, strlen (in_string) + 1);
+ }
+ } else {
+ string = kim_empty_string;
+ }
}
if (!err) {
- strncpy ((char *) string, in_string, strlen (in_string) + 1);
*out_string = string;
string = NULL;
}
@@ -167,7 +176,7 @@ kim_error kim_string_compare (kim_string in_string,
void kim_string_free (kim_string *io_string)
{
- if (io_string && *io_string) {
+ if (io_string && *io_string && *io_string != kim_empty_string) {
free ((char *) *io_string);
*io_string = NULL;
}
diff --git a/src/kim/lib/kim_string_private.h b/src/kim/lib/kim_string_private.h
index 48d7bae13..6f4e0ad36 100644
--- a/src/kim/lib/kim_string_private.h
+++ b/src/kim/lib/kim_string_private.h
@@ -29,6 +29,8 @@
#include <kim/kim.h>
+extern const char kim_empty_string[1];
+
/* ------------------------------------------------------------------------ */
static inline kim_count kim_string_buflen (kim_string in_string)