A good use of the UI interface is as a password callback replacement
authorRichard Levitte <levitte@openssl.org>
Tue, 5 Jun 2001 19:05:52 +0000 (19:05 +0000)
committerRichard Levitte <levitte@openssl.org>
Tue, 5 Jun 2001 19:05:52 +0000 (19:05 +0000)
(for new functions...).  One might still want to be able to pass down
a user-data pointer to be used by the UI.  However, ex_data doesn't
quite cut it, since that means the appropriate index to it might need
to be shared between parts that aren't really related in that sense,
and would require the currently hidden (static) index holders to be
uncovered.  Not a good thing.  Therefore, add the possibility to add a
user-data pointer to a UI.

crypto/ui/ui.h
crypto/ui/ui_lib.c
crypto/ui/ui_locl.h

index 9a03e8a9ec7faad69397645f47ff817cc337e233..452d9dcbfce218cecdf4e896145ba68938092f53 100644 (file)
@@ -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);
 
index c5d17042f9f9f3faebc8f8cfb7bd730a25c9c70f..f8881dee05259c1fd19caf7040bc44c787456594 100644 (file)
@@ -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)
index d5470a6c0570b51d5b8c7be1753cd4767f65ef7b..4adf0d821ba3f3843b5d675bbc9dae7d9005daf5 100644 (file)
@@ -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;
        };