* verify.c (gpgme_op_verify): Make sure that we never access an
[gpgme.git] / gpgme / ChangeLog
1 2002-06-13  Werner Koch  <wk@gnupg.org>
2
3         * verify.c (gpgme_op_verify): Make sure that we never access an
4         unitialized result structure.
5
6 2002-06-12  Werner Koch  <wk@gnupg.org>
7
8         * keylist.c (struct keylist_result_s): New.
9         (_gpgme_release_keylist_result): Release it here 
10         (keylist_status_handler): Handle truncated.
11         (append_xml_keylistinfo): New.
12         * gpgme.c (_gpgme_release_result): and use it here.
13         * types.h: Declare the new type here.
14         * context.h (struct gpgme_context_s): Use it here.
15
16 2002-06-11  Marcus Brinkmann  <marcus@g10code.de>
17
18         * engine-gpgsm.c (_gpgme_gpgsm_release): Close status_cb.fd.
19         (_gpgme_gpgsm_new): Duplicate status file descriptor, so we can
20         use our own close notification mechanism without interfering with
21         assuan.
22
23 2002-06-11  Werner Koch  <wk@gnupg.org>
24
25         * gpgme.h: Add GPGME_ATTR_SIG_SUMMARY and the GPGME_SIGSUM_
26         constants.
27         * verify.c (calc_sig_summary): New.
28         (gpgme_get_sig_ulong_attr): And use it here.
29
30 2002-06-10  Werner Koch  <wk@gnupg.org>
31
32         * rungpg.h: Add new status codes TRUNCATED and ERROR.
33         * verify.c (is_token, copy_token): New.
34         (_gpgme_verify_status_handler): Use copy_token, handle the new
35         ERROR status and store the errorcode used withgpgsm and trust
36         status codes.
37         * gpgme.h: New attribute ERRTOK.
38         * key.c (gpgme_key_get_string_attr): Add dummy case for it.
39         (gpgme_get_sig_string_attr): Use it here to return the last error.
40
41 2002-06-10  Marcus Brinkmann  <marcus@g10code.de>
42
43         * engine-gpgsm.c (_gpgme_gpgsm_start): Move the code that sets the
44         close notification for the status fd to ...
45         (_gpgme_gpgsm_new): ... here.
46         * wait.h: Include "sema.h".  Remove prototypes of
47         _gpgme_remove_proc_from_wait_queue and
48         _gpgme_register_pipe_handler.  Add prototypes of
49         _gpgme_fd_table_init, _gpgme_fd_table_deinit, _gpgme_fd_table_put,
50         _gpgme_add_io_cb, _gpgme_remove_io_cb, _gpgme_wait_event_cb and
51         _gpgme_wait_one..
52         * wait.c: Remove global variables PROC_QUEUE, PROC_QUEUE_LOCK,
53         FD_TABLE_SIZE, FD_TABLE, FD_TABLE_LOCK.  New global variables
54         FDT_GLOBAL, CTX_DONE_LIST, CTX_DONE_LIST_SIZE,
55         CTX_DONE_LIST_LENGTH and CTX_DONE_LIST_LOCK.  Remove struct
56         proc_s.  Replace struct wait_item_s.
57         (_gpgme_fd_table_init): New function.
58         (_gpgme_fd_table_deinit): Likewise.
59         (_gpgme_fd_table_put): Likewise.
60         (set_process_done): Remove function.
61         (do_select): Take argument FDT.  Use that to decide which fds to
62         select on.
63         (_gpgme_remove_proc_from_wait_queue): Remove function.
64         (_gpgme_wait_event_cb): New function.
65         (_gpgme_wait_one): Likewise.
66         (_gpgme_register_pipe_hanldler): Remove function.
67         (_gpgme_add_io_cb): New function.
68         (_gpgme_remove_io_cb): Likewise.
69         (_gpgme_freeze_fd): Remove function.
70         (_gpgme_thaw_fd): Remove function.
71         * rungpg.c (struct fd_data_map_s): Add new member TAG.
72         (struct gpg_object_s): Likewise for STATUS and COLON.  Add member
73         IDX to CMD.  Add new member IO_CBS.
74         (close_notify_handler): New variables POSSIBLY_DONE and NOT_DONE.
75         For each I/O callback, check if it should be unregistered.  If all
76         callbacks have been unregistered, trigger GPGME_EVENT_DONE.
77         Remove member RUNNING.
78         (_gpgme_gpg_new): Initialize new members.
79         (_gpgme_gpg_release): Check PID not RUNNING.  Don't call
80         _gpgme_remove_proc_from_wait_queue.  Close GPG->CMD.FD if set.
81         (build_argv): Store away the index instead the file descriptor for
82         CMD.
83         (_gpgme_gpg_add_io_cb): New function.
84         (_gpgme_gpg_spawn): Use _gpgme_gpg_add_io_cb to register IO
85         callbacks.
86         (gpg_status_handler): Change return type to void, remove PID
87         argument, close filedescriptor if EOF or error occurs.
88         (read_status): Use _gpgme_gpg_add_io_cb instead _gpgme_thaw_fd.
89         Use IO_CBS->remove instead _gpgme_freeze_fd.
90         (gpg_colon_line_handler): Change return type to void, remove PID
91         argument, close filedescriptor if EOF or error occurs.
92         (command_cb): Use IO_CBS->remove instead _gpgme_freeze_fd.
93         (_gpgme_gpg_set_io_cbs): New function.
94         * rungpg.h (_gpgme_gpg_set_io_cbs): Prototype for
95         _gpgme_gpg_set_io_cbs.
96         * gpgme.h (GpgmeIOCb): New type.
97         (GpgmeRegisterIOCb): Likewise.
98         (GpgmeRemoveIOCb): Likewise.
99         (GpgmeEventIO): Likewise.
100         (GpgmeEventIOCb): Likewise.
101         (struct GpgmeIOCbs): New structure to hold I/O callbacks.
102         (gpgme_set_op_io_cbs): New prototype.
103         (gpgme_get_op_io_cbs): Likewise.
104         * ops.h: New prototype for _gpgme_op_event_cb.  Remove prototypes
105         for _gpgme_freeze_fd and _gpgme_thaw_fd.  Remove PID argument from
106         _gpgme_data_inbound_handler and _gpgme_data_outbound_handler
107         prototype.  Add prototype for _gpgme_op_reset.
108         Add synchronous argument to _gpgme_decrypt_start prototype.
109         * io.h: Beautification.
110         * gpgme.c: Include "wait.h".
111         (gpgme_new): Initialize FDT.
112         (gpgme_set_io_cbs): New function.
113         (gpgme_get_io_cbs): Likewise.
114         (_gpgme_op_event_cb): Likewise.
115         * data.c (_gpgme_data_inbound_handler): Change return type to
116         void.  Drop PID argument.  Close FD on error and EOF.
117         (write_mem_data): Don't close FD here ...
118         (write_cb_data): ... or here ...
119         (_gpgme_data_outbound_handler): ... but here.  Change return type
120         to void.  Drop PID argument.
121         * context.h: Include "wait.h".
122         (struct gpgme_context_s): New members FDT and IO_CBS.
123         * op-support.c: New file.
124         * Makefile.am (libgpgme_la_SOURCES): Add op-support.c.
125         * ops.h: Add prototype for _gpgme_op_reset().
126         * decrypt.c (_gpgme_decrypt_start): New argument SYNCHRONOUS.  Use
127         _gpgme_op_reset.
128         (gpgme_op_decrypt_start): Add synchronous argument.
129         (gpgme_op_decrypt): Likewise.  Use _gpgme_wait_one instead
130         gpgme_wait.
131         * delete.c (gpgme_op_delete_start): Rename to ...
132         (_gpgme_op_delete_start): ... this.  New argument SYNCHRONOUS.
133         Use _gpgme_op_reset.  Make function static.
134         (gpgme_op_delete_start): Just a wrapper around
135         _gpgme_op_delete_start now.
136         (gpgme_op_delete): Add synchronous argument.  Use _gpgme_wait_one
137         instead gpgme_wait.
138         * encrypt.c: Include "wait.h".
139         (ggpgme_op_encrypt_start): Rename to ...
140         (_gpgme_op_encrypt_start): ... this.  New argument SYNCHRONOUS.
141         Use _gpgme_op_reset.  Make function static.
142         (gpgme_op_encrypt_start): Just a wrapper around
143         _gpgme_op_encrypt_start now.
144         (gpgme_op_encrypt): Add synchronous argument.  Use _gpgme_wait_one
145         instead gpgme_wait.
146         * encrypt_sign.c (gpgme_op_encrypt_sign_start): Rename to ...
147         (_gpgme_op_encrypt_sign_start): ... this.  New argument
148         SYNCHRONOUS.  Use _gpgme_op_reset.  Make function static.
149         (gpgme_op_encrypt_sign_start): Just a wrapper around
150         _gpgme_op_encrypt_sign_start now.
151         (gpgme_op_encrypt_sign): Add synchronous argument.  Use
152         _gpgme_wait_one instead gpgme_wait.
153         * export.c (gpgme_op_export_start): Rename to ...
154         (_gpgme_op_export_start): ... this.  New argument SYNCHRONOUS.
155         Use _gpgme_op_reset.  Make function static.
156         (gpgme_op_export_start): Just a wrapper around
157         _gpgme_op_export_start now.
158         (gpgme_op_export): Add synchronous argument.  Use _gpgme_wait_one
159         instead gpgme_wait.
160         * genkey.c (gpgme_op_genkey_start): Rename to ...
161         (_gpgme_op_genkey_start): ... this.  New argument SYNCHRONOUS.
162         Use _gpgme_op_reset.  Make function static.
163         (gpgme_op_genkey_start): Just a wrapper around
164         _gpgme_op_genkey_start now.
165         (gpgme_op_genkey): Add synchronous argument.  Use _gpgme_wait_one
166         instead gpgme_wait.
167         * import.c (gpgme_op_import_start): Rename to ...
168         (_gpgme_op_import_start): ... this.  New argument SYNCHRONOUS.
169         Use _gpgme_op_reset.  Make function static.
170         (gpgme_op_import_start): Just a wrapper around
171         _gpgme_op_import_start now.
172         (gpgme_op_import): Add synchronous argument.  Use _gpgme_wait_one
173         instead gpgme_wait.
174         * keylist.c (gpgme_op_keylist_start): Use _gpgme_op_reset.
175         (gpgme_op_keylist_ext_start): Likewise.
176         * sign.c (gpgme_op_sign_start): Rename to ...
177         (_gpgme_op_sign_start): ... this.  New argument SYNCHRONOUS.  Use
178         _gpgme_op_reset.  Make function static.
179         (gpgme_op_sign_start): Just a wrapper around _gpgme_op_sign_start
180         now.
181         (gpgme_op_sign): Add synchronous argument.  Use _gpgme_wait_one
182         instead gpgme_wait.
183         * trustlist.c (gpgme_op_trustlist_start): Use _gpgme_op_reset.
184         * verify.c (gpgme_op_verify_start): Rename to ...
185         (_gpgme_op_verify_start): ... this.  New argument SYNCHRONOUS.
186         Use _gpgme_op_reset.  Make function static.
187         (gpgme_op_verify_start): Just a wrapper around
188         _gpgme_op_verify_start now.
189         (gpgme_op_verify): Add synchronous argument.  Use _gpgme_wait_one
190         instead gpgme_wait.
191         * engine-gpgsm.c (iocb_data_t): New type.
192         (struct gpgsm_object_s): New member status_cb.  Replace input_fd
193         and input_data with input_cb.  Replace output_fd and output_data
194         with output_cb.  Replace message_fd and message_data with
195         message_cb.  New member io_cbs.
196         (_gpgme_gpgsm_new): Initialize all new members (and drop the old
197         ones).
198         (close_notify_handler): New variable POSSIBLY_DONE.  For each I/O
199         callback, check if it should be unregistered.  If all callbacks
200         have been unregistered, trigger GPGME_EVENT_DONE.
201         (_gpgme_gpgsm_release): Remove variable PID.  Use new variable
202         names to close the file descriptors.
203         (_gpgme_gpgsm_op_decrypt): Use new variable names,
204         (_gpgme_gpgsm_op_encrypt): Likewise.
205         (_gpgme_gpgsm_op_genkey): Likewise.
206         (_gpgme_gpgsm_op_import): Likewise.
207         (_gpgme_gpgsm_op_keylist): Likewise.
208         (_gpgme_gpgsm_op_keylist_ext): Likewise.
209         (_gpgme_gpgsm_op_sign): Likewise.
210         (_gpgme_gpgsm_op_verify): Likewise.
211         (gpgsm_status_handler): Drop argument PID.  Change return type to
212         void.  Close status pipe before returning because of EOF or error.
213         (_gpgme_gpgsm_add_io_cb): New function.
214         (_gpgme_gpgsm_start): Use _gpgme_gpgsm_add_io_cb to register
215         callback function.
216         (_gpgme_gpgsm_set_io_cbs): New function.
217         * engine-gpgsm.h: New prototype for _gpgme_gpgsm_set_io_cbs.
218         * engine.c (_gpgme_engine_set_io_cbs): New function.
219         * engine.h: New prototype for _gpgme_engine_set_io_cbs.
220
221 2002-06-04  Marcus Brinkmann  <marcus@g10code.de>
222
223         * Makefile.am (libgpgme_la_SOURCES): Remove mutex.h.
224
225 2002-06-03  Marcus Brinkmann  <marcus@g10code.de>
226
227         * key.c: Include <ctype.h>.
228         (_gpgme_key_append_name): Skip one more char when
229         processing escaped char.  Submitted by Marc Mutz <mutz@kde.org>.
230         Handle hexadecimal encodings.  Also reported by Marc.  Thanks!
231
232 2002-06-02  Marcus Brinkmann  <marcus@g10code.de>
233
234         * ath.h: Enable the _gpgme_ prefix.  Fix all those prefix macros.
235         * posix-sema.c: Use that prefix here.
236         * posix-io.c: Include "ath.h".
237         (_gpgme_io_read): Use _gpgme_ath_read instead read.
238         (_gpgme_io_write): Use _gpgme_ath_write instead write.
239         (_gpgme_io_waitpid): Use _gpgme_ath_waitpid instead waitpid.
240         (_gpgme_io_select): Use _gpgme_ath_select instead select.
241
242 2002-06-02  Marcus Brinkmann  <marcus@g10code.de>
243
244         * Makefile.am (ath_components): New variable.
245         (ath_components_pthread): Likewise.
246         (ath_components_pth): Likewise.
247         (system_components): Add ath_componentes.
248
249         * ath.h: New file.
250         * ath.c: Likewise.
251         * ath-pthread.c: Likewise.
252         * ath-pth.c: Likewise.
253         * posix-sema.c (_gpgme_sema_cs_enter): Rework to use the ATH
254         interface.
255         * mutex.h: Remove file.
256
257 2002-05-30  Werner Koch  <wk@gnupg.org>
258
259         * key.c (gpgme_key_get_string_attr): Return NULL when asking for
260         an issuer with IDX > 0.  We don't support altIssuerNames for now.
261
262 2002-05-22  Werner Koch  <wk@gnupg.org>
263
264         * engine-gpgsm.c (_gpgme_gpgsm_op_keylist_ext): Aehmm, added
265         missing variable definition.  Oohh - Marcus was faster.
266
267 2002-05-22  Marcus Brinkmann  <marcus@gnu.org>
268
269         * engine-gpgsm.c (_gpgme_gpgsm_op_keylist_ext): Fix last change.
270
271 2002-05-21  Werner Koch  <wk@gnupg.org>
272
273         * engine-gpgsm.c (_gpgme_gpgsm_op_keylist)
274         (_gpgme_gpgsm_op_keylist_ext):  Pass the keylist mode to gpgsm.
275
276 2002-05-10  Werner Koch  <wk@gnupg.org>
277
278         * key.h (gpgme_key_s): Add OTRUST.
279         * keylist.c (set_ownertrust): New.
280         (keylist_colon_handler): Get the ownertrust value
281         * key.c (gpgme_key_get_string_attr,gpgme_key_get_ulong_attr):
282         Return that value.
283
284 2002-05-08  Marcus Brinkmann  <marcus@g10code.de>
285
286         * w32-util.c: New static variable GET_PATH_LOCK.
287         (_gpgme_get_gpg_path): Remove superfluous NULL initializer.
288         Take lock while determining path.
289         (_gpgme_get_gpgsm_path): Likewise.
290         * version.c (do_subsystem_inits): Set DONE to 1 after
291         initialization.
292         (gpgme_get_engine_info): New variable ENGINE_INFO_LOCK.  Take lock
293         while determining engine info.
294         * rungpg.c (_gpgme_gpg_get_version): New variable
295         GPG_VERSION_LOCK.  Take the lock while determining the program
296         version.
297         * posix-io.c: Include "sema.h".
298         (_gpgme_io_spawn): New variable FIXED_SIGNALS_LOCK.  Take the lock
299         while fixing the signals.
300         (_gpgme_io_select): Make READFDS and WRITEFDS non-static.
301         * key.c: Include "sema.h".  New globals KEY_CACHE_LOCK and
302         KEY_REF_LOCK.
303         (capabilities_to_string): Make STRINGS very const.
304         (_gpgme_key_cache_add): Lock the key cache.
305         (_gpgme_key_cache_get): Likewise.
306         (gpgme_key_ref, gpgme_key_release): Lock the key_ref_lock.
307         * import.c (append_xml_impinfo): Make IMPORTED_FIELDS and
308         IMPORT_RES_FIELDS very const.  Make FIELD and FIELD_NAME a litle
309         const.
310         * engine.c (_gpgme_engine_get_info): New variable
311         ENGINE_INFO_LOCK.  Take lock while determining engine info.
312         * engine-gpgsm.c: Include "sema.h".
313         (_gpgme_gpgsm_get_version): New variable GPGSM_VERSION_LOCK.  Take
314         lock while getting program version.
315
316 2002-05-08  Marcus Brinkmann  <marcus@g10code.de>
317
318         * debug.h: New file.
319         * Makefile.am (libgpgme_la_SOURCES): Add debug.h.
320         * util.h: Removed all prototypes and declarations related to
321         debugging.  Include "debug.h".
322
323         * debug.c (debug_level): Comment variable and remove superfluous
324         zero initializer.
325         (errfp): Likewise.
326         (_gpgme_debug_enabled): Function removed.
327         (struct debug_control_s): Definition removed.
328         (_gpgme_debug_level): Function removed.
329         (_gpgme_debug_begin): Rewritten to use vasprintf.  Accept a
330         pritnf-style format specification and a variable number of
331         arguments.
332         (_gpgme_debug_add): Rewritten using vasprintf.  Expect that format
333         starts out with "%s" for simplicity.
334         (_gpgme_debug_end): Rewritten using vasprintf.  Do not accept a
335         TEXT argument anymore.
336
337         * posix-io.c (_gpgme_io_select): Use new level argument for
338         DEBUG_BEGIN instead explicit if construct.
339
340         * debug.c (debug_init): Remove superfluous zero initializer,
341         remove volatile flag of INITIALIZED.  Do not use the
342         double-checked locking algorithm, it is fundamentally flawed and
343         will empty your fridge (on a more serious note, despite the
344         volatile flag it doesn't give you the guarantee you would expect,
345         for example on a DEC Alpha or an SMP machine.  The volatile only
346         serializes accesses to the volatile variable, but not to the other
347         variables).
348
349 2002-05-03  Werner Koch  <wk@gnupg.org>
350
351         * engine-gpgsm.c (_gpgme_gpgsm_new): Redirect any gpgsm error
352         output to /dev/null.
353
354         * verify.c (gpgme_get_sig_key): Set the protocol of the listctx.
355         * gpgme.c (gpgme_get_protocol): New.
356
357         * data.c (gpgme_data_write): Changed type of BUFFER to void*.
358         (gpgme_data_read): Ditto.
359
360         * verify.c (_gpgme_verify_status_handler): Handle TRUST_* status
361         lines so that a claim can be made without looking up the key.
362         (gpgme_get_sig_string_attr): New. 
363         (gpgme_get_sig_ulong_attr): New.
364
365         * gpgme.h (GpgmeAttr): Added GPGME_ATTR_SIG_STATUS.
366
367         * rungpg.h: Add new status codes from gpg 1.0.7 and formatted the
368         list to align with the status.h file from gnupg.
369
370         * gpgme.h (GpgmeSigStat): Add _GOOD_EXP and _GOOD_EXPKEY.
371         * verify.c (_gpgme_verify_status_handler, finish_sig): Handle
372         these new status codes.  Store the expiration time 
373
374 2002-04-27  Werner Koch  <wk@gnupg.org>
375
376         * gpgme.h (GpgmeData_Encoding): New.
377         * data.c (gpgme_data_get_encoding,gpgme_data_set_encoding): New.
378         * engine-gpgsm.c (map_input_enc): New. Use it in all local
379         functions where the INPUT command gets send.
380
381 2002-04-27  Marcus Brinkmann  <marcus@g10code.de>
382
383         * engine-gpgsm.c (_gpgme_gpgsm_op_verify): Close the output
384         descriptor only when we don't need it anymore.  Close the message
385         descriptor if we don't need it.
386
387 2002-04-26  Werner Koch  <wk@gnupg.org>
388
389         * Makefile.am (libgpgme_la_LIBADD): Use libtool libraries.
390
391 2002-04-25  Marcus Brinkmann  <marcus@g10code.de>
392
393         * rungpg.c (_gpgme_gpg_release): Call gpgme_data_release on
394         GPG->cmd.cb_data, not xfree.
395
396 2002-04-25  Marcus Brinkmann  <marcus@g10code.de>
397
398         * engine-gpgsm.c (_gpgme_gpgsm_new): Set the display, ttyname,
399         ttytype, lc_ctype and lc_messages options in the server.
400
401 2002-04-24  Marcus Brinkmann  <marcus@g10code.de>
402
403         * engine-gpgsm.c (map_assuan_error): Add new error codes.
404
405 2002-04-23  Werner Koch  <wk@gnupg.org>
406
407         * key.c (gpgme_key_get_ulong_attr): Swapped use of can_encrypt and
408         can_certify to return the requested values.
409
410 2002-04-23  Marcus Brinkmann  <marcus@g10code.de>
411
412         * gpgme.c (gpgme_get_progress_cb): Allow either return parameter
413         to be NULL.
414         (gpgme_get_passphrase_cb): Likewise.
415
416 2002-04-22  Marcus Brinkmann  <marcus@g10code.de>
417
418         * gpgme.c (gpgme_get_passphrase_cb): New function.
419         (gpgme_get_progress_cb): New function.
420         * gpgme.h: Add new prototypes for gpgme_get_passphrase_cb and
421         gpgme_get_progress_cb.
422
423 2002-03-28  Werner Koch  <wk@gnupg.org>
424
425         * gpgme.h (GpgmeAttr): Add values for issuer and chaining.
426         * key.h (gpgme_key_s): Add issuer and chaining elements for X509.
427         * keylist.c (keylist_colon_handler): Store them.
428         * key.c (gpgme_key_release): Free them.
429         (gpgme_key_get_as_xml,gpgme_key_get_string_attr): Print them.
430
431 2002-03-26  Werner Koch  <wk@gnupg.org>
432
433         * Makefile.am (libgpgme_la_SOURCES): Add mutex.h
434
435 2002-03-21  Werner Koch  <wk@gnupg.org>
436
437         * util.h [!HAVE_FOPENCOOKIE]: Make sure off_t and ssize_t are
438         defined.
439
440 2002-03-18  Marcus Brinkmann  <marcus@g10code.de>
441
442         * Makefile.am (system_components): New variable, set depending on
443         HAVE_DOSISH_SYSTEM.
444         (libgpgme_la_SOURCES): Use system_components.  Remove `syshdr.h'.
445         * syshdr.h: File removed.
446
447         * posix-io.c: Remove !HAVE_DOSISH_SYSTEM safeguard.  Clean up source.
448         * posix-sema.c: Likewise.
449         * posix-util.c: Likewise.
450
451         * w32-io.c: Remove HAVE_DOSISH_SYSTEM safeguard.
452         * w32-sema.c: Likewise.
453         * w32-util.c: Likewise.
454
455         * posix-io.c: Include `unistd.h', do not include `syshdr.h'.
456         * posix-sema.c: Likewise.
457         * w32-io.c: Include `io.h', do not include `syshdr.h'
458         * w32-sema.c: Likewise.
459         * w32-util.c: Likewise.
460         * data.c: Do not include `syshdr.h'.
461         * wait.c: Likewise.
462         * wait.h: Code cleanup.
463
464         * mutex.h: New file.
465         * posix-sema.c: Implement.
466
467 2002-03-08  Werner Koch  <wk@gnupg.org>
468
469         * util.h [!HAVE_FOPENCOOKIE]: Fixed type.  Thanks to Frank Heckenbach.
470
471 2002-03-07  Werner Koch  <wk@gnupg.org>
472
473         * gpgme.h (gpgme_op_keylist_ext_start): Add prototype.
474
475 2002-03-06  Marcus Brinkmann  <marcus@g10code.de>
476
477         * encrypt.c (_gpgme_encrypt_sym_status_handler): New function.
478         (gpgme_op_encrypt_start): New variable SYMMETRIC, set it if RECP
479         is null, and if it is set, use _gpgme_encrypt_sym_status_handler
480         as status handler and run _gpgme_passphrase_start.
481         * rungpg.c (_gpgme_gpg_op_encrypt): If RECP is zero, do symmetric
482         encryption.
483         * engine-gpgsm.c (_gpgme_gpgsm_op_encrypt): If RECP is zero,
484         return error value.
485
486         * rungpg.c (_gpgme_gpg_op_verify): Add "--" argument.
487
488 2002-03-03  Marcus Brinkmann  <marcus@g10code.de>
489
490         * passphrase.c (_gpgme_passphrase_status_handler): Also set the
491         error No_Passphrase if only a bad passphrase was provided.
492
493 2002-03-03  Marcus Brinkmann  <marcus@g10code.de>
494
495         * rungpg.c (_gpgme_gpg_op_verify): If TEXT is of mode
496         GPGME_DATA_MODE_IN, construct a command line that stores the
497         plaintext in TEXT.
498         * verify.c (gpgme_op_verify_start): Accept TEXT being
499         uninitialized, and in this case interpret SIG as a normal or
500         cleartext signature and TEXT as a return data object.
501         * engine-gpgsm.c (_gpgme_gpgsm_op_verify): Likewise.
502
503 2002-03-03  Marcus Brinkmann  <marcus@g10code.de>
504
505         * engine-gpgsm.c (_gpgme_gpgsm_op_keylist_ext) [!ENABLE_GPGSM]:
506         Add stub function.
507
508 2002-02-28  Werner Koch  <wk@gnupg.org>
509
510         * key.h (subkey_s): New member expires_at.
511         * keylist.c (keylist_colon_handler): Set it here
512         * key.c (gpgme_key_get_as_xml,gpgme_key_get_ulong_attr): Return it.
513
514 2002-02-27  Marcus Brinkmann  <marcus@g10code.de>
515
516         * rungpg.h (_gpgme_gpg_op_keylist_ext): New prototype.
517         * rungpg.c (_gpgme_gpg_op_keylist_ext): New function.
518         * engine-gpgsm.h (_gpgme_gpgsm_op_keylist_ext): New prototype.
519         * engine-gpgsm.c (_gpgme_gpgsm_op_keylist_ext): New function.
520         * engine.h (_gpgme_engine_op_keylist_ext): New prototype.
521         * engine.c (_gpgme_engine_op_keylist_ext): New function.
522         * keylist.c (gpgme_op_keylist_ext_start): New function.
523
524 2002-02-27  Marcus Brinkmann  <marcus@g10code.de>
525
526         * gpgme.h: Add new error code GPGME_Invalid_Recipient.
527         * encrypt.c (struct encrypt_result_s): New member invalid_recipients,
528         rename no_recipients to no_valid_recipients.
529         (_gpgme_encrypt_status_handler): Include error for invalid
530         recipients.
531         * engine-gpgsm.c (gpgsm_set_recipients): Change type of first
532         argument to GpgsmObject.  Use that to report back the status about
533         the recipients.
534
535 2002-02-26  Marcus Brinkmann  <marcus@g10code.de>
536
537         * verify.c (_gpgme_verify_status_handler): Fix the last change.
538
539 2002-02-25  Marcus Brinkmann  <marcus@g10code.de>
540
541         * engine.c (_gpgme_engine_op_encrypt_sign): New function.
542         * engine.h (_gpgme_engine_op_encrypt_sign): New prototype.
543         * rungpg.c (_gpgme_append_gpg_args_from_signers): New function.
544         (_gpgme_gpg_op_sign): Use that new function.
545         (_gpgme_gpg_op_encrypt_sign): New function.
546         * rungpg.h (_gpgme_gpg_op_encrypt_sign): New prototype. 
547         * gpgme.h (gpgme_op_encrypt_sign_start): New prototype.
548         (gpgme_op_encrypt_sign): Likewise.
549         * Makefile.am (libgpgme_la_SOURCES): Add encrypt-sign.c.
550         * ops.h (_gpgme_encrypt_status_handler): Add prototype.
551         (_gpgme_sign_status_handler): Add prototype.
552         * sign.c (sign_status_handler): Rename to ...
553         (_gpgme_sign_status_handler): ... this and make non-static.
554         * encrypt.c (encrypt_status_handler): Rename to ...
555         (_gpgme_encrypt_status_handler): ... this and make non-static.
556         * encrypt.c (gpgme_op_encrypt_start): Use new status handler name.
557         * sign.c (gpgme_op_sign_start): Likewise.
558         
559 2002-02-25  Marcus Brinkmann  <marcus@g10code.de>
560
561         * verify.c (_gpgme_verify_status_handler): Parse the args line to
562         see if the problem is due to a missing key, and report that back
563         to the user.
564
565 2002-02-25  Marcus Brinkmann  <marcus@g10code.de>
566
567         * context.h (struct gpgme_context_s): New member include_certs.
568         * gpgme.h (gpgme_set_include_certs): Add prototype.
569         (gpgme_get_include_certs): Likewise.
570         * gpgme.c (gpgme_set_include_certs): New function.
571         (gpgme_get_include_certs): Likewise.
572         (gpgme_new): Set include_certs to 1 (the default).
573         * engine.c (_gpgme_engine_op_sign): Accept new argument include_certs,
574         and pass it to _gpgme_gpgsm_op_sign.
575         * engine.h (_gpgme_engine_op_sign): Likewise for prototype.
576         * engine-gpgsm.c (_gpgme_gpgsm_op_sign): Accept new argument
577         include_certs and handle it.
578         * engine-gpgsm.h (_gpgme_gpgsm_start): Add new argument include_certs.
579         * sign.c (gpgme_op_sign_start): Add new argument to
580         _gpgme_engine_op_sign call.
581
582 2002-02-14  Werner Koch  <wk@gnupg.org>
583
584         * keylist.c (gpgme_op_keylist_start): Do not use a verbose listing.
585
586 2002-02-13  Werner Koch  <wk@gnupg.org>
587
588         * vasprintf.c, fopencookie.c: Add replacement functions.
589         * util.h: Add prototypes for them.
590
591 2002-02-09  Marcus Brinkmann  <marcus@g10code.de>
592
593         * engine-gpgsm.c (gpgsm_assuan_simple_command): Return 0 if we
594         reach the end of the function.
595
596 2002-02-09  Marcus Brinkmann  <marcus@g10code.de>
597
598         * genkey.c (gpgme_op_genkey_start): Fix logic in validity check.
599         (gpgme_op_genkey_start): Skip newlines after opening tag.
600
601         * engine-gpgsm.c (_gpgme_gpgsm_start): Remove cruft.
602
603 2002-02-08  Marcus Brinkmann  <marcus@g10code.de>
604
605         * genkey.c (gpgme_op_genkey_start): Allow PUBKEY and SECKEY to be
606         set, and pass them down to the crypto engine.
607         * engine-gpgsm.h (_gpgme_gpgsm_start): New arguments PUBKEY and SECKEY.
608         * engine.h: Likewise.
609         * rungpg.h (_gpgme_gpg_spawn): Likewise.
610         * engine.c (_gpgme_engine_op_genkey): Likewise.  Use those
611         arguments.
612         * rungpg.c (_gpgme_gpg_op_genkey): Likewise.  Complain if those
613         arguments are set.
614         * engine-gpgsm.c (_gpgme_gpgsm_op_genkey): Likewise.  Implement
615         function.
616
617         * engine-gpgsm.c (_gpgme_gpgsm_op_keylist): Beautify comment.
618
619 2002-02-06  Marcus Brinkmann  <marcus@g10code.de>
620
621         * rungpg.c (_gpgme_gpg_op_keylist): Remove handling of keylist
622         mode (for now).
623
624 2002-02-06  Marcus Brinkmann  <marcus@g10code.de>
625
626         * wait.c (gpgme_wait): Add new argument STATUS, in which the
627         status of the returned context is returned.
628         (_gpgme_wait_on_condition): Rework the function a bit, to make it
629         aware of cancelled processes, and to allow to use gpgme_wait with
630         CTX being NULL (as documented in the source).
631         (struct proc_s): New member REPORTED.
632         * gpgme.h: Fix prototype.
633         * verify.c (gpgme_op_verify): Fix use of gpgme_wait.
634         * sign.c (gpgme_op_sign): Likewise.
635         * import.c (gpgme_op_import): Likewise.
636         * genkey.c (gpgme_op_genkey): Likewise.
637         * export.c (gpgme_op_export): Likewise.
638         * encrypt.c (gpgme_op_encrypt): Likewise.
639         * delete.c (gpgme_op_delete): Likewise.
640         * decrypt-verify.c (gpgme_op_decrypt_verify): Likewise.
641
642 2002-02-06  Marcus Brinkmann  <marcus@g10code.de>
643
644         * gpgme.c (gpgme_set_keylist_mode): Possibly return an error
645         value.
646         (gpgme_get_keylist_mode): New function.
647         (gpgme_new): Set the default for keylist_mode member of CTX.
648
649         * gpgme.h (gpgme_set_keylist_mode): Fix prototype.
650         (gpgme_get_keylist_mode): New prototype.
651         (GPGME_KEYLIST_MODE_LOCAL): New macro.
652         (GPGME_KEYLIST_MODE_EXTERN): Likewise..
653
654 2002-02-02  Marcus Brinkmann  <marcus@g10code.de>
655
656         This patch has gotten a bit large... mmh.  The main thing that
657         happens here is that error values are now not determined in the
658         operation function after gpgme_wait completed, but in the status
659         handler when EOF is received.  It should always be the case that
660         either an error is flagged or EOF is received, so that after a
661         gpgme_wait you should never have the situation that no error is
662         flagged and EOF is not received.  One problem is that the engine
663         status handlers don't have access to the context, a horrible
664         kludge works around this for now.  All errors that happen during a
665         pending operation should be catched and reported in ctx->error,
666         including out-of-core and cancellation.  This rounds up neatly a
667         couple of loose ends, and makes it possible to pass up any errors
668         in the communication with the backend as well.  As a bonus, there
669         will be a function to access gpgme->wait, so that the operations
670         can truly be implemented with their _start function.
671
672         * engine-gpgsm.c (gpgsm_status_handler): Horrible kludge to report
673         error back to the context.
674         * rungpg.c (gpg_status_handler): Same horrible kludge applied here.
675
676         * engine-gpgsm.c (gpgsm_assuan_simple_command): Add error checking.
677
678         * wait.c (_gpgme_wait_on_condition): If canceled, set CTX->error
679         to a value indication that.
680
681         * verify.c (add_notation): Set error, not out_of_core.
682         (finish_sig): Likewise.
683         (gpgme_op_verify_start): Don't clear out_of_core.
684         (_gpgme_verify_status_handler): At EOF, clean up the notation data.
685         (gpgme_op_verify): And don't do it here.
686
687         * trustlist.c (trustlist_status_handler): Check error, not out_of_core.
688         (gpgme_op_trustlist_start): Don't clear out_of_core.
689         (gpgme_op_trustlist_next): Check error, not out_of_core.
690         (gpgme_op_trustlist_end): Likewise.
691
692         * ops.h (test_and_allocate_result): New macro.
693         (_gpgme_passphrase_result): Remove prototype.
694         * delete.c (gpgme_op_delete): Return error from context.
695         (delete_status_handler): Use macro test_and_allocate_result.
696         Perform error checking at EOF.
697         (gpgme_op_delete_start): Release result.
698         * passphrase.c (_gpgme_passphrase_status_handler): Use macro
699         test_and_allocate_result, and perform error checking here.
700         (_gpgme_passphrase_result): Function removed.
701         * sign.c (gpgme_op_sign_start): Do not set out_of_core to zero.
702         (gpgme_op_sign): Just return the error value from the context.
703         (sign_status_handler): Only progress if no error is set yet.  If
704         we process an EOF, set the resulting error value (if any).
705         * decrypt.c (_gpgme_decrypt_result): Function removed.
706         (create_result_struct): Function removed.
707         (_gpgme_decrypt_status_handler): Use macro test_and_allocate_result,
708         caclulate error on EOF, do not progress with errors.
709         (_gpgme_decrypt_start): Do not set out_of_core to zero.
710         (gpgme_op_decrypt): Just return the error value from the context.
711         * encrypt.c (encrypt_status_handler): Perform the error checking
712         here.
713         (gpgme_op_encrypt_start): Do not clear out_of_core.
714         * export.c (export_status_handler): Return if error is set in context.
715         (gpgme_op_export_start): Release result.
716         (gpgme_op_export): Return error from context.
717         * decrypt-verify.c (gpgme_op_decrypt_verify): Return the error in
718         the context.
719         * genkey.c (genkey_status_handler): Use macro
720         test_and_allocate_result.  Perform error checking at EOF.
721         (gpgme_op_genkey): Just return the error from context.
722         * import.c (gpgme_op_import): Return the error from context.
723         (import_status_handler): Use macro test_and_allocate_result.
724         * keylist.c (gpgme_op_keylist_start): Do not clear out_of_core.
725         (gpgme_op_keylist_next): Return error of context.
726         (keylist_colon_handler): Set error instead out_of_code.
727         (finish_key): Likewise.
728
729         * context.h: Remove member out_of_core, add member error.
730         * gpgme.c (_gpgme_release_result): Clear error flag.
731
732         * engine.h (_gpgme_engine_get_error): New prototype.
733         * engine.c (_gpgme_engine_get_error): New function.
734         * engine-gpgsm.c (_gpgme_gpgsm_get_error): New function.
735
736         * engine-gpgsm.c (map_assuan_error): New function.
737         (gpgsm_assuan_simple_command): Change return type to GpgmeError,
738         use the new function to map error values.
739         (gpgsm_set_fd): Change return type tp GpgmeError.
740         (_gpgme_gpgsm_op_decrypt): Change type of ERR to GpgmeError.
741         (gpgsm_set_recipients): Likewise.  Change type of return value
742         equivalently.  Adjust error values.
743         (_gpgme_gpgsm_op_import): Likewise.
744         (_gpgme_gpgsm_op_sign): Likewise.
745         (struct gpgsm_object_s): New member error.
746         (gpgsm_status_handler): Set error if error occurs.  Determine
747         error number from ERR line received.  If assuan_read_line fails,
748         terminate the connection.
749
750 2002-02-01  Marcus Brinkmann  <marcus@g10code.de>
751
752         * Makefile.am (MOSTLYCLEANFILES): New variable.
753
754 2002-02-01  Marcus Brinkmann  <marcus@g10code.de>
755
756         * engine-gpgsm.c (gpgsm_status_handler): At error, terminate the
757         connection to the server.
758
759 2002-01-31  Marcus Brinkmann  <marcus@g10code.de>
760
761         * rungpg.h: Add STATUS_KEY_CREATED.
762
763         * progress.c: New file.
764         * Makefile.am (libgpgme_la_SOURCES): Add progress.c.
765
766         * genkey.c (genkey_status_handler): Use
767         _gpgme_progress_status_handler.  Add check for status.
768         (struct genkey_result_s): New structure.
769         (_gpgme_release_genkey_result): New function.
770         (gpgme_op_genkey): Check for error.
771         * gpgme.c (_gpgme_release_result): Call
772         _gpgme_release_genkey_result.
773         * ops.h (_gpgme_release_genkey_result): Add prototype.
774         * types.h (GenKeyResult): New type.
775         * context.h (gpgme_context_s): Add GenKeyResult to member result.
776
777 2002-01-30  Marcus Brinkmann  <marcus@g10code.de>
778
779         * gpgme.c (_gpgme_release_result): Call
780         _gpgme_release_delete_result.
781         * ops.h (_gpgme_release_delete_result): Add prototype.
782         * types.h (DeleteResult): New type.
783         * context.h (gpgme_context_s): Add DeleteResult to member result.
784
785         * delete.c (enum delete_problem): New type.
786         (struct delete_result_s): New structure.
787         (_gpgme_release_delete_result): New function.
788         (delete_status_handler): Implement more status codes.
789         (gpgme_op_delete): Return error on failure.
790
791         * import.c (MAX_IMPORTED_FIELDS): Bump up to 14.
792
793 2002-01-30  Marcus Brinkmann  <marcus@g10code.de>
794
795         * import.c (struct import_result_s): New structure.
796         (_gpgme_release_import_result): New function.
797         (append_xml_impinfo): Likewise.
798         (import_status_handler): Implement.
799         * gpgme.c (_gpgme_release_result): Add call to
800         _gpgme_release_import_result.
801         * ops.h (_gpgme_release_import_result): Add prototype.
802         * types.h (ImportResult): New type.
803         * context.h (gpgme_context_s): Add ImportResult to member result.
804
805         * encrypt.c (gpgme_op_encrypt): Code clean up.
806
807 2002-01-30  Marcus Brinkmann  <marcus@g10code.de>
808
809         * gpgme.h: Add lots of comment and fix the formatting.  Add
810         gpgme_trustlist_end prototype.
811
812 2002-01-29  Marcus Brinkmann  <marcus@g10code.de>
813
814         * gpgme.h: Add new type GpgmeIdleFunc.  Change type of
815         gpgme_register_idle to return and accept this type.
816         * wait.c (gpgme_register_idle): Fix type.
817         Save and return old value of idle_function.
818
819 2002-01-29  Werner Koch  <wk@gnupg.org>
820
821         * engine-gpgsm.c (_gpgme_gpgsm_op_keylist): Implement secret only mode.
822
823         * keylist.c (keylist_colon_handler): Add support for the new "crs"
824         record type.
825
826 2002-01-22  Marcus Brinkmann  <marcus@g10code.de>
827
828         * engine-gpgsm.c (_gpgme_gpgsm_release): Call assuan_disconnect,
829         not assuan_pipe_disconnect.
830
831         * Makefile.am (libgpgme_la_LIBADD): Change to link assuan and
832         jnlib (needed by assuan) statically into libgpgme.  Linking a
833         static library into a shared library this way is not portable.
834
835 2002-01-22  Marcus Brinkmann  <marcus@g10code.de>
836
837         * gpgme.h (GpgmePassphraseCb): Change type of R_HD from void* to
838         void**.
839
840 2002-01-22  Marcus Brinkmann  <marcus@g10code.de>
841
842         * data.c (gpgme_data_new_from_filepart): Change type of LENGTH
843         from off_t to size_t.
844         * gpgme.h: Likewise.
845
846 2002-01-22  Marcus Brinkmann  <marcus@g10code.de>
847
848         * wait.c (_gpgme_wait_on_condition): If the process finished,
849         reset the pending flag.  Also if the operation was cancelled.
850
851         (struct proc_s): Rename READY to DONE.
852         (wait_item_s): Likewise.
853         (set_process_ready): Rename to ...
854         (set_process_done): ... this.
855         (_gpgme_remove_proc_from_wait_queue): Call set_process_done
856         instead set_process_ready.
857         (_gpgme_wait_on_condition): Likewise.
858         (do_select): Rename READY to DONE.
859
860         * verify.c (gpgme_op_verify): Do not set pending to zero here.
861         * sign.c (gpgme_op_sign): Likewise.
862         * import.c (gpgme_op_import): Likewise.
863         * genkey.c (gpgme_op_genkey): Likewise.
864         * export.c (gpgme_op_export): Likewise.
865         * encrypt.c (gpgme_op_encrypt): Likewise.
866         * delete.c (gpgme_op_delete): Likewise.
867         * decrypt-verify.c (gpgme_op_decrypt_verify): Likewise.
868         * decrypt.c (gpgme_op_decrypt): Likewise.
869
870 2002-01-22  Marcus Brinkmann  <marcus@g10code.de>
871
872         * export.c: Cleanup.
873
874 2002-01-15  Marcus Brinkmann  <marcus@g10code.de>
875
876         * trustlist.c: Various source clean ups.
877         (my_isdigit): Removed.
878         (gpgme_op_trustlist_end): New function.
879
880 2002-01-13  Marcus Brinkmann  <marcus@g10code.de>
881
882         * gpgme.c: Various source clean ups, like renaming C to CTX where
883         appropriate.
884         (gpgme_new): Clear R_CTX before starting the work.
885         (my_isdigit): Removed.
886         (my_isxdigit): Likewise.
887
888         * data.c: Various source clean ups.
889         (gpgme_data_new_from_mem): Check BUFFER after clearing R_DH.
890         (gpgme_data_new_with_read_cb): Similar for READ_CB.
891         (gpgme_data_new_from_file): Loop over fread while EINTR.
892         (gpgme_data_new_from_filepart): Rediddled a bit.  Allow LENGTH to
893         be zero.  Loop over fread while EINTR.
894
895         (my_isdigit): Removed.
896         (my_isxdigit): Likewise.
897
898 2001-12-21  Marcus Brinkmann  <marcus@g10code.de>
899
900         * engine-gpgsm.c (_gpgme_gpgsm_new): Replace General_Error with
901         Pipe_Error where appropriate.
902
903 2001-12-19  Marcus Brinkmann  <marcus@g10code.de>
904
905         * engine.c: Include `string.h'.  Reported by Stéphane Corthésy.
906
907         * version.c (get_engine_info): Remove prototype.
908
909 2001-12-19  Marcus Brinkmann  <marcus@g10code.de>
910
911         * engine-gpgsm.c (_gpgme_gpgsm_new): New variable CHILD_FDS.
912         Fill it with the servers fds, and pass it to assuan_pipe_connect.
913
914 2001-12-18  Marcus Brinkmann  <marcus@g10code.de>
915
916         * keylist.c (gpgme_op_keylist_end): New function.
917         * gpgme.h (gpgme_op_keylist_end): New prototype.
918
919         * engine.h (gpgme_engine_check_version): Move prototype to ...
920         * gpgme.h (gpgme_engine_check_version): ... here.
921
922         * genkey.c (gpgme_op_genkey_start): Remove unused variable.
923
924 2001-12-18  Marcus Brinkmann  <marcus@g10code.de>
925
926         * version.c (gpgme_get_engine_info): Reimplemented.
927         (gpgme_check_engine): Reimplemented.
928         (_gpgme_compare_versions): Return NULL if MY_VERSION is NULL.
929
930         * engine.c: Include `io.h'.
931         (gpgme_engine_get_info): New function.
932         * engine.h (gpgme_engine_check_version, _gpgme_engine_get_info):
933         Add prototype.
934
935 2001-12-18  Marcus Brinkmann  <marcus@g10code.de>
936
937         * rungpg.c (struct reap_s, reap_list, reap_list_lock): Moved to ...
938         * engine.c (struct reap_s, reap_list, reap_list_lock): ... here.
939         Include `time.h', `sys/types.h', `assert.h', and `sema.h'.
940
941         * rungpg.c (_gpgme_engine_add_child_to_reap_list): New function.
942         (do_reaping, _gpgme_gpg_housecleaning): Moved to ...
943         * engine.c (do_reaping, _gpgme_engine_housecleaning): ... here.
944         * rungpg.c (_gpgme_gpg_release): Replace code that is now in its
945         own function by call to _gpgme_engine_add_child_to_reap_list().
946
947         * wait.c: Include `engine.h'.
948         (run_idle): Call _gpgme_engine_housecleaning(), not
949         _gpgme_gpg_housecleaning().
950         
951 2001-12-18  Marcus Brinkmann  <marcus@g10code.de>
952
953         * key.c (_gpgme_key_append_name): Append, not prepend, the uid.
954         Initialize the next field of the uid structure.
955         (gpgme_key_get_as_xml): Do not list last uid first.
956
957 2001-12-17  Marcus Brinkmann  <marcus@g10code.de>
958
959         * engine-gpgsm.c (_gpgme_gpgsm_set_colon_line_handler): New
960         function [!ENABLE_GPGSM].
961
962 2001-12-14  Marcus Brinkmann  <marcus@g10code.de>
963
964         * engine-gpgsm.c (_gpgme_gpgsm_op_verify): Put TEXT into
965         message_data, not SIG.
966         (_gpgme_gpgsm_op_sign): Use `--detached', not `--detach'.
967
968         * sign.c (sign_status_handler): Call
969         _gpgme_passphrase_status_handler early.
970
971 2001-12-14  Marcus Brinkmann  <marcus@g10code.de>
972
973         * engine-gpgsm.c: Revert last change.
974
975 2001-12-14  Marcus Brinkmann  <marcus@g10code.de>
976
977         * engine-gpgsm.c (gpgsm_status_handler): Freeze the output file
978         handler when ending this operation, otherwise the wait function
979         will sit on it.
980
981 2001-12-14  Marcus Brinkmann  <marcus@g10code.de>
982
983         * engine-gpgsm.c (struct gpgsm_object_s): New member colon.attic.
984         (_gpgme_gpgsm_new): Initialize some more members.
985         (_gpgme_gpgsm_release): Free the colon line handler's attic line.
986         (gpgsm_status_handler): Rework the inline-data processing.
987
988 2001-12-13  Marcus Brinkmann  <marcus@g10code.de>
989
990         * rungpg.c (_gpgme_gpg_spawn): Do not add the fds to the child
991         list that are not dup'ed, for those the close-on-exec flag is set
992         now.
993         * version.c (_gpgme_get_program_version): Remove first entry in
994         CFD, as the close-on-exec flag is now set for this fd.
995
996 2001-12-13  Marcus Brinkmann  <marcus@g10code.de>
997
998         * engine-gpgsm.c (_gpgme_gpgsm_op_encrypt): Do not add `armor'
999         option to `ENCRYPT'.
1000         * engine-gpgsm.c (gpgsm_set_recipients): Free LINE when returning
1001         successfully.
1002
1003 2001-12-13  Marcus Brinkmann  <marcus@g10code.de>
1004
1005         * engine-gpgsm.c (close_notify_handler): New function.
1006         (_gpgme_gpgsm_new): Manage the file descriptors a
1007         bit differently.  Do not set close-on-exec flags.
1008         (_gpgme_gpgsm_op_decrypt): Do not set message_fd
1009         to -1, this is done by the close handler.
1010         (_gpgme_gpgsm_op_encrypt): Likewise.
1011         (_gpgme_gpgsm_op_import): Likewise (also for output_fd).
1012         (_gpgme_gpgsm_op_keylist): Likewise (also for input_fd and output_fd).
1013         (_gpgme_gpgsm_op_sign): Likewise.
1014         (_gpgme_gpgsm_op_verify): Likewise, but for output_fd.
1015
1016         * posix-io.c (_gpgme_io_pipe): Set the close-on-exec flag for the
1017         non-inherited file descriptor index of the pipe.
1018
1019 2001-12-13  Werner Koch  <wk@gnupg.org>
1020
1021         * engine-gpgsm.c (_gpgme_gpgsm_set_colon_line_handler): New.
1022         (gpgsm_status_handler): Pass datalines to a colon handler
1023         * engine.c (_gpgme_engine_set_colon_line_handler): Set the colon
1024         handler for gpgsm.
1025
1026         * engine-gpgsm.c (_gpgme_gpgsm_op_keylist): Allow NULL for
1027         pattern.
1028         (gpgsm_assuan_simple_command): Removed underscore from
1029         assuan_write_line.
1030         (_gpgme_gpgsm_start): Ditto.
1031         (gpgsm_assuan_simple_command): Replaced interal Assuan read
1032         function by the new assuan_read_line.  Removed the use of the
1033         internal header.
1034         (gpgsm_status_handler): Ditto. Use the new assuan_pending_line.
1035         (_gpgme_gpgsm_start): Use the documented way to get an fd from
1036         assuan.
1037
1038         * keylist.c (keylist_colon_handler): Handle "crt" records
1039         * key.h (gpgme_key_s): Add an x509 flag.
1040         * key.c (parse_x509_user_id): New.
1041         (_gpgme_key_append_name): Handle x.509 names.
1042
1043 2001-12-05  Marcus Brinkmann  <marcus@g10code.de>
1044
1045         * engine-gpgsm.c (gpgsm_status_handler): Make it work with current
1046         version of assuan.
1047
1048 2001-12-05  Marcus Brinkmann  <marcus@g10code.de>
1049
1050         * engine-gpgsm.c (gpgsm_set_fd): Accept one more argument OPT.
1051         (_gpgme_gpgsm_op_encrypt): Pass armor argument to gpgsm_set_fd for
1052         output descriptor.
1053         (_gpgme_gpgsm_op_sign): Likewise.
1054
1055 2001-12-05  Marcus Brinkmann  <marcus@g10code.de>
1056
1057         * keylist.c (gpgme_op_keylist_next): Set pending to 0 if EOF
1058         occurs.
1059
1060 2001-11-26  Marcus Brinkmann  <marcus@g10code.de>
1061
1062         * engine-gpgsm.c (_gpgme_gpgsm_op_sign): Fix stupid typo.
1063
1064 2001-11-24  Marcus Brinkmann  <marcus@g10code.de>
1065
1066         * engine-gpgsm.c (gpgsm_status_handler): Don't break if bsearch fails.
1067         Deal with assuan read line returning more than one line (for now).
1068
1069 2001-11-23  Marcus Brinkmann  <marcus@g10code.de>
1070
1071         * engine-gpgsm.c (_gpgme_gpgsm_op_sign): Implement it according to
1072         the current protocol definition.
1073
1074 2001-11-23  Marcus Brinkmann  <marcus@g10code.de>
1075
1076         * engine-gpgsm.c (_gpgme_gpgsm_new): Set CLOEXEC flag for parent
1077         ends of the pipe.
1078
1079 2001-11-22  Marcus Brinkmann  <marcus@g10code.de>
1080
1081         * engine-gpgsm.c: Include stdlib.h and string.h.  Also include,
1082         for now, rungpg.h and status-table.h.
1083         (gpgsm_status_handler): Implement more of the status handler.
1084
1085 2001-11-22  Marcus Brinkmann  <marcus@g10code.de>
1086
1087         * engine.c (_gpgme_engine_op_decrypt): Implement CMS case.
1088         (_gpgme_engine_op_delete): Likewise.
1089         (_gpgme_engine_op_encrypt): Likewise.
1090         (_gpgme_engine_op_export): Likewise.
1091         (_gpgme_engine_op_genkey): Likewise.
1092         (_gpgme_engine_op_keylist): Likewise.
1093         (_gpgme_engine_op_sign): Likewise.
1094         (_gpgme_engine_op_trustlist): Likewise.
1095
1096         * engine-gpgsm.c (_gpgme_gpgsm_op_encrypt): New function.
1097         (gpgsm_assuan_simple_command): Likewise.
1098         (gpgsm_set_recipients): Likewise.
1099         (gpgsm_set_fd): Reimplement using gpgsm_assuan_simple_command.
1100         (_gpgme_gpgsm_op_delete): New function.
1101         (_gpgme_gpgsm_op_export): Likewise.
1102         (_gpgme_gpgsm_op_genkey): Likewise.
1103         (_gpgme_gpgsm_op_sign): Likewise.
1104         (_gpgme_gpgsm_op_keylist): Likewise.
1105         (_gpgme_gpgsm_op_trustlist): Likewise.
1106         (_gpgme_gpgsm_release): Release command.
1107         (_gpgme_gpgsm_op_decrypt): Allocate command.
1108         (_gpgme_gpgsm_op_import): Likewise.
1109         (gpgsm_status_handler): Also treat `ERR' strings as EOF.
1110
1111 2001-11-22  Marcus Brinkmann  <marcus@g10code.de>
1112
1113         * gpgme.h (gpgme_set_protocol): New prototype.
1114
1115 2001-11-22  Marcus Brinkmann  <marcus@g10code.de>
1116
1117         * engine-gpgsm.c (_gpgme_gpgsm_op_decrypt): New function.
1118         (_gpgme_gpgsm_op_import): Likewise.
1119
1120 2001-11-22  Marcus Brinkmann  <marcus@g10code.de>
1121
1122         * engine-gpgsm.c: Shuffle around header inclusion a bit, to still
1123         keep them seperate.
1124         (_gpgme_set_status_handler) [!ENABLE_GPGSM]: New function.
1125
1126 2001-11-22  Werner Koch  <wk@gnupg.org>
1127
1128         * engine-gpgsm.c: Include more headers so that NULL and mk_error
1129         is defined even with an undefined GPGSM_PATH.
1130
1131 2001-11-22  Marcus Brinkmann  <marcus@g10code.de>
1132
1133         * rungpg.c (gpg_inbound_handler, write_mem_data, write_cb_data,
1134         gpg_outbound_handler): Moved to ...
1135         * data.c (_gpgme_data_inbound_handler, write_mem_data,
1136         write_cb_data, _gpgme_data_outbound_handler): ... here.  Make the
1137         _gpgme_* ones non-static.
1138         * data.c: Include io.h.
1139
1140         * ops.h (_gpgme_data_inbound_handler): New prototype.
1141         (_gpgme_data_outbound_handler): Likewise.
1142         (_gpgme_gpg_spawn): Use these new functions.
1143
1144         * engine-gpgsm.h (_gpgme_gpgsm_op_decrypt, _gpgme_gpgsm_op_delete,
1145         _gpgme_gpgsm_op_encrypt, _gpgme_gpgsm_op_export,
1146         _gpgme_gpgsm_op_genkey, _gpgme_gpgsm_op_import,
1147         _gpgme_gpgsm_op_keylist, _gpgme_gpgsm_op_sign,
1148         _gpgme_gpgsm_op_trustlist, _gpgme_gpgsm_op_verify,
1149         _gpgme_gpgsm_start, _gpgme_gpgsm_set_status_handler): New prototype.
1150         Include <rungpg.h> for status handler function.
1151
1152         * engine-gpgsm.c (struct gpgsm_object_s): New members input_fd,
1153         input_data, output_fd, output_data, message_fd, message_data, command
1154         and status.
1155         (_gpgme_gpgsm_new): Open input, output and message pipes before
1156         connecting to the client.  Close server's ends afterwards.
1157         (_gpgme_gpgsm_release): Close open file descriptors.  Remove
1158         server process from wait queue.
1159         (_gpgme_gpgsm_op_verify, _gpgme_gpgsm_start,
1160         _gpgme_gpgsm_set_status_handler, gpgms_status_handler): New function.
1161         
1162         * engine.c (_gpgme_engine_start): Implement for GPGME_PROTOCOL_CMS.
1163         (_gpgme_engine_set_status_handler): Likewise.
1164         (_gpgme_engine_op_verify): Likewise.
1165
1166 2001-11-21  Marcus Brinkmann  <marcus@g10code.de>
1167
1168         * context.h: Do not include rungpg.h, but engine.h.
1169         (struct gpgme_context_s): Replace member gpg with engine.
1170         * gpgme.c (gpgme_release): Release engine, not gpg.
1171
1172         * recipient.c (_gpgme_append_gpg_args_from_recifgpients): Function
1173         moved ...
1174         * rungpg.c (_gpgme_append_gpg_args_from_recipients): ... here.
1175         Make static, change order of arguments, and return an error value.
1176         * ops.h (_gpgme_append_gpg_args_from_recipients): Removed prototype.
1177
1178         * rungpg.h (_gpgme_gpg_op_verify): Add prototype.
1179         (_gpgme_gpg_op_encrypt): Likewise.
1180         (_gpgme_gpg_op_decrypt): Likewise.
1181         (_gpgme_gpg_op_delete): Likewise.
1182         (_gpgme_gpg_op_export): Likewise.
1183         (_gpgme_gpg_op_genkey): Likewise.
1184         (_gpgme_gpg_op_import): Likewise.
1185         (_gpgme_gpg_op_keylist): Likewise.
1186         (_gpgme_gpg_op_sign): Likewise.
1187         (_gpgme_gpg_op_trustlist): Likewise.
1188         * rungpg.c (_gpgme_gpg_op_verify): New function.
1189         (_gpgme_gpg_op_encrypt): Likewise.
1190         (_gpgme_gpg_op_decrypt): Likewise.
1191         (_gpgme_gpg_op_delete): Likewise.
1192         (_gpgme_gpg_op_export): Likewise.
1193         (_gpgme_gpg_op_genkey): Likewise.
1194         (_gpgme_gpg_op_import): Likewise.
1195         (_gpgme_gpg_op_keylist): Likewise.
1196         (_gpgme_gpg_op_sign): Likewise.
1197         (_gpgme_gpg_op_trustlist): Likewise.
1198
1199         * engine.h (_gpgme_engine_set_status_handler): Add prototype.
1200         (_gpgme_engine_set_command_handler): Likewise.
1201         (_gpgme_engine_set_colon_line_handler): Likewise.
1202         (_gpgme_engine_op_decrypt): Likewise.
1203         (_gpgme_engine_op_delete): Likewise.
1204         (_gpgme_engine_op_encrypt): Likewise.
1205         (_gpgme_engine_op_export): Likewise.
1206         (_gpgme_engine_op_genkey): Likewise.
1207         (_gpgme_engine_op_import): Likewise.
1208         (_gpgme_engine_op_keylist): Likewise.
1209         (_gpgme_engine_op_sign): Likewise.
1210         (_gpgme_engine_op_trustlist): Likewise.
1211         (_gpgme_engine_op_verify): Likewise.
1212         (_gpgme_engine_start): Likewise.
1213         * engine.c (_gpgme_engine_set_status_handler): New function.
1214         (_gpgme_engine_set_command_handler): Likewise.
1215         (_gpgme_engine_set_colon_line_handler): Likewise.
1216         (_gpgme_engine_op_decrypt): Likewise.
1217         (_gpgme_engine_op_delete): Likewise.
1218         (_gpgme_engine_op_encrypt): Likewise.
1219         (_gpgme_engine_op_export): Likewise.
1220         (_gpgme_engine_op_genkey): Likewise.
1221         (_gpgme_engine_op_import): Likewise.
1222         (_gpgme_engine_op_keylist): Likewise.
1223         (_gpgme_engine_op_sign): Likewise.
1224         (_gpgme_engine_op_trustlist): Likewise.
1225         (_gpgme_engine_op_verify): Likewise.
1226         (_gpgme_engine_start): Likewise.
1227
1228         * verify.c (gpgme_op_verify_start): Reimplement in terms of above
1229         functions.
1230         * encrypt.c (gpgme_op_encrypt_start): Likewise.
1231         * decrypt.c (_gpgme_decrypt_start): Likewise.
1232         * passphrase.c (_gpgme_passphrase_start): Likewise.
1233         * keylist.c (gpgme_op_keylist_start): Likewise.
1234
1235 2001-11-20  Marcus Brinkmann  <marcus@g10code.de>
1236
1237         * types.h: Add types EngineObject and GpgsmObject.
1238
1239         * Makefile.am (libgpgme_la_SOURCES): Add engine-gpgsm.h,
1240         engine-gpgsm.c, engine.h and engine.c.
1241         * engine.h: New file.
1242         * engine.c: Likewise.
1243         * engine-gpgsm.h: Likewise.
1244         * engine-gpgsm.c: Likewise.
1245         
1246         * rungpg.c (_gpgme_gpg_get_version): New function.
1247         (_gpgme_gpg_check_version): Likewise.
1248         * rungpg.h: Add prototypes for _gpgme_gpg_get_version and
1249         _gpgme_gpg_check_version.
1250
1251         * version.c (compare_versions): Rename to ...
1252         (_gpgme_compare_versions): ... this.  Make non-static.
1253         (gpgme_check_version): Use _gpgme_compare_versions rather than
1254         compare_versions.
1255         (gpgme_check_engine): Likewise.
1256         * ops.h (_gpgme_get_program_version): Add prototype.
1257
1258 2001-11-20  Marcus Brinkmann  <marcus@g10code.de>
1259
1260         * Makefile.am (libgpgme_la_INCLUDES): Remove obsolete directive.
1261         (AM_CPPFLAGS): New directive [BUILD_ASSUAN].
1262         (libgpgme_la_LIBADD): Likewise.
1263
1264 2001-11-20  Marcus Brinkmann  <marcus@g10code.de>
1265
1266         * version.c: Remove global variables lineno and
1267         tmp_engine_version.
1268         (version_handler): Removed.
1269         (_gpgme_get_program_version): New function.
1270         (get_engine_info): Don't use context and version_handler,
1271         but _gpgme_get_program_version.
1272         * ops.h (_gpgme_get_program_version): Add prototype for
1273         _gpgme_get_program_version (we expect to use it elsewhere soon).
1274
1275 2001-11-18  Marcus Brinkmann  <marcus@g10code.de>
1276
1277         * version.c (get_engine_info): If GnuPG is not available, return
1278         an error message.
1279         * posix-util.c (_gpgme_get_gpg_path): Allow GPG_PATH to be
1280         undefined.
1281         (_gpgme_get_gpgsm_path): New function.
1282         * w32-util.c (find_program_in_registry): New static function.
1283         (_gpgme_get_gpg_path): Allow GPG_PATH to be undefined.  Rework
1284         to use find_program_in_registry.
1285         (_gpgme_get_gpgsm_path): New function.
1286         (util.h): Prototype _gpgme_get_gpgsm_path).
1287         * rungpg.c (_gpgme_gpg_spawn): Verify that _gpgme_get_gpg_path()
1288         returns non-null.
1289
1290 2001-11-16  Marcus Brinkmann  <marcus@g10code.de>
1291
1292         * decrypt-verify.c: New file.
1293         * Makefile.am (libgpgme_la_SOURCES): Add decrypt-verify.c.
1294         * types.h: Add decrypt-verify types.
1295         * ops.h: Likewise.
1296         * context.h: Add result type for decrypt-verify.
1297         * gpgme.h: Add decrypt-verify prototypes.
1298
1299         * decrypt.c (decrypt_status_handler): Renamed to ...
1300         (_gpgme_decrypt_status_handler): ... this.  Make non-static.
1301         (_gpgme_decrypt_start): New function, derived from
1302         gpgme_op_decrypt_start.
1303         (gpgme_op_decrypt_start): Reimplement in terms of
1304         _gpgme_decrypt_start.
1305         (_gpgme_decrypt_result): New function to retrieve error value.
1306         (gpgme_op_decrypt): Use _gpgme_decrypt_result.
1307         * ops.h: Add prototypes for new functions.
1308
1309         * verify.c (verify_status_handler): Renamed to ...
1310         (_gpgme_verify_status_handler): ... this.  Make non-static.
1311         (gpgme_op_verify_start): Use new function name.
1312         (intersect_stati): Renamed to ...
1313         (_gpgme_intersect_stati): ... this.  Make non-static.
1314         (gpgme_op_verify): Use new name.
1315         * ops.h: Add prototypes for new functions.
1316
1317 2001-11-16  Marcus Brinkmann  <marcus@g10code.de>
1318
1319         * passphrase.c: New file.
1320         * Makefile.am (libgpgme_la_SOURCES): Add passphrase.c.
1321         * ops.h (_gpgme_passphrase_result): Add prototypes from
1322         passphrase.c.
1323         * types.h: Likewise.
1324         * context.h: Add member passphrase to result.
1325         * gpgme.c (_gpgme_release_result): Release passphrase member.
1326
1327         * decrypt.c: Some formatting and variable name changes (like
1328         CTX instead C).
1329         (struct decrypt_result_s): Remove members now found in
1330         passphrase result.
1331         (_gpgme_release_decrypt_result): Don't release removed members.
1332         (decrypt_status_handler): Call _gpgme_passphrase_status_handler,
1333         and don't handle the cases catched there.
1334         (command_handler): Removed.
1335         (gpgme_op_decrypt_start): Don't set command handler, but invoke
1336         _gpgme_passphrase_start which does it.
1337         (gpgme_op_decrypt): Invoke _gpgme_passphrase_result and drop the
1338         cases covered by it.
1339
1340         * sign.c Some formatting and variable name changes (like
1341         CTX instead C).
1342         (struct sign_result_s): Remove members now found in
1343         passphrase result.
1344         (_gpgme_release_sign_result): Don't release removed members.
1345         (sign_status_handler): Call _gpgme_passphrase_status_handler,
1346         and don't handle the cases catched there.
1347         (command_handler): Removed.
1348         (gpgme_op_sign_start): Don't set command handler, but invoke
1349         _gpgme_passphrase_start which does it.
1350         (gpgme_op_sign): Invoke _gpgme_passphrase_result and drop the
1351         cases covered by it.
1352
1353 2001-11-15  Marcus Brinkmann  <marcus@g10code.de>
1354
1355         * decrypt.c (command_handler): Fix last change.
1356
1357 2001-11-15  Marcus Brinkmann  <marcus@g10code.de>
1358
1359         * verify.c (_gpgme_release_verify_result): Rename RES to RESULT.
1360         Rename R2 to NEXT_RESULT.
1361         (intersect_stati): Rename RES to RESULT.
1362         (gpgme_get_sig_status): Likewise.  Do not check return_type, but
1363         the member verify of result.
1364         (gpgme_get_sig_key): Likewise.
1365
1366         * sign.c (_gpgme_release_sign_result): Rename RES to RESULT.  If
1367         RESULT is zero, return.
1368         (sign_status_handler, command_handler): Do not check return_type,
1369         but the member sign of result.
1370         (gpgme_op_sign): Likewise.  Drop assertion.
1371
1372         * encrypt.c (_gpgme_release_encrypt_result): Rename RES to RESULT.
1373         If RESULT is zero, return.
1374         (encrypt_status_handler): Do not check return_type, but the member
1375         encrypt of result.
1376         (gpgme_op_encrypt): Likewise.  Drop assertion.
1377
1378         * decrypt.c (_gpgme_release_decrypt_result): Rename RES to RESULT.
1379         (create_result_struct): Do not set result_type.
1380         (command_handler, decrypt_status_handler): Do not check
1381         return_type, but the member decrypt of result.
1382         (gpgme_op_decrypt): Likewise.  Drop assertion.
1383
1384         * context.h (enum ResultType): Removed.
1385         (struct gpgme_context_s): Remove member result_type.
1386         (struct result): Replaces union result.
1387         * gpgme.c: Include string.h.
1388         (_gpgme_release_result): Release all members of c->result, which
1389         is now a struct.  Zero out all members of the struct afterwards.
1390
1391 2001-11-11  Marcus Brinkmann  <marcus@g10code.de>
1392
1393         * rungpg.c (_gpgme_gpg_release): Release GPG->cmd.cb_data.
1394         Release all members of the list GPG->arglist.
1395         Reported by Michael Schmidt <mschmidt@cs.uni-sb.de>.
1396
1397 2001-11-02  Marcus Brinkmann  <marcus@g10code.de>
1398
1399         * rungpg.c (pipemode_copy): Change type of NBYTES to size_t.
1400
1401         * key.c: Include string.h.
1402         * data.c: Likewise.
1403         * recipient.c: Likewise.
1404
1405 2001-10-29  Marcus Brinkmann  <marcus@g10code.de>
1406
1407         * context.h: New member signers_len.
1408         * signers.c (gpgme_signers_clear): Require that signers are
1409         non-NULL with assertion.  Use signers_len to determine how much
1410         keys to release.  Add documentation.
1411         (gpgme_signers_add): Use signers_len to determine if the buffer is
1412         large enough.  Use xtryrealloc rather than xtrymalloc and copying.
1413         Add documentation.
1414         (gpgme_signers_enum): Use signers_len to determine if key is
1415         available.  Add documentation.
1416
1417 2001-10-22  Marcus Brinkmann  <marcus@g10code.de>
1418
1419         * data.c (_gpgme_data_append): Check if LENGTH is smaller than
1420         ALLOC_CHUNK, not DH->length.
1421
1422 2001-10-17  Marcus Brinkmann  <marcus@g10code.de>
1423
1424         * gpgme.c (gpgme_set_protocol): Fix last change.
1425
1426 2001-10-15  Werner Koch  <wk@gnupg.org>
1427
1428         * gpgme.h (GpgmeProtocol): New.
1429         * gpgme.c (gpgme_set_protocol): New.
1430
1431 2001-09-26  Werner Koch  <wk@gnupg.org>
1432
1433         * gpgme.c (gpgme_set_passphrase_cb): Ignore a NULL context.
1434         (gpgme_set_progress_cb): Ditto. Suggested by Mark Mutz.
1435
1436 2001-09-17  Werner Koch  <wk@gnupg.org>
1437
1438         * keylist.c (finish_key): Shortcut for no tmp_key.  Changed all
1439         callers to use this function without a check for tmp_key.
1440         
1441         * keylist.c (gpgme_op_keylist_next): Reset the key_cond after
1442         emptying the queue.  Bug reported by Stéphane Corthésy.
1443
1444 2001-09-12  Werner Koch  <wk@gnupg.org>
1445
1446         * data.c (gpgme_data_rewind): Allow rewind for callbacks.
1447
1448 2001-09-07  Werner Koch  <wk@gnupg.org>
1449
1450         * rungpg.h: Add NO_RECP.
1451         * encrypt.c (encrypt_status_handler): Take on No_RECP.
1452         (gpgme_op_encrypt): Better error return.
1453
1454         * verify.c (verify_status_handler): Take on NODATA.
1455
1456 2001-09-03  Werner Koch  <wk@gnupg.org>
1457
1458         * rungpg.h: Added STATUS_INV_RECP.
1459         * gpgme.c (_gpgme_release_result): Add support for new
1460         EncryptResult object.
1461         * encrypt.c (append_xml_encinfo): New.
1462         (encrypt_status_handler): Add some status parsing.
1463         (_gpgme_release_encrypt_result): New.
1464
1465 2001-08-29  Werner Koch  <wk@gnupg.org>
1466
1467         * recipient.c (gpgme_recipients_release): Free the list.  By Timo.
1468
1469         * keylist.c (keylist_colon_handler): Do a finish key if we receive
1470         an EOF here.  This is probably the reason for a lot of bugs
1471         related to keylisting.  It is so obvious.  Kudos to Enno Cramer
1472         for pointing that out. 
1473
1474 2001-08-28  Werner Koch  <wk@gnupg.org>
1475
1476         * gpgme.c, gpgme.h (gpgme_get_op_info): New.
1477         (_gpgme_set_op_info): New. 
1478         (_gpgme_release_result): Reset the op_info here.
1479         * sign.c (append_xml_siginfo): New.
1480         (sign_status_handler): Store the sig create information.
1481
1482 2001-07-31  Werner Koch  <wk@gnupg.org>
1483
1484         * encrypt.c (gpgme_op_encrypt): Hack to detect no valid recipients.
1485
1486 2001-07-30  Werner Koch  <wk@gnupg.org>
1487
1488         * gpgme.c (gpgme_get_armor,gpgme_get_textmode): New.
1489
1490         * rungpg.c (build_argv): Disable armor comments
1491         * w32-io.c (build_commandline): Need to add quotes here
1492
1493 2001-07-24  Werner Koch  <wk@gnupg.org>
1494
1495         * data.c (gpgme_data_read): Add a a way to return the available bytes.
1496
1497 2001-07-23  Werner Koch  <wk@gnupg.org>
1498
1499         * util.c: Removed stpcpy() because we use the version from jnlib.
1500
1501 2001-07-19  Werner Koch  <wk@gnupg.org>
1502
1503         * mkstatus: Define the collating sequence for sort.
1504
1505 2001-06-26  Werner Koch  <wk@gnupg.org>
1506
1507         * rungpg.h: Add STATUS_UNEXPECTED as suggested by Timo.
1508
1509 2001-06-15  Werner Koch  <wk@gnupg.org>
1510
1511         * keylist.c (set_userid_flags): Fixed the assigned values. Kudos
1512         to Timo for pointing this out.
1513
1514 2001-06-01  Werner Koch  <wk@gnupg.org>
1515
1516         * debug.c (_gpgme_debug_begin): Fixed a /tmp race.  Noted by
1517         Johannes Poehlmann.
1518
1519 2001-05-28  Werner Koch  <wk@gnupg.org>
1520
1521         * version.c (gpgme_check_engine): Stop version number parsing at
1522         the opening angle and not the closing one.  By Tommy Reynolds.
1523
1524 2001-05-01  José Carlos García Sogo <jose@jaimedelamo.eu.org>
1525
1526         * encrypt.c (gpgme_op_encrypt_start): Deleted the assert ( !c->gpg )
1527         line, because it gave an error if another operation had been made 
1528         before using the same context.
1529         
1530         * decrypt.c (gpgme_op_decrypt_start): The same as above. Also added 
1531         one line to release the gpg object in the context (if any).
1532         
1533 2001-04-26  Werner Koch  <wk@gnupg.org>
1534
1535         * key.c, key.h (_gpgme_key_cache_init): New.
1536         (_gpgme_key_cache_add): New.
1537         (_gpgme_key_cache_get): New.
1538         * version.c (do_subsystem_inits): Init the cache.
1539         * keylist.c (finish_key): Put key into the cache
1540         * verify.c (gpgme_get_sig_key): First look into the cache.
1541
1542 2001-04-19  Werner Koch  <wk@gnupg.org>
1543
1544         * keylist.c (parse_timestamp): Adjusted for the changed
1545         --fixed-list-mode of gpg 1.0.4h.
1546
1547 2001-04-05  Werner Koch  <wk@gnupg.org>
1548
1549         * verify.c (gpgme_op_verify_start): Enabled pipemode for detached sigs.
1550
1551 2001-04-04  Werner Koch  <wk@gnupg.org>
1552
1553         * w32-io.c (_gpgme_io_select): Don't select on the writer if there
1554         are still bytes pending.  Timo found this not easy to track down
1555         race condition. 
1556
1557 2001-04-02  Werner Koch  <wk@gnupg.org>
1558
1559         * gpgme.h: Add GPGME_ATTR_KEY_{EXPIRED,DISABLED}.
1560         * key.c (gpgme_key_get_ulong_attr): And return those attribs.
1561
1562         * verify.c (gpgme_get_sig_key): Set keyliosting mode depending on 
1563         the mode set in the current context.  Suggested by Timo.
1564
1565         * key.c (gpgme_key_get_ulong_attr): Return can_certify and not
1566         can_encrypt. By Timo.
1567
1568 2001-03-30  Werner Koch  <wk@gnupg.org>
1569
1570         * debug.c (debug_init): Allow to specify a debug file.
1571         (_gpgme_debug_level): New.
1572
1573         * posix-io.c (_gpgme_io_read, _gpgme_io_write): Print output.
1574         (_gpgme_io_select): Debug only with level > 2.
1575
1576 2001-03-15  Werner Koch  <wk@gnupg.org>
1577
1578         * rungpg.c: Included time.h.
1579
1580         * key.h: New keyflags for capabilities.
1581         * keylist.c (set_mainkey_capability, set_subkey_capability): New.
1582         (keylist_colon_handler): Parse them.
1583         * gpgme.h: New attribute values for capabilties.
1584         * key.c (gpgme_key_get_string_attr): Return them.
1585         (capabilities_to_string): New.
1586         (gpgme_key_get_ulong_attr): Return the global caps.
1587
1588 2001-03-14  Werner Koch  <wk@gnupg.org>
1589
1590         * w32-io.c (destroy_reader,destroy_writer): Fixed syntax error. 
1591         Thanks to Jan Oliver Wagner.
1592
1593 2001-03-13  Werner Koch  <wk@gnupg.org>
1594
1595         * context.h: Add invalid and revoke flags to user_id structure.
1596         * keylist.c (gpgme_op_keylist_start): Use --fixed-list-mode.
1597         (keylist_colon_handler): Adjust for that.
1598         (set_userid_flags): New. 
1599         (set_mainkey_trust_info): Handle new key invalid flag
1600         (set_subkey_trust_info): Ditto.
1601         * gpgme.h: Add new attributes for key and user ID flags.
1602         * key.c (_gpgme_key_append_name): Init these flags
1603         (gpgme_key_get_as_xml): Print them.
1604         (one_uid_as_xml): New helper for above.
1605         (gpgme_key_get_string_attr, gpgme_key_get_ulong_attr):
1606         Return the new attributes.  Enhanced, so that subkey information
1607         can be returned now.
1608
1609 2001-02-28  Werner Koch  <wk@gnupg.org>
1610
1611         * w32-io.c (destroy_reader): Set stop_me flag.
1612         (writer,create_writer,destroy_writer,find_writer,kill_writer): New.
1613         (_gpgme_io_write): Use a writer thread to avaoid blocking.
1614         (_gpgme_io_close): Cleanup a writer thread
1615         (_gpgme_io_select): Repalce tthe faked wait on writing by a real
1616         waiting which is now possible due to the use of a writer thread.
1617
1618 2001-02-20  Werner Koch  <wk@gnupg.org>
1619
1620         * w32-io.c (destroy_reader,kill_reader): New. 
1621         (create_reader, reader): Add a new event to stop the thread.
1622         (_gpgme_io_close): Kill the reader thread.
1623
1624         * posix-io.c (_gpgme_io_select): Handle frozen fds here. 
1625         * 32-io.c (_gpgme_io_select): Ditto. Removed a bunch of unused code.
1626
1627         * wait.c: Reworked the whole thing.
1628         * rungpg.c (_gpgme_gpg_new): Init pid to -1.
1629         (_gpgme_gpg_release): Remove the process from the wait queue.
1630
1631 2001-02-19  Werner Koch  <wk@gnupg.org>
1632
1633         * w32-io.c (_gpgme_io_set_close_notify): New.
1634         (_gpgme_io_close): Do the notification.
1635
1636         * posix-io.c (_gpgme_io_select): Use a 1 sec timeout and not 200
1637         microseconds.
1638
1639         * wait.c (remove_process): Don't close the fd here.
1640         (do_select): Set the fd to -1 and remove the is_closed flag everywhere.
1641         (_gpgme_wait_on_condition): Remove the assert on the queue and
1642         break out if we could not find the queue.  The whole thing should
1643         be reworked.
1644
1645         * posix-io.c (_gpgme_io_set_close_notify): New.
1646         (_gpgme_io_close): Do the notification.
1647
1648         * rungpg.c (close_notify_handler): New. 
1649         (_gpgme_gpg_new): Register a callback for the fd.
1650         (_gpgme_gpg_set_colon_line_handler): Ditto.
1651         (build_argv): Ditto
1652
1653 2001-02-13  Werner Koch  <wk@gnupg.org>
1654
1655         * rungpg.c (struct reap_s): Replaced pid_t by int.
1656
1657         * types.h: Add ulong typedef.
1658
1659         * rungpg.c (do_reaping,_gpgme_gpg_housecleaning): New.
1660         (_gpgme_gpg_release): Reap children.
1661         * io.h, posix-io.c (_gpgme_io_kill): New.
1662         * w32-io.c (_gpgme_io_kill): New (dummy).
1663
1664         * keylist.c (gpgme_op_keylist_start): Cancel a pending request.
1665
1666         * posix-io.c (_gpgme_io_read): Add some debug output. 
1667         (_gpgme_io_write): Ditto.
1668         (_gpgme_io_select): Increased the timeout.
1669
1670 2001-02-12  Werner Koch  <wk@gnupg.org>
1671
1672         Enhanced the signature verification, so that it can how handle
1673         more than one signature and is able to return more information on 
1674         the signatures.
1675         * verify.c (gpgme_get_sig_key): New.
1676         (gpgme_get_sig_status): New.
1677
1678         * gpgme.h: Add stdio.h. 
1679         (GpgmeSigStat): New status DIFF.
1680
1681 2001-02-01  Werner Koch  <wk@gnupg.org>
1682
1683         * w32-io.c (set_synchronize): Add EVENT_MODIFY_STATE.  Add Debug
1684         code to all Set/ResetEvent().
1685
1686         * rungpg.c (read_status): Check for end of stream only if we have
1687         an r.  By Timo.
1688
1689 2001-01-31  Werner Koch  <wk@gnupg.org>
1690
1691         * wait.c (_gpgme_wait_on_condition): Removed all exit code processing.
1692         (propagate_term_results,clear_active_fds): Removed.
1693         (count_active_fds): Renamed to .. 
1694         (count_active_and_thawed_fds): .. this and count only thawed fds. 
1695
1696         * rungpg.c (gpg_colon_line_handler): Return colon.eof and not
1697         status.eof ;-)
1698
1699 2001-01-30  Werner Koch  <wk@gnupg.org>
1700
1701         * w32-io.c (_gpgme_io_spawn): Use the supplied path arg.
1702
1703         * version.c (get_engine_info): Return better error information.
1704
1705         * posix-util.c, w32-util.c: New.
1706         (_gpgme_get_gpg_path): New, suggested by Jan-Oliver.
1707         * rungpg.c (_gpgme_gpg_spawn): Use new function to get GPG's path.
1708
1709         * signers.c (gpgme_signers_add): Ooops, one should test code and
1710         not just write it; the newarr was not assigned.  Thanks to José
1711         for pointing this out.  Hmmm, still not tested, why shoudl a coder
1712         test his fix :-)
1713
1714         * w32-io.c: Does now use reader threads, so that we can use
1715         WaitForMultipleObjects. 
1716         * sema.h, posix-sema.c, w32-sema.c: Support for Critcial sections.
1717         Does currently only work for W32.
1718
1719         * debug.c, util.h : New. Changed all fprintfs to use this new
1720         set of debugging functions.
1721
1722 2001-01-23  Werner Koch  <wk@gnupg.org>
1723
1724         * data.c (_gpgme_data_release_and_return_string): Fixed string
1725         termination.
1726
1727 2001-01-22  Werner Koch  <wk@gnupg.org>
1728
1729         * delete.c: New.
1730
1731         * signers.c: New.
1732         * key.c (gpgme_key_ref, gpgme_key_unref): New.
1733         * sign.c (gpgme_op_sign_start): Allow the use of other keys.
1734
1735         * version.c (gpgme_get_engine_info,gpgme_check_engine): New.
1736         * rungpg.c (_gpgme_gpg_set_simple_line_handler): New.
1737
1738 2001-01-05  Werner Koch  <wk@gnupg.org>
1739
1740         * data.c (gpgme_data_rewind): Allow to rewind data_type_none.
1741
1742
1743  Copyright 2001, 2002 g10 Code GmbH
1744
1745  This file is free software; as a special exception the author gives
1746  unlimited permission to copy and/or distribute it, with or without
1747  modifications, as long as this notice is preserved.
1748
1749  This file is distributed in the hope that it will be useful, but
1750  WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
1751  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1752