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