summaryrefslogtreecommitdiff
path: root/libarchive/archive_write_set_passphrase.c
diff options
context:
space:
mode:
authorMichihiro NAKAJIMA <ggcueroad@gmail.com>2014-09-21 15:00:45 +0900
committerMichihiro NAKAJIMA <ggcueroad@gmail.com>2014-09-21 15:00:45 +0900
commit96c38181092faa7b76773f00bb3260f87d9ffc0d (patch)
tree28e5a711eb37f9988b58719382ddefdde933eaa9 /libarchive/archive_write_set_passphrase.c
parentd42fdee258ac887f5561c9ab7e867f81b714ca37 (diff)
downloadlibarchive-96c38181092faa7b76773f00bb3260f87d9ffc0d.tar.gz
Add a new API, archive_write_set_passphrase_callback, for encryption.
Diffstat (limited to 'libarchive/archive_write_set_passphrase.c')
-rw-r--r--libarchive/archive_write_set_passphrase.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/libarchive/archive_write_set_passphrase.c b/libarchive/archive_write_set_passphrase.c
index 92f59898..710ecba5 100644
--- a/libarchive/archive_write_set_passphrase.c
+++ b/libarchive/archive_write_set_passphrase.c
@@ -54,9 +54,42 @@ archive_write_set_passphrase(struct archive *_a, const char *p)
return (ARCHIVE_OK);
}
+
+int
+archive_write_set_passphrase_callback(struct archive *_a, void *client_data,
+ archive_passphrase_callback *cb)
+{
+ struct archive_write *a = (struct archive_write *)_a;
+
+ archive_check_magic(_a, ARCHIVE_WRITE_MAGIC, ARCHIVE_STATE_NEW,
+ "archive_write_set_passphrase_callback");
+
+ a->passphrase_callback = cb;
+ a->passphrase_client_data = client_data;
+ return (ARCHIVE_OK);
+}
+
+
const char *
__archive_write_get_passphrase(struct archive_write *a)
{
- return (a->passphrase);
+ if (a->passphrase != NULL)
+ return (a->passphrase);
+
+ if (a->passphrase_callback != NULL) {
+ const char *p;
+ p = a->passphrase_callback(&a->archive,
+ a->passphrase_client_data);
+ if (p != NULL) {
+ a->passphrase = strdup(p);
+ if (a->passphrase == NULL) {
+ archive_set_error(&a->archive, ENOMEM,
+ "Can't allocate data for passphrase");
+ return (NULL);
+ }
+ return (a->passphrase);
+ }
+ }
+ return (NULL);
}