aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--crypto/ui/ui.h13
-rw-r--r--crypto/ui/ui_lib.c12
-rw-r--r--crypto/ui/ui_locl.h1
3 files changed, 26 insertions, 0 deletions
diff --git a/crypto/ui/ui.h b/crypto/ui/ui.h
index 9a03e8a9ec..452d9dcbfc 100644
--- a/crypto/ui/ui.h
+++ b/crypto/ui/ui.h
@@ -129,6 +129,19 @@ int UI_dup_info_string(UI *ui, const char *text);
int UI_add_error_string(UI *ui, const char *text);
int UI_dup_error_string(UI *ui, const char *text);
+/* The following function is used to store a pointer to user-specific data.
+ Any previous such pointer will be returned and replaced.
+
+ For callback purposes, this function makes a lot more sense than using
+ ex_data, since the latter requires that different parts of OpenSSL or
+ applications share the same ex_data index.
+
+ Note that the UI_OpenSSL() method completely ignores the user data.
+ Other methods may not, however. */
+void *UI_add_user_data(UI *ui, void *user_data);
+/* We need a user data retrieving function as well. */
+void *UI_get0_user_data(UI *ui);
+
/* Return the result associated with a prompt given with the index i. */
const char *UI_get0_result(UI *ui, int i);
diff --git a/crypto/ui/ui_lib.c b/crypto/ui/ui_lib.c
index c5d17042f9..f8881dee05 100644
--- a/crypto/ui/ui_lib.c
+++ b/crypto/ui/ui_lib.c
@@ -256,6 +256,18 @@ int UI_dup_error_string(UI *ui, const char *text)
NULL);
}
+void *UI_add_user_data(UI *ui, void *user_data)
+ {
+ void *old_data = ui->user_data;
+ ui->user_data = user_data;
+ return old_data;
+ }
+
+void *UI_get0_user_data(UI *ui)
+ {
+ return ui->user_data;
+ }
+
const char *UI_get0_result(UI *ui, int i)
{
if (i < 0)
diff --git a/crypto/ui/ui_locl.h b/crypto/ui/ui_locl.h
index d5470a6c05..4adf0d821b 100644
--- a/crypto/ui/ui_locl.h
+++ b/crypto/ui/ui_locl.h
@@ -104,6 +104,7 @@ struct ui_st
STACK_OF(UI_STRING) *strings; /* We might want to prompt for more
than one thing at a time, and
with different echoing status. */
+ void *user_data;
CRYPTO_EX_DATA ex_data;
};