diff options
author | Michihiro NAKAJIMA <ggcueroad@gmail.com> | 2014-09-21 15:00:45 +0900 |
---|---|---|
committer | Michihiro NAKAJIMA <ggcueroad@gmail.com> | 2014-09-21 15:00:45 +0900 |
commit | 96c38181092faa7b76773f00bb3260f87d9ffc0d (patch) | |
tree | 28e5a711eb37f9988b58719382ddefdde933eaa9 /libarchive/archive_write_set_passphrase.c | |
parent | d42fdee258ac887f5561c9ab7e867f81b714ca37 (diff) | |
download | libarchive-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.c | 35 |
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); } |