summaryrefslogtreecommitdiff
path: root/libsecret/secret-value.c
diff options
context:
space:
mode:
Diffstat (limited to 'libsecret/secret-value.c')
-rw-r--r--libsecret/secret-value.c40
1 files changed, 34 insertions, 6 deletions
diff --git a/libsecret/secret-value.c b/libsecret/secret-value.c
index ca891cb..63464cd 100644
--- a/libsecret/secret-value.c
+++ b/libsecret/secret-value.c
@@ -256,39 +256,67 @@ is_password_value (SecretValue *value)
return FALSE;
}
+/**
+ * secret_value_unref_to_password:
+ * @value: the value
+ * @length: the length of the secret
+ *
+ * Unreference a #SecretValue and steal the secret data in
+ * #SecretValue as nonpageable memory.
+ *
+ * Returns: (transfer full): a new password string stored in nonpageable memory
+ * which must be freed with secret_password_free() when done
+ *
+ * Since: 0.19.0
+ */
gchar *
-_secret_value_unref_to_password (SecretValue *value)
+secret_value_unref_to_password (SecretValue *value,
+ gsize *length)
{
SecretValue *val = value;
gchar *result;
g_return_val_if_fail (value != NULL, NULL);
- if (!is_password_value (value)) {
- secret_value_unref (value);
- return NULL;
- }
-
if (g_atomic_int_dec_and_test (&val->refs)) {
if (val->destroy == egg_secure_free) {
result = val->secret;
+ if (length)
+ *length = val->length;
} else {
result = egg_secure_strndup (val->secret, val->length);
if (val->destroy)
(val->destroy) (val->secret);
+ if (length)
+ *length = val->length;
}
g_free (val->content_type);
g_slice_free (SecretValue, val);
} else {
result = egg_secure_strndup (val->secret, val->length);
+ if (length)
+ *length = val->length;
}
return result;
}
gchar *
+_secret_value_unref_to_password (SecretValue *value)
+{
+ g_return_val_if_fail (value != NULL, NULL);
+
+ if (!is_password_value (value)) {
+ secret_value_unref (value);
+ return NULL;
+ }
+
+ return secret_value_unref_to_password (value, NULL);
+}
+
+gchar *
_secret_value_unref_to_string (SecretValue *value)
{
SecretValue *val = value;