Add public function gpgme_io_writen.
authorWerner Koch <wk@gnupg.org>
Thu, 7 Feb 2013 19:51:29 +0000 (20:51 +0100)
committerWerner Koch <wk@gnupg.org>
Thu, 7 Feb 2013 19:51:29 +0000 (20:51 +0100)
* src/gpgme.c (gpgme_io_read): New.
--

This is a writen style variant for gpgme_io_write.  It is often easier
to use this one in passphrase and edit callbacks.

doc/gpgme.texi
src/gpgme.c
src/gpgme.def
src/gpgme.h.in
src/libgpgme.vers

index d074b42..b73f425 100644 (file)
@@ -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
index 86099d6..79895db 100644 (file)
@@ -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
index 56a6428..25cecb9 100644 (file)
 
 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
 
index ce469de..27ef195 100644 (file)
@@ -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.  */
index d59571e..565ec2c 100644 (file)
@@ -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;
 };