aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--doc/gpgme.texi7
-rw-r--r--src/gpgme.c24
-rw-r--r--src/gpgme.def247
-rw-r--r--src/gpgme.h.in1
-rw-r--r--src/libgpgme.vers8
5 files changed, 158 insertions, 129 deletions
diff --git a/doc/gpgme.texi b/doc/gpgme.texi
index d074b429..b73f425c 100644
--- a/doc/gpgme.texi
+++ b/doc/gpgme.texi
@@ -2374,9 +2374,10 @@ previous attempts failed, then @var{prev_was_bad} is 1, otherwise it
will be 0.
The user must write the passphrase, followed by a newline character,
-to the file descriptor @var{fd}. If the user returns 0 indicating
-success, the user must at least write a newline character before
-returning from the callback.
+to the file descriptor @var{fd}. The function @code{gpgme_io_writen}
+should be used for the write operation. Note that if the user returns
+0 to indicate success, the user must at least write a newline
+character before returning from the callback.
If an error occurs, return the corresponding @code{gpgme_error_t}
value. You can use the error code @code{GPG_ERR_CANCELED} to abort
diff --git a/src/gpgme.c b/src/gpgme.c
index 86099d60..79895db2 100644
--- a/src/gpgme.c
+++ b/src/gpgme.c
@@ -634,6 +634,30 @@ gpgme_io_write (int fd, const void *buffer, size_t count)
return TRACE_SYSRES (ret);
}
+/* This function provides access to the internal write function. It
+ is to be used by user callbacks to return data to gpgme. See
+ gpgme_passphrase_cb_t and gpgme_edit_cb_t. Note that this is a
+ variant of gpgme_io_write which guarantees that all COUNT bytes are
+ written or an error is return. Returns: 0 on success or -1 on
+ error and the sets errno. */
+int
+gpgme_io_writen (int fd, const void *buffer, size_t count)
+{
+ int ret = 0;
+ TRACE_BEG2 (DEBUG_GLOBAL, "gpgme_io_writen", fd,
+ "buffer=%p, count=%u", buffer, count);
+ while (count)
+ {
+ ret = _gpgme_io_write (fd, buffer, count);
+ if (ret < 0)
+ break;
+ buffer += ret;
+ count -= ret;
+ ret = 0;
+ }
+ return TRACE_SYSRES (ret);
+}
+
/* This function returns the callback function for I/O. */
void
diff --git a/src/gpgme.def b/src/gpgme.def
index 56a64280..25cecb98 100644
--- a/src/gpgme.def
+++ b/src/gpgme.def
@@ -20,128 +20,128 @@
EXPORTS
gpgme_check_version @1
- gpgme_get_engine_info @2
- gpgme_engine_check_version @3
-
- gpgme_err_code_from_errno @4
- gpgme_err_code_to_errno @5
- gpgme_err_make_from_errno @6
- gpgme_error_from_errno @7
- gpgme_strerror @8
- gpgme_strerror_r @9
- gpgme_strsource @10
-
- gpgme_data_get_encoding @11
- gpgme_data_new @12
- gpgme_data_new_from_cbs @13
- gpgme_data_new_from_fd @14
- gpgme_data_new_from_file @15
- gpgme_data_new_from_filepart @16
- gpgme_data_new_from_mem @17
- gpgme_data_new_from_stream @18
- gpgme_data_read @19
- gpgme_data_release @20
- gpgme_data_release_and_get_mem @21
- gpgme_data_seek @22
- gpgme_data_set_encoding @23
- gpgme_data_write @24
-
- gpgme_get_protocol_name @25
- gpgme_hash_algo_name @26
- gpgme_pubkey_algo_name @27
-
- gpgme_new @28
- gpgme_get_armor @29
- gpgme_get_include_certs @30
- gpgme_get_io_cbs @31
- gpgme_get_keylist_mode @32
- gpgme_get_passphrase_cb @33
- gpgme_get_progress_cb @34
- gpgme_get_protocol @35
- gpgme_get_textmode @36
- gpgme_release @37
- gpgme_set_armor @38
- gpgme_set_include_certs @39
- gpgme_set_io_cbs @40
- gpgme_set_keylist_mode @41
- gpgme_set_locale @42
- gpgme_set_passphrase_cb @43
- gpgme_set_progress_cb @44
- gpgme_set_protocol @45
- gpgme_set_textmode @46
- gpgme_signers_add @47
- gpgme_signers_clear @48
- gpgme_signers_enum @49
-
- gpgme_key_ref @50
- gpgme_key_unref @51
- gpgme_key_release @52
-
- gpgme_trust_item_ref @53
- gpgme_trust_item_unref @54
-
- gpgme_cancel @55
- gpgme_op_card_edit @56
- gpgme_op_card_edit_start @57
- gpgme_op_decrypt @58
- gpgme_op_decrypt_result @59
- gpgme_op_decrypt_start @60
- gpgme_op_decrypt_verify @61
- gpgme_op_decrypt_verify_start @62
- gpgme_op_delete @63
- gpgme_op_delete_start @64
- gpgme_op_edit @65
- gpgme_op_edit_start @66
- gpgme_op_encrypt @67
- gpgme_op_encrypt_result @68
- gpgme_op_encrypt_sign @69
- gpgme_op_encrypt_sign_start @70
- gpgme_op_encrypt_start @71
- gpgme_op_export @72
- gpgme_op_export_ext @73
- gpgme_op_export_ext_start @74
- gpgme_op_export_start @75
- gpgme_op_genkey @76
- gpgme_op_genkey_result @77
- gpgme_op_genkey_start @78
- gpgme_get_key @79
- gpgme_op_import @80
- gpgme_op_import_result @81
- gpgme_op_import_start @82
- gpgme_op_keylist_end @83
- gpgme_op_keylist_ext_start @84
- gpgme_op_keylist_next @85
- gpgme_op_keylist_result @86
- gpgme_op_keylist_start @87
- gpgme_op_sign @88
- gpgme_op_sign_result @89
- gpgme_op_sign_start @90
- gpgme_op_trustlist_end @91
- gpgme_op_trustlist_next @92
- gpgme_op_trustlist_start @93
- gpgme_op_verify @94
- gpgme_op_verify_result @95
- gpgme_op_verify_start @96
- gpgme_wait @97
-
- gpgme_data_new_with_read_cb @98
- gpgme_data_rewind @99
- gpgme_get_sig_status @100
- gpgme_get_sig_string_attr @101
- gpgme_get_sig_ulong_attr @102
- gpgme_get_sig_key @103
- gpgme_key_get_string_attr @104
- gpgme_key_get_ulong_attr @105
- gpgme_key_sig_get_string_attr @106
- gpgme_key_sig_get_ulong_attr @107
- gpgme_op_import_ext @108
- gpgme_trust_item_get_int_attr @109
- gpgme_trust_item_get_string_attr @110
- gpgme_trust_item_release @111
-
- gpgme_set_engine_info @112
-
- gpgme_ctx_get_engine_info @113
+ gpgme_get_engine_info @2
+ gpgme_engine_check_version @3
+
+ gpgme_err_code_from_errno @4
+ gpgme_err_code_to_errno @5
+ gpgme_err_make_from_errno @6
+ gpgme_error_from_errno @7
+ gpgme_strerror @8
+ gpgme_strerror_r @9
+ gpgme_strsource @10
+
+ gpgme_data_get_encoding @11
+ gpgme_data_new @12
+ gpgme_data_new_from_cbs @13
+ gpgme_data_new_from_fd @14
+ gpgme_data_new_from_file @15
+ gpgme_data_new_from_filepart @16
+ gpgme_data_new_from_mem @17
+ gpgme_data_new_from_stream @18
+ gpgme_data_read @19
+ gpgme_data_release @20
+ gpgme_data_release_and_get_mem @21
+ gpgme_data_seek @22
+ gpgme_data_set_encoding @23
+ gpgme_data_write @24
+
+ gpgme_get_protocol_name @25
+ gpgme_hash_algo_name @26
+ gpgme_pubkey_algo_name @27
+
+ gpgme_new @28
+ gpgme_get_armor @29
+ gpgme_get_include_certs @30
+ gpgme_get_io_cbs @31
+ gpgme_get_keylist_mode @32
+ gpgme_get_passphrase_cb @33
+ gpgme_get_progress_cb @34
+ gpgme_get_protocol @35
+ gpgme_get_textmode @36
+ gpgme_release @37
+ gpgme_set_armor @38
+ gpgme_set_include_certs @39
+ gpgme_set_io_cbs @40
+ gpgme_set_keylist_mode @41
+ gpgme_set_locale @42
+ gpgme_set_passphrase_cb @43
+ gpgme_set_progress_cb @44
+ gpgme_set_protocol @45
+ gpgme_set_textmode @46
+ gpgme_signers_add @47
+ gpgme_signers_clear @48
+ gpgme_signers_enum @49
+
+ gpgme_key_ref @50
+ gpgme_key_unref @51
+ gpgme_key_release @52
+
+ gpgme_trust_item_ref @53
+ gpgme_trust_item_unref @54
+
+ gpgme_cancel @55
+ gpgme_op_card_edit @56
+ gpgme_op_card_edit_start @57
+ gpgme_op_decrypt @58
+ gpgme_op_decrypt_result @59
+ gpgme_op_decrypt_start @60
+ gpgme_op_decrypt_verify @61
+ gpgme_op_decrypt_verify_start @62
+ gpgme_op_delete @63
+ gpgme_op_delete_start @64
+ gpgme_op_edit @65
+ gpgme_op_edit_start @66
+ gpgme_op_encrypt @67
+ gpgme_op_encrypt_result @68
+ gpgme_op_encrypt_sign @69
+ gpgme_op_encrypt_sign_start @70
+ gpgme_op_encrypt_start @71
+ gpgme_op_export @72
+ gpgme_op_export_ext @73
+ gpgme_op_export_ext_start @74
+ gpgme_op_export_start @75
+ gpgme_op_genkey @76
+ gpgme_op_genkey_result @77
+ gpgme_op_genkey_start @78
+ gpgme_get_key @79
+ gpgme_op_import @80
+ gpgme_op_import_result @81
+ gpgme_op_import_start @82
+ gpgme_op_keylist_end @83
+ gpgme_op_keylist_ext_start @84
+ gpgme_op_keylist_next @85
+ gpgme_op_keylist_result @86
+ gpgme_op_keylist_start @87
+ gpgme_op_sign @88
+ gpgme_op_sign_result @89
+ gpgme_op_sign_start @90
+ gpgme_op_trustlist_end @91
+ gpgme_op_trustlist_next @92
+ gpgme_op_trustlist_start @93
+ gpgme_op_verify @94
+ gpgme_op_verify_result @95
+ gpgme_op_verify_start @96
+ gpgme_wait @97
+
+ gpgme_data_new_with_read_cb @98
+ gpgme_data_rewind @99
+ gpgme_get_sig_status @100
+ gpgme_get_sig_string_attr @101
+ gpgme_get_sig_ulong_attr @102
+ gpgme_get_sig_key @103
+ gpgme_key_get_string_attr @104
+ gpgme_key_get_ulong_attr @105
+ gpgme_key_sig_get_string_attr @106
+ gpgme_key_sig_get_ulong_attr @107
+ gpgme_op_import_ext @108
+ gpgme_trust_item_get_int_attr @109
+ gpgme_trust_item_get_string_attr @110
+ gpgme_trust_item_release @111
+
+ gpgme_set_engine_info @112
+
+ gpgme_ctx_get_engine_info @113
gpgme_ctx_set_engine_info @114
gpgme_data_set_file_name @115
@@ -173,7 +173,7 @@ EXPORTS
gpgme_op_assuan_transact @134
gpgme_check_version_internal @135
-
+
gpgme_io_read @136
gpgme_io_write @137
@@ -204,5 +204,6 @@ EXPORTS
gpgme_set_global_flag @156
+ gpgme_io_writen @157
; END
diff --git a/src/gpgme.h.in b/src/gpgme.h.in
index ce469dee..27ef195b 100644
--- a/src/gpgme.h.in
+++ b/src/gpgme.h.in
@@ -1022,6 +1022,7 @@ void gpgme_get_io_cbs (gpgme_ctx_t ctx, gpgme_io_cbs_t io_cbs);
gpgme_passphrase_cb_t and gpgme_edit_cb_t. */
ssize_t gpgme_io_read (int fd, void *buffer, size_t count);
ssize_t gpgme_io_write (int fd, const void *buffer, size_t count);
+int gpgme_io_writen (int fd, const void *buffer, size_t count);
/* Process the pending operation and, if HANG is non-zero, wait for
the pending operation to finish. */
diff --git a/src/libgpgme.vers b/src/libgpgme.vers
index d59571e1..565ec2cc 100644
--- a/src/libgpgme.vers
+++ b/src/libgpgme.vers
@@ -48,9 +48,9 @@ GPGME_1.1 {
gpgme_cancel_async;
- gpgme_op_assuan_result;
- gpgme_op_assuan_transact;
- gpgme_op_assuan_transact_start;
+ gpgme_op_assuan_result;
+ gpgme_op_assuan_transact;
+ gpgme_op_assuan_transact_start;
gpgme_check_version_internal;
@@ -81,6 +81,8 @@ GPGME_1.1 {
gpgme_op_passwd;
gpgme_set_global_flag;
+
+ gpgme_io_writen;
};