2002-02-02 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / gpgme / ChangeLog
1 2002-02-02  Marcus Brinkmann  <marcus@g10code.de>
2
3         This patch has gotten a bit large... mmh.  The main thing that
4         happens here is that error values are now not determined in the
5         operation function after gpgme_wait completed, but in the status
6         handler when EOF is received.  It should always be the case that
7         either an error is flagged or EOF is received, so that after a
8         gpgme_wait you should never have the situation that no error is
9         flagged and EOF is not received.  One problem is that the engine
10         status handlers don't have access to the context, a horrible
11         kludge works around this for now.  All errors that happen during a
12         pending operation should be catched and reported in ctx->error,
13         including out-of-core and cancellation.  This rounds up neatly a
14         couple of loose ends, and makes it possible to pass up any errors
15         in the communication with the backend as well.  As a bonus, there
16         will be a function to access gpgme->wait, so that the operations
17         can truly be implemented with their _start function.
18
19         * engine-gpgsm.c (gpgsm_status_handler): Horrible kludge to report
20         error back to the context.
21         * rungpg.c (gpg_status_handler): Same horrible kludge applied here.
22
23         * engine-gpgsm.c (gpgsm_assuan_simple_command): Add error checking.
24
25         * wait.c (_gpgme_wait_on_condition): If canceled, set CTX->error
26         to a value indication that.
27
28         * verify.c (add_notation): Set error, not out_of_core.
29         (finish_sig): Likewise.
30         (gpgme_op_verify_start): Don't clear out_of_core.
31         (_gpgme_verify_status_handler): At EOF, clean up the notation data.
32         (gpgme_op_verify): And don't do it here.
33
34         * trustlist.c (trustlist_status_handler): Check error, not out_of_core.
35         (gpgme_op_trustlist_start): Don't clear out_of_core.
36         (gpgme_op_trustlist_next): Check error, not out_of_core.
37         (gpgme_op_trustlist_end): Likewise.
38
39         * ops.h (test_and_allocate_result): New macro.
40         (_gpgme_passphrase_result): Remove prototype.
41         * delete.c (gpgme_op_delete): Return error from context.
42         (delete_status_handler): Use macro test_and_allocate_result.
43         Perform error checking at EOF.
44         (gpgme_op_delete_start): Release result.
45         * passphrase.c (_gpgme_passphrase_status_handler): Use macro
46         test_and_allocate_result, and perform error checking here.
47         (_gpgme_passphrase_result): Function removed.
48         * sign.c (gpgme_op_sign_start): Do not set out_of_core to zero.
49         (gpgme_op_sign): Just return the error value from the context.
50         (sign_status_handler): Only progress if no error is set yet.  If
51         we process an EOF, set the resulting error value (if any).
52         * decrypt.c (_gpgme_decrypt_result): Function removed.
53         (create_result_struct): Function removed.
54         (_gpgme_decrypt_status_handler): Use macro test_and_allocate_result,
55         caclulate error on EOF, do not progress with errors.
56         (_gpgme_decrypt_start): Do not set out_of_core to zero.
57         (gpgme_op_decrypt): Just return the error value from the context.
58         * encrypt.c (encrypt_status_handler): Perform the error checking
59         here.
60         (gpgme_op_encrypt_start): Do not clear out_of_core.
61         * export.c (export_status_handler): Return if error is set in context.
62         (gpgme_op_export_start): Release result.
63         (gpgme_op_export): Return error from context.
64         * decrypt-verify.c (gpgme_op_decrypt_verify): Return the error in
65         the context.
66         * genkey.c (genkey_status_handler): Use macro
67         test_and_allocate_result.  Perform error checking at EOF.
68         (gpgme_op_genkey): Just return the error from context.
69         * import.c (gpgme_op_import): Return the error from context.
70         (import_status_handler): Use macro test_and_allocate_result.
71         * keylist.c (gpgme_op_keylist_start): Do not clear out_of_core.
72         (gpgme_op_keylist_next): Return error of context.
73         (keylist_colon_handler): Set error instead out_of_code.
74         (finish_key): Likewise.
75
76         * context.h: Remove member out_of_core, add member error.
77         * gpgme.c (_gpgme_release_result): Clear error flag.
78
79         * engine.h (_gpgme_engine_get_error): New prototype.
80         * engine.c (_gpgme_engine_get_error): New function.
81         * engine-gpgsm.c (_gpgme_gpgsm_get_error): New function.
82
83         * engine-gpgsm.c (map_assuan_error): New function.
84         (gpgsm_assuan_simple_command): Change return type to GpgmeError,
85         use the new function to map error values.
86         (gpgsm_set_fd): Change return type tp GpgmeError.
87         (_gpgme_gpgsm_op_decrypt): Change type of ERR to GpgmeError.
88         (gpgsm_set_recipients): Likewise.  Change type of return value
89         equivalently.  Adjust error values.
90         (_gpgme_gpgsm_op_import): Likewise.
91         (_gpgme_gpgsm_op_sign): Likewise.
92         (struct gpgsm_object_s): New member error.
93         (gpgsm_status_handler): Set error if error occurs.  Determine
94         error number from ERR line received.  If assuan_read_line fails,
95         terminate the connection.
96
97 2002-02-01  Marcus Brinkmann  <marcus@g10code.de>
98
99         * Makefile.am (MOSTLYCLEANFILES): New variable.
100
101 2002-02-01  Marcus Brinkmann  <marcus@g10code.de>
102
103         * engine-gpgsm.c (gpgsm_status_handler): At error, terminate the
104         connection to the server.
105
106 2002-01-31  Marcus Brinkmann  <marcus@g10code.de>
107
108         * rungpg.h: Add STATUS_KEY_CREATED.
109
110         * progress.c: New file.
111         * Makefile.am (libgpgme_la_SOURCES): Add progress.c.
112
113         * genkey.c (genkey_status_handler): Use
114         _gpgme_progress_status_handler.  Add check for status.
115         (struct genkey_result_s): New structure.
116         (_gpgme_release_genkey_result): New function.
117         (gpgme_op_genkey): Check for error.
118         * gpgme.c (_gpgme_release_result): Call
119         _gpgme_release_genkey_result.
120         * ops.h (_gpgme_release_genkey_result): Add prototype.
121         * types.h (GenKeyResult): New type.
122         * context.h (gpgme_context_s): Add GenKeyResult to member result.
123
124 2002-01-30  Marcus Brinkmann  <marcus@g10code.de>
125
126         * gpgme.c (_gpgme_release_result): Call
127         _gpgme_release_delete_result.
128         * ops.h (_gpgme_release_delete_result): Add prototype.
129         * types.h (DeleteResult): New type.
130         * context.h (gpgme_context_s): Add DeleteResult to member result.
131
132         * delete.c (enum delete_problem): New type.
133         (struct delete_result_s): New structure.
134         (_gpgme_release_delete_result): New function.
135         (delete_status_handler): Implement more status codes.
136         (gpgme_op_delete): Return error on failure.
137
138         * import.c (MAX_IMPORTED_FIELDS): Bump up to 14.
139
140 2002-01-30  Marcus Brinkmann  <marcus@g10code.de>
141
142         * import.c (struct import_result_s): New structure.
143         (_gpgme_release_import_result): New function.
144         (append_xml_impinfo): Likewise.
145         (import_status_handler): Implement.
146         * gpgme.c (_gpgme_release_result): Add call to
147         _gpgme_release_import_result.
148         * ops.h (_gpgme_release_import_result): Add prototype.
149         * types.h (ImportResult): New type.
150         * context.h (gpgme_context_s): Add ImportResult to member result.
151
152         * encrypt.c (gpgme_op_encrypt): Code clean up.
153
154 2002-01-30  Marcus Brinkmann  <marcus@g10code.de>
155
156         * gpgme.h: Add lots of comment and fix the formatting.  Add
157         gpgme_trustlist_end prototype.
158
159 2002-01-29  Marcus Brinkmann  <marcus@g10code.de>
160
161         * gpgme.h: Add new type GpgmeIdleFunc.  Change type of
162         gpgme_register_idle to return and accept this type.
163         * wait.c (gpgme_register_idle): Fix type.
164         Save and return old value of idle_function.
165
166 2002-01-29  Werner Koch  <wk@gnupg.org>
167
168         * engine-gpgsm.c (_gpgme_gpgsm_op_keylist): Implement secret only mode.
169
170         * keylist.c (keylist_colon_handler): Add support for the new "crs"
171         record type.
172
173 2002-01-22  Marcus Brinkmann  <marcus@g10code.de>
174
175         * engine-gpgsm.c (_gpgme_gpgsm_release): Call assuan_disconnect,
176         not assuan_pipe_disconnect.
177
178         * Makefile.am (libgpgme_la_LIBADD): Change to link assuan and
179         jnlib (needed by assuan) statically into libgpgme.  Linking a
180         static library into a shared library this way is not portable.
181
182 2002-01-22  Marcus Brinkmann  <marcus@g10code.de>
183
184         * gpgme.h (GpgmePassphraseCb): Change type of R_HD from void* to
185         void**.
186
187 2002-01-22  Marcus Brinkmann  <marcus@g10code.de>
188
189         * data.c (gpgme_data_new_from_filepart): Change type of LENGTH
190         from off_t to size_t.
191         * gpgme.h: Likewise.
192
193 2002-01-22  Marcus Brinkmann  <marcus@g10code.de>
194
195         * wait.c (_gpgme_wait_on_condition): If the process finished,
196         reset the pending flag.  Also if the operation was cancelled.
197
198         (struct proc_s): Rename READY to DONE.
199         (wait_item_s): Likewise.
200         (set_process_ready): Rename to ...
201         (set_process_done): ... this.
202         (_gpgme_remove_proc_from_wait_queue): Call set_process_done
203         instead set_process_ready.
204         (_gpgme_wait_on_condition): Likewise.
205         (do_select): Rename READY to DONE.
206
207         * verify.c (gpgme_op_verify): Do not set pending to zero here.
208         * sign.c (gpgme_op_sign): Likewise.
209         * import.c (gpgme_op_import): Likewise.
210         * genkey.c (gpgme_op_genkey): Likewise.
211         * export.c (gpgme_op_export): Likewise.
212         * encrypt.c (gpgme_op_encrypt): Likewise.
213         * delete.c (gpgme_op_delete): Likewise.
214         * decrypt-verify.c (gpgme_op_decrypt_verify): Likewise.
215         * decrypt.c (gpgme_op_decrypt): Likewise.
216
217 2002-01-22  Marcus Brinkmann  <marcus@g10code.de>
218
219         * export.c: Cleanup.
220
221 2002-01-15  Marcus Brinkmann  <marcus@g10code.de>
222
223         * trustlist.c: Various source clean ups.
224         (my_isdigit): Removed.
225         (gpgme_op_trustlist_end): New function.
226
227 2002-01-13  Marcus Brinkmann  <marcus@g10code.de>
228
229         * gpgme.c: Various source clean ups, like renaming C to CTX where
230         appropriate.
231         (gpgme_new): Clear R_CTX before starting the work.
232         (my_isdigit): Removed.
233         (my_isxdigit): Likewise.
234
235         * data.c: Various source clean ups.
236         (gpgme_data_new_from_mem): Check BUFFER after clearing R_DH.
237         (gpgme_data_new_with_read_cb): Similar for READ_CB.
238         (gpgme_data_new_from_file): Loop over fread while EINTR.
239         (gpgme_data_new_from_filepart): Rediddled a bit.  Allow LENGTH to
240         be zero.  Loop over fread while EINTR.
241
242         (my_isdigit): Removed.
243         (my_isxdigit): Likewise.
244
245 2001-12-21  Marcus Brinkmann  <marcus@g10code.de>
246
247         * engine-gpgsm.c (_gpgme_gpgsm_new): Replace General_Error with
248         Pipe_Error where appropriate.
249
250 2001-12-19  Marcus Brinkmann  <marcus@g10code.de>
251
252         * engine.c: Include `string.h'.  Reported by Stéphane Corthésy.
253
254         * version.c (get_engine_info): Remove prototype.
255
256 2001-12-19  Marcus Brinkmann  <marcus@g10code.de>
257
258         * engine-gpgsm.c (_gpgme_gpgsm_new): New variable CHILD_FDS.
259         Fill it with the servers fds, and pass it to assuan_pipe_connect.
260
261 2001-12-18  Marcus Brinkmann  <marcus@g10code.de>
262
263         * keylist.c (gpgme_op_keylist_end): New function.
264         * gpgme.h (gpgme_op_keylist_end): New prototype.
265
266         * engine.h (gpgme_engine_check_version): Move prototype to ...
267         * gpgme.h (gpgme_engine_check_version): ... here.
268
269         * genkey.c (gpgme_op_genkey_start): Remove unused variable.
270
271 2001-12-18  Marcus Brinkmann  <marcus@g10code.de>
272
273         * version.c (gpgme_get_engine_info): Reimplemented.
274         (gpgme_check_engine): Reimplemented.
275         (_gpgme_compare_versions): Return NULL if MY_VERSION is NULL.
276
277         * engine.c: Include `io.h'.
278         (gpgme_engine_get_info): New function.
279         * engine.h (gpgme_engine_check_version, _gpgme_engine_get_info):
280         Add prototype.
281
282 2001-12-18  Marcus Brinkmann  <marcus@g10code.de>
283
284         * rungpg.c (struct reap_s, reap_list, reap_list_lock): Moved to ...
285         * engine.c (struct reap_s, reap_list, reap_list_lock): ... here.
286         Include `time.h', `sys/types.h', `assert.h', and `sema.h'.
287
288         * rungpg.c (_gpgme_engine_add_child_to_reap_list): New function.
289         (do_reaping, _gpgme_gpg_housecleaning): Moved to ...
290         * engine.c (do_reaping, _gpgme_engine_housecleaning): ... here.
291         * rungpg.c (_gpgme_gpg_release): Replace code that is now in its
292         own function by call to _gpgme_engine_add_child_to_reap_list().
293
294         * wait.c: Include `engine.h'.
295         (run_idle): Call _gpgme_engine_housecleaning(), not
296         _gpgme_gpg_housecleaning().
297         
298 2001-12-18  Marcus Brinkmann  <marcus@g10code.de>
299
300         * key.c (_gpgme_key_append_name): Append, not prepend, the uid.
301         Initialize the next field of the uid structure.
302         (gpgme_key_get_as_xml): Do not list last uid first.
303
304 2001-12-17  Marcus Brinkmann  <marcus@g10code.de>
305
306         * engine-gpgsm.c (_gpgme_gpgsm_set_colon_line_handler): New
307         function [!ENABLE_GPGSM].
308
309 2001-12-14  Marcus Brinkmann  <marcus@g10code.de>
310
311         * engine-gpgsm.c (_gpgme_gpgsm_op_verify): Put TEXT into
312         message_data, not SIG.
313         (_gpgme_gpgsm_op_sign): Use `--detached', not `--detach'.
314
315         * sign.c (sign_status_handler): Call
316         _gpgme_passphrase_status_handler early.
317
318 2001-12-14  Marcus Brinkmann  <marcus@g10code.de>
319
320         * engine-gpgsm.c: Revert last change.
321
322 2001-12-14  Marcus Brinkmann  <marcus@g10code.de>
323
324         * engine-gpgsm.c (gpgsm_status_handler): Freeze the output file
325         handler when ending this operation, otherwise the wait function
326         will sit on it.
327
328 2001-12-14  Marcus Brinkmann  <marcus@g10code.de>
329
330         * engine-gpgsm.c (struct gpgsm_object_s): New member colon.attic.
331         (_gpgme_gpgsm_new): Initialize some more members.
332         (_gpgme_gpgsm_release): Free the colon line handler's attic line.
333         (gpgsm_status_handler): Rework the inline-data processing.
334
335 2001-12-13  Marcus Brinkmann  <marcus@g10code.de>
336
337         * rungpg.c (_gpgme_gpg_spawn): Do not add the fds to the child
338         list that are not dup'ed, for those the close-on-exec flag is set
339         now.
340         * version.c (_gpgme_get_program_version): Remove first entry in
341         CFD, as the close-on-exec flag is now set for this fd.
342
343 2001-12-13  Marcus Brinkmann  <marcus@g10code.de>
344
345         * engine-gpgsm.c (_gpgme_gpgsm_op_encrypt): Do not add `armor'
346         option to `ENCRYPT'.
347         * engine-gpgsm.c (gpgsm_set_recipients): Free LINE when returning
348         successfully.
349
350 2001-12-13  Marcus Brinkmann  <marcus@g10code.de>
351
352         * engine-gpgsm.c (close_notify_handler): New function.
353         (_gpgme_gpgsm_new): Manage the file descriptors a
354         bit differently.  Do not set close-on-exec flags.
355         (_gpgme_gpgsm_op_decrypt): Do not set message_fd
356         to -1, this is done by the close handler.
357         (_gpgme_gpgsm_op_encrypt): Likewise.
358         (_gpgme_gpgsm_op_import): Likewise (also for output_fd).
359         (_gpgme_gpgsm_op_keylist): Likewise (also for input_fd and output_fd).
360         (_gpgme_gpgsm_op_sign): Likewise.
361         (_gpgme_gpgsm_op_verify): Likewise, but for output_fd.
362
363         * posix-io.c (_gpgme_io_pipe): Set the close-on-exec flag for the
364         non-inherited file descriptor index of the pipe.
365
366 2001-12-13  Werner Koch  <wk@gnupg.org>
367
368         * engine-gpgsm.c (_gpgme_gpgsm_set_colon_line_handler): New.
369         (gpgsm_status_handler): Pass datalines to a colon handler
370         * engine.c (_gpgme_engine_set_colon_line_handler): Set the colon
371         handler for gpgsm.
372
373         * engine-gpgsm.c (_gpgme_gpgsm_op_keylist): Allow NULL for
374         pattern.
375         (gpgsm_assuan_simple_command): Removed underscore from
376         assuan_write_line.
377         (_gpgme_gpgsm_start): Ditto.
378         (gpgsm_assuan_simple_command): Replaced interal Assuan read
379         function by the new assuan_read_line.  Removed the use of the
380         internal header.
381         (gpgsm_status_handler): Ditto. Use the new assuan_pending_line.
382         (_gpgme_gpgsm_start): Use the documented way to get an fd from
383         assuan.
384
385         * keylist.c (keylist_colon_handler): Handle "crt" records
386         * key.h (gpgme_key_s): Add an x509 flag.
387         * key.c (parse_x509_user_id): New.
388         (_gpgme_key_append_name): Handle x.509 names.
389
390 2001-12-05  Marcus Brinkmann  <marcus@g10code.de>
391
392         * engine-gpgsm.c (gpgsm_status_handler): Make it work with current
393         version of assuan.
394
395 2001-12-05  Marcus Brinkmann  <marcus@g10code.de>
396
397         * engine-gpgsm.c (gpgsm_set_fd): Accept one more argument OPT.
398         (_gpgme_gpgsm_op_encrypt): Pass armor argument to gpgsm_set_fd for
399         output descriptor.
400         (_gpgme_gpgsm_op_sign): Likewise.
401
402 2001-12-05  Marcus Brinkmann  <marcus@g10code.de>
403
404         * keylist.c (gpgme_op_keylist_next): Set pending to 0 if EOF
405         occurs.
406
407 2001-11-26  Marcus Brinkmann  <marcus@g10code.de>
408
409         * engine-gpgsm.c (_gpgme_gpgsm_op_sign): Fix stupid typo.
410
411 2001-11-24  Marcus Brinkmann  <marcus@g10code.de>
412
413         * engine-gpgsm.c (gpgsm_status_handler): Don't break if bsearch fails.
414         Deal with assuan read line returning more than one line (for now).
415
416 2001-11-23  Marcus Brinkmann  <marcus@g10code.de>
417
418         * engine-gpgsm.c (_gpgme_gpgsm_op_sign): Implement it according to
419         the current protocol definition.
420
421 2001-11-23  Marcus Brinkmann  <marcus@g10code.de>
422
423         * engine-gpgsm.c (_gpgme_gpgsm_new): Set CLOEXEC flag for parent
424         ends of the pipe.
425
426 2001-11-22  Marcus Brinkmann  <marcus@g10code.de>
427
428         * engine-gpgsm.c: Include stdlib.h and string.h.  Also include,
429         for now, rungpg.h and status-table.h.
430         (gpgsm_status_handler): Implement more of the status handler.
431
432 2001-11-22  Marcus Brinkmann  <marcus@g10code.de>
433
434         * engine.c (_gpgme_engine_op_decrypt): Implement CMS case.
435         (_gpgme_engine_op_delete): Likewise.
436         (_gpgme_engine_op_encrypt): Likewise.
437         (_gpgme_engine_op_export): Likewise.
438         (_gpgme_engine_op_genkey): Likewise.
439         (_gpgme_engine_op_keylist): Likewise.
440         (_gpgme_engine_op_sign): Likewise.
441         (_gpgme_engine_op_trustlist): Likewise.
442
443         * engine-gpgsm.c (_gpgme_gpgsm_op_encrypt): New function.
444         (gpgsm_assuan_simple_command): Likewise.
445         (gpgsm_set_recipients): Likewise.
446         (gpgsm_set_fd): Reimplement using gpgsm_assuan_simple_command.
447         (_gpgme_gpgsm_op_delete): New function.
448         (_gpgme_gpgsm_op_export): Likewise.
449         (_gpgme_gpgsm_op_genkey): Likewise.
450         (_gpgme_gpgsm_op_sign): Likewise.
451         (_gpgme_gpgsm_op_keylist): Likewise.
452         (_gpgme_gpgsm_op_trustlist): Likewise.
453         (_gpgme_gpgsm_release): Release command.
454         (_gpgme_gpgsm_op_decrypt): Allocate command.
455         (_gpgme_gpgsm_op_import): Likewise.
456         (gpgsm_status_handler): Also treat `ERR' strings as EOF.
457
458 2001-11-22  Marcus Brinkmann  <marcus@g10code.de>
459
460         * gpgme.h (gpgme_set_protocol): New prototype.
461
462 2001-11-22  Marcus Brinkmann  <marcus@g10code.de>
463
464         * engine-gpgsm.c (_gpgme_gpgsm_op_decrypt): New function.
465         (_gpgme_gpgsm_op_import): Likewise.
466
467 2001-11-22  Marcus Brinkmann  <marcus@g10code.de>
468
469         * engine-gpgsm.c: Shuffle around header inclusion a bit, to still
470         keep them seperate.
471         (_gpgme_set_status_handler) [!ENABLE_GPGSM]: New function.
472
473 2001-11-22  Werner Koch  <wk@gnupg.org>
474
475         * engine-gpgsm.c: Include more headers so that NULL and mk_error
476         is defined even with an undefined GPGSM_PATH.
477
478 2001-11-22  Marcus Brinkmann  <marcus@g10code.de>
479
480         * rungpg.c (gpg_inbound_handler, write_mem_data, write_cb_data,
481         gpg_outbound_handler): Moved to ...
482         * data.c (_gpgme_data_inbound_handler, write_mem_data,
483         write_cb_data, _gpgme_data_outbound_handler): ... here.  Make the
484         _gpgme_* ones non-static.
485         * data.c: Include io.h.
486
487         * ops.h (_gpgme_data_inbound_handler): New prototype.
488         (_gpgme_data_outbound_handler): Likewise.
489         (_gpgme_gpg_spawn): Use these new functions.
490
491         * engine-gpgsm.h (_gpgme_gpgsm_op_decrypt, _gpgme_gpgsm_op_delete,
492         _gpgme_gpgsm_op_encrypt, _gpgme_gpgsm_op_export,
493         _gpgme_gpgsm_op_genkey, _gpgme_gpgsm_op_import,
494         _gpgme_gpgsm_op_keylist, _gpgme_gpgsm_op_sign,
495         _gpgme_gpgsm_op_trustlist, _gpgme_gpgsm_op_verify,
496         _gpgme_gpgsm_start, _gpgme_gpgsm_set_status_handler): New prototype.
497         Include <rungpg.h> for status handler function.
498
499         * engine-gpgsm.c (struct gpgsm_object_s): New members input_fd,
500         input_data, output_fd, output_data, message_fd, message_data, command
501         and status.
502         (_gpgme_gpgsm_new): Open input, output and message pipes before
503         connecting to the client.  Close server's ends afterwards.
504         (_gpgme_gpgsm_release): Close open file descriptors.  Remove
505         server process from wait queue.
506         (_gpgme_gpgsm_op_verify, _gpgme_gpgsm_start,
507         _gpgme_gpgsm_set_status_handler, gpgms_status_handler): New function.
508         
509         * engine.c (_gpgme_engine_start): Implement for GPGME_PROTOCOL_CMS.
510         (_gpgme_engine_set_status_handler): Likewise.
511         (_gpgme_engine_op_verify): Likewise.
512
513 2001-11-21  Marcus Brinkmann  <marcus@g10code.de>
514
515         * context.h: Do not include rungpg.h, but engine.h.
516         (struct gpgme_context_s): Replace member gpg with engine.
517         * gpgme.c (gpgme_release): Release engine, not gpg.
518
519         * recipient.c (_gpgme_append_gpg_args_from_recifgpients): Function
520         moved ...
521         * rungpg.c (_gpgme_append_gpg_args_from_recipients): ... here.
522         Make static, change order of arguments, and return an error value.
523         * ops.h (_gpgme_append_gpg_args_from_recipients): Removed prototype.
524
525         * rungpg.h (_gpgme_gpg_op_verify): Add prototype.
526         (_gpgme_gpg_op_encrypt): Likewise.
527         (_gpgme_gpg_op_decrypt): Likewise.
528         (_gpgme_gpg_op_delete): Likewise.
529         (_gpgme_gpg_op_export): Likewise.
530         (_gpgme_gpg_op_genkey): Likewise.
531         (_gpgme_gpg_op_import): Likewise.
532         (_gpgme_gpg_op_keylist): Likewise.
533         (_gpgme_gpg_op_sign): Likewise.
534         (_gpgme_gpg_op_trustlist): Likewise.
535         * rungpg.c (_gpgme_gpg_op_verify): New function.
536         (_gpgme_gpg_op_encrypt): Likewise.
537         (_gpgme_gpg_op_decrypt): Likewise.
538         (_gpgme_gpg_op_delete): Likewise.
539         (_gpgme_gpg_op_export): Likewise.
540         (_gpgme_gpg_op_genkey): Likewise.
541         (_gpgme_gpg_op_import): Likewise.
542         (_gpgme_gpg_op_keylist): Likewise.
543         (_gpgme_gpg_op_sign): Likewise.
544         (_gpgme_gpg_op_trustlist): Likewise.
545
546         * engine.h (_gpgme_engine_set_status_handler): Add prototype.
547         (_gpgme_engine_set_command_handler): Likewise.
548         (_gpgme_engine_set_colon_line_handler): Likewise.
549         (_gpgme_engine_op_decrypt): Likewise.
550         (_gpgme_engine_op_delete): Likewise.
551         (_gpgme_engine_op_encrypt): Likewise.
552         (_gpgme_engine_op_export): Likewise.
553         (_gpgme_engine_op_genkey): Likewise.
554         (_gpgme_engine_op_import): Likewise.
555         (_gpgme_engine_op_keylist): Likewise.
556         (_gpgme_engine_op_sign): Likewise.
557         (_gpgme_engine_op_trustlist): Likewise.
558         (_gpgme_engine_op_verify): Likewise.
559         (_gpgme_engine_start): Likewise.
560         * engine.c (_gpgme_engine_set_status_handler): New function.
561         (_gpgme_engine_set_command_handler): Likewise.
562         (_gpgme_engine_set_colon_line_handler): Likewise.
563         (_gpgme_engine_op_decrypt): Likewise.
564         (_gpgme_engine_op_delete): Likewise.
565         (_gpgme_engine_op_encrypt): Likewise.
566         (_gpgme_engine_op_export): Likewise.
567         (_gpgme_engine_op_genkey): Likewise.
568         (_gpgme_engine_op_import): Likewise.
569         (_gpgme_engine_op_keylist): Likewise.
570         (_gpgme_engine_op_sign): Likewise.
571         (_gpgme_engine_op_trustlist): Likewise.
572         (_gpgme_engine_op_verify): Likewise.
573         (_gpgme_engine_start): Likewise.
574
575         * verify.c (gpgme_op_verify_start): Reimplement in terms of above
576         functions.
577         * encrypt.c (gpgme_op_encrypt_start): Likewise.
578         * decrypt.c (_gpgme_decrypt_start): Likewise.
579         * passphrase.c (_gpgme_passphrase_start): Likewise.
580         * keylist.c (gpgme_op_keylist_start): Likewise.
581
582 2001-11-20  Marcus Brinkmann  <marcus@g10code.de>
583
584         * types.h: Add types EngineObject and GpgsmObject.
585
586         * Makefile.am (libgpgme_la_SOURCES): Add engine-gpgsm.h,
587         engine-gpgsm.c, engine.h and engine.c.
588         * engine.h: New file.
589         * engine.c: Likewise.
590         * engine-gpgsm.h: Likewise.
591         * engine-gpgsm.c: Likewise.
592         
593         * rungpg.c (_gpgme_gpg_get_version): New function.
594         (_gpgme_gpg_check_version): Likewise.
595         * rungpg.h: Add prototypes for _gpgme_gpg_get_version and
596         _gpgme_gpg_check_version.
597
598         * version.c (compare_versions): Rename to ...
599         (_gpgme_compare_versions): ... this.  Make non-static.
600         (gpgme_check_version): Use _gpgme_compare_versions rather than
601         compare_versions.
602         (gpgme_check_engine): Likewise.
603         * ops.h (_gpgme_get_program_version): Add prototype.
604
605 2001-11-20  Marcus Brinkmann  <marcus@g10code.de>
606
607         * Makefile.am (libgpgme_la_INCLUDES): Remove obsolete directive.
608         (AM_CPPFLAGS): New directive [BUILD_ASSUAN].
609         (libgpgme_la_LIBADD): Likewise.
610
611 2001-11-20  Marcus Brinkmann  <marcus@g10code.de>
612
613         * version.c: Remove global variables lineno and
614         tmp_engine_version.
615         (version_handler): Removed.
616         (_gpgme_get_program_version): New function.
617         (get_engine_info): Don't use context and version_handler,
618         but _gpgme_get_program_version.
619         * ops.h (_gpgme_get_program_version): Add prototype for
620         _gpgme_get_program_version (we expect to use it elsewhere soon).
621
622 2001-11-18  Marcus Brinkmann  <marcus@g10code.de>
623
624         * version.c (get_engine_info): If GnuPG is not available, return
625         an error message.
626         * posix-util.c (_gpgme_get_gpg_path): Allow GPG_PATH to be
627         undefined.
628         (_gpgme_get_gpgsm_path): New function.
629         * w32-util.c (find_program_in_registry): New static function.
630         (_gpgme_get_gpg_path): Allow GPG_PATH to be undefined.  Rework
631         to use find_program_in_registry.
632         (_gpgme_get_gpgsm_path): New function.
633         (util.h): Prototype _gpgme_get_gpgsm_path).
634         * rungpg.c (_gpgme_gpg_spawn): Verify that _gpgme_get_gpg_path()
635         returns non-null.
636
637 2001-11-16  Marcus Brinkmann  <marcus@g10code.de>
638
639         * decrypt-verify.c: New file.
640         * Makefile.am (libgpgme_la_SOURCES): Add decrypt-verify.c.
641         * types.h: Add decrypt-verify types.
642         * ops.h: Likewise.
643         * context.h: Add result type for decrypt-verify.
644         * gpgme.h: Add decrypt-verify prototypes.
645
646         * decrypt.c (decrypt_status_handler): Renamed to ...
647         (_gpgme_decrypt_status_handler): ... this.  Make non-static.
648         (_gpgme_decrypt_start): New function, derived from
649         gpgme_op_decrypt_start.
650         (gpgme_op_decrypt_start): Reimplement in terms of
651         _gpgme_decrypt_start.
652         (_gpgme_decrypt_result): New function to retrieve error value.
653         (gpgme_op_decrypt): Use _gpgme_decrypt_result.
654         * ops.h: Add prototypes for new functions.
655
656         * verify.c (verify_status_handler): Renamed to ...
657         (_gpgme_verify_status_handler): ... this.  Make non-static.
658         (gpgme_op_verify_start): Use new function name.
659         (intersect_stati): Renamed to ...
660         (_gpgme_intersect_stati): ... this.  Make non-static.
661         (gpgme_op_verify): Use new name.
662         * ops.h: Add prototypes for new functions.
663
664 2001-11-16  Marcus Brinkmann  <marcus@g10code.de>
665
666         * passphrase.c: New file.
667         * Makefile.am (libgpgme_la_SOURCES): Add passphrase.c.
668         * ops.h (_gpgme_passphrase_result): Add prototypes from
669         passphrase.c.
670         * types.h: Likewise.
671         * context.h: Add member passphrase to result.
672         * gpgme.c (_gpgme_release_result): Release passphrase member.
673
674         * decrypt.c: Some formatting and variable name changes (like
675         CTX instead C).
676         (struct decrypt_result_s): Remove members now found in
677         passphrase result.
678         (_gpgme_release_decrypt_result): Don't release removed members.
679         (decrypt_status_handler): Call _gpgme_passphrase_status_handler,
680         and don't handle the cases catched there.
681         (command_handler): Removed.
682         (gpgme_op_decrypt_start): Don't set command handler, but invoke
683         _gpgme_passphrase_start which does it.
684         (gpgme_op_decrypt): Invoke _gpgme_passphrase_result and drop the
685         cases covered by it.
686
687         * sign.c Some formatting and variable name changes (like
688         CTX instead C).
689         (struct sign_result_s): Remove members now found in
690         passphrase result.
691         (_gpgme_release_sign_result): Don't release removed members.
692         (sign_status_handler): Call _gpgme_passphrase_status_handler,
693         and don't handle the cases catched there.
694         (command_handler): Removed.
695         (gpgme_op_sign_start): Don't set command handler, but invoke
696         _gpgme_passphrase_start which does it.
697         (gpgme_op_sign): Invoke _gpgme_passphrase_result and drop the
698         cases covered by it.
699
700 2001-11-15  Marcus Brinkmann  <marcus@g10code.de>
701
702         * decrypt.c (command_handler): Fix last change.
703
704 2001-11-15  Marcus Brinkmann  <marcus@g10code.de>
705
706         * verify.c (_gpgme_release_verify_result): Rename RES to RESULT.
707         Rename R2 to NEXT_RESULT.
708         (intersect_stati): Rename RES to RESULT.
709         (gpgme_get_sig_status): Likewise.  Do not check return_type, but
710         the member verify of result.
711         (gpgme_get_sig_key): Likewise.
712
713         * sign.c (_gpgme_release_sign_result): Rename RES to RESULT.  If
714         RESULT is zero, return.
715         (sign_status_handler, command_handler): Do not check return_type,
716         but the member sign of result.
717         (gpgme_op_sign): Likewise.  Drop assertion.
718
719         * encrypt.c (_gpgme_release_encrypt_result): Rename RES to RESULT.
720         If RESULT is zero, return.
721         (encrypt_status_handler): Do not check return_type, but the member
722         encrypt of result.
723         (gpgme_op_encrypt): Likewise.  Drop assertion.
724
725         * decrypt.c (_gpgme_release_decrypt_result): Rename RES to RESULT.
726         (create_result_struct): Do not set result_type.
727         (command_handler, decrypt_status_handler): Do not check
728         return_type, but the member decrypt of result.
729         (gpgme_op_decrypt): Likewise.  Drop assertion.
730
731         * context.h (enum ResultType): Removed.
732         (struct gpgme_context_s): Remove member result_type.
733         (struct result): Replaces union result.
734         * gpgme.c: Include string.h.
735         (_gpgme_release_result): Release all members of c->result, which
736         is now a struct.  Zero out all members of the struct afterwards.
737
738 2001-11-11  Marcus Brinkmann  <marcus@g10code.de>
739
740         * rungpg.c (_gpgme_gpg_release): Release GPG->cmd.cb_data.
741         Release all members of the list GPG->arglist.
742         Reported by Michael Schmidt <mschmidt@cs.uni-sb.de>.
743
744 2001-11-02  Marcus Brinkmann  <marcus@g10code.de>
745
746         * rungpg.c (pipemode_copy): Change type of NBYTES to size_t.
747
748         * key.c: Include string.h.
749         * data.c: Likewise.
750         * recipient.c: Likewise.
751
752 2001-10-29  Marcus Brinkmann  <marcus@g10code.de>
753
754         * context.h: New member signers_len.
755         * signers.c (gpgme_signers_clear): Require that signers are
756         non-NULL with assertion.  Use signers_len to determine how much
757         keys to release.  Add documentation.
758         (gpgme_signers_add): Use signers_len to determine if the buffer is
759         large enough.  Use xtryrealloc rather than xtrymalloc and copying.
760         Add documentation.
761         (gpgme_signers_enum): Use signers_len to determine if key is
762         available.  Add documentation.
763
764 2001-10-22  Marcus Brinkmann  <marcus@g10code.de>
765
766         * data.c (_gpgme_data_append): Check if LENGTH is smaller than
767         ALLOC_CHUNK, not DH->length.
768
769 2001-10-17  Marcus Brinkmann  <marcus@g10code.de>
770
771         * gpgme.c (gpgme_set_protocol): Fix last change.
772
773 2001-10-15  Werner Koch  <wk@gnupg.org>
774
775         * gpgme.h (GpgmeProtocol): New.
776         * gpgme.c (gpgme_set_protocol): New.
777
778 2001-09-26  Werner Koch  <wk@gnupg.org>
779
780         * gpgme.c (gpgme_set_passphrase_cb): Ignore a NULL context.
781         (gpgme_set_progress_cb): Ditto. Suggested by Mark Mutz.
782
783 2001-09-17  Werner Koch  <wk@gnupg.org>
784
785         * keylist.c (finish_key): Shortcut for no tmp_key.  Changed all
786         callers to use this function without a check for tmp_key.
787         
788         * keylist.c (gpgme_op_keylist_next): Reset the key_cond after
789         emptying the queue.  Bug reported by Stéphane Corthésy.
790
791 2001-09-12  Werner Koch  <wk@gnupg.org>
792
793         * data.c (gpgme_data_rewind): Allow rewind for callbacks.
794
795 2001-09-07  Werner Koch  <wk@gnupg.org>
796
797         * rungpg.h: Add NO_RECP.
798         * encrypt.c (encrypt_status_handler): Take on No_RECP.
799         (gpgme_op_encrypt): Better error return.
800
801         * verify.c (verify_status_handler): Take on NODATA.
802
803 2001-09-03  Werner Koch  <wk@gnupg.org>
804
805         * rungpg.h: Added STATUS_INV_RECP.
806         * gpgme.c (_gpgme_release_result): Add support for new
807         EncryptResult object.
808         * encrypt.c (append_xml_encinfo): New.
809         (encrypt_status_handler): Add some status parsing.
810         (_gpgme_release_encrypt_result): New.
811
812 2001-08-29  Werner Koch  <wk@gnupg.org>
813
814         * recipient.c (gpgme_recipients_release): Free the list.  By Timo.
815
816         * keylist.c (keylist_colon_handler): Do a finish key if we receive
817         an EOF here.  This is probably the reason for a lot of bugs
818         related to keylisting.  It is so obvious.  Kudos to Enno Cramer
819         for pointing that out. 
820
821 2001-08-28  Werner Koch  <wk@gnupg.org>
822
823         * gpgme.c, gpgme.h (gpgme_get_op_info): New.
824         (_gpgme_set_op_info): New. 
825         (_gpgme_release_result): Reset the op_info here.
826         * sign.c (append_xml_siginfo): New.
827         (sign_status_handler): Store the sig create information.
828
829 2001-07-31  Werner Koch  <wk@gnupg.org>
830
831         * encrypt.c (gpgme_op_encrypt): Hack to detect no valid recipients.
832
833 2001-07-30  Werner Koch  <wk@gnupg.org>
834
835         * gpgme.c (gpgme_get_armor,gpgme_get_textmode): New.
836
837         * rungpg.c (build_argv): Disable armor comments
838         * w32-io.c (build_commandline): Need to add quotes here
839
840 2001-07-24  Werner Koch  <wk@gnupg.org>
841
842         * data.c (gpgme_data_read): Add a a way to return the available bytes.
843
844 2001-07-23  Werner Koch  <wk@gnupg.org>
845
846         * util.c: Removed stpcpy() because we use the version from jnlib.
847
848 2001-07-19  Werner Koch  <wk@gnupg.org>
849
850         * mkstatus: Define the collating sequence for sort.
851
852 2001-06-26  Werner Koch  <wk@gnupg.org>
853
854         * rungpg.h: Add STATUS_UNEXPECTED as suggested by Timo.
855
856 2001-06-15  Werner Koch  <wk@gnupg.org>
857
858         * keylist.c (set_userid_flags): Fixed the assigned values. Kudos
859         to Timo for pointing this out.
860
861 2001-06-01  Werner Koch  <wk@gnupg.org>
862
863         * debug.c (_gpgme_debug_begin): Fixed a /tmp race.  Noted by
864         Johannes Poehlmann.
865
866 2001-05-28  Werner Koch  <wk@gnupg.org>
867
868         * version.c (gpgme_check_engine): Stop version number parsing at
869         the opening angle and not the closing one.  By Tommy Reynolds.
870
871 2001-05-01  José Carlos García Sogo <jose@jaimedelamo.eu.org>
872
873         * encrypt.c (gpgme_op_encrypt_start): Deleted the assert ( !c->gpg )
874         line, because it gave an error if another operation had been made 
875         before using the same context.
876         
877         * decrypt.c (gpgme_op_decrypt_start): The same as above. Also added 
878         one line to release the gpg object in the context (if any).
879         
880 2001-04-26  Werner Koch  <wk@gnupg.org>
881
882         * key.c, key.h (_gpgme_key_cache_init): New.
883         (_gpgme_key_cache_add): New.
884         (_gpgme_key_cache_get): New.
885         * version.c (do_subsystem_inits): Init the cache.
886         * keylist.c (finish_key): Put key into the cache
887         * verify.c (gpgme_get_sig_key): First look into the cache.
888
889 2001-04-19  Werner Koch  <wk@gnupg.org>
890
891         * keylist.c (parse_timestamp): Adjusted for the changed
892         --fixed-list-mode of gpg 1.0.4h.
893
894 2001-04-05  Werner Koch  <wk@gnupg.org>
895
896         * verify.c (gpgme_op_verify_start): Enabled pipemode for detached sigs.
897
898 2001-04-04  Werner Koch  <wk@gnupg.org>
899
900         * w32-io.c (_gpgme_io_select): Don't select on the writer if there
901         are still bytes pending.  Timo found this not easy to track down
902         race condition. 
903
904 2001-04-02  Werner Koch  <wk@gnupg.org>
905
906         * gpgme.h: Add GPGME_ATTR_KEY_{EXPIRED,DISABLED}.
907         * key.c (gpgme_key_get_ulong_attr): And return those attribs.
908
909         * verify.c (gpgme_get_sig_key): Set keyliosting mode depending on 
910         the mode set in the current context.  Suggested by Timo.
911
912         * key.c (gpgme_key_get_ulong_attr): Return can_certify and not
913         can_encrypt. By Timo.
914
915 2001-03-30  Werner Koch  <wk@gnupg.org>
916
917         * debug.c (debug_init): Allow to specify a debug file.
918         (_gpgme_debug_level): New.
919
920         * posix-io.c (_gpgme_io_read, _gpgme_io_write): Print output.
921         (_gpgme_io_select): Debug only with level > 2.
922
923 2001-03-15  Werner Koch  <wk@gnupg.org>
924
925         * rungpg.c: Included time.h.
926
927         * key.h: New keyflags for capabilities.
928         * keylist.c (set_mainkey_capability, set_subkey_capability): New.
929         (keylist_colon_handler): Parse them.
930         * gpgme.h: New attribute values for capabilties.
931         * key.c (gpgme_key_get_string_attr): Return them.
932         (capabilities_to_string): New.
933         (gpgme_key_get_ulong_attr): Return the global caps.
934
935 2001-03-14  Werner Koch  <wk@gnupg.org>
936
937         * w32-io.c (destroy_reader,destroy_writer): Fixed syntax error. 
938         Thanks to Jan Oliver Wagner.
939
940 2001-03-13  Werner Koch  <wk@gnupg.org>
941
942         * context.h: Add invalid and revoke flags to user_id structure.
943         * keylist.c (gpgme_op_keylist_start): Use --fixed-list-mode.
944         (keylist_colon_handler): Adjust for that.
945         (set_userid_flags): New. 
946         (set_mainkey_trust_info): Handle new key invalid flag
947         (set_subkey_trust_info): Ditto.
948         * gpgme.h: Add new attributes for key and user ID flags.
949         * key.c (_gpgme_key_append_name): Init these flags
950         (gpgme_key_get_as_xml): Print them.
951         (one_uid_as_xml): New helper for above.
952         (gpgme_key_get_string_attr, gpgme_key_get_ulong_attr):
953         Return the new attributes.  Enhanced, so that subkey information
954         can be returned now.
955
956 2001-02-28  Werner Koch  <wk@gnupg.org>
957
958         * w32-io.c (destroy_reader): Set stop_me flag.
959         (writer,create_writer,destroy_writer,find_writer,kill_writer): New.
960         (_gpgme_io_write): Use a writer thread to avaoid blocking.
961         (_gpgme_io_close): Cleanup a writer thread
962         (_gpgme_io_select): Repalce tthe faked wait on writing by a real
963         waiting which is now possible due to the use of a writer thread.
964
965 2001-02-20  Werner Koch  <wk@gnupg.org>
966
967         * w32-io.c (destroy_reader,kill_reader): New. 
968         (create_reader, reader): Add a new event to stop the thread.
969         (_gpgme_io_close): Kill the reader thread.
970
971         * posix-io.c (_gpgme_io_select): Handle frozen fds here. 
972         * 32-io.c (_gpgme_io_select): Ditto. Removed a bunch of unused code.
973
974         * wait.c: Reworked the whole thing.
975         * rungpg.c (_gpgme_gpg_new): Init pid to -1.
976         (_gpgme_gpg_release): Remove the process from the wait queue.
977
978 2001-02-19  Werner Koch  <wk@gnupg.org>
979
980         * w32-io.c (_gpgme_io_set_close_notify): New.
981         (_gpgme_io_close): Do the notification.
982
983         * posix-io.c (_gpgme_io_select): Use a 1 sec timeout and not 200
984         microseconds.
985
986         * wait.c (remove_process): Don't close the fd here.
987         (do_select): Set the fd to -1 and remove the is_closed flag everywhere.
988         (_gpgme_wait_on_condition): Remove the assert on the queue and
989         break out if we could not find the queue.  The whole thing should
990         be reworked.
991
992         * posix-io.c (_gpgme_io_set_close_notify): New.
993         (_gpgme_io_close): Do the notification.
994
995         * rungpg.c (close_notify_handler): New. 
996         (_gpgme_gpg_new): Register a callback for the fd.
997         (_gpgme_gpg_set_colon_line_handler): Ditto.
998         (build_argv): Ditto
999
1000 2001-02-13  Werner Koch  <wk@gnupg.org>
1001
1002         * rungpg.c (struct reap_s): Replaced pid_t by int.
1003
1004         * types.h: Add ulong typedef.
1005
1006         * rungpg.c (do_reaping,_gpgme_gpg_housecleaning): New.
1007         (_gpgme_gpg_release): Reap children.
1008         * io.h, posix-io.c (_gpgme_io_kill): New.
1009         * w32-io.c (_gpgme_io_kill): New (dummy).
1010
1011         * keylist.c (gpgme_op_keylist_start): Cancel a pending request.
1012
1013         * posix-io.c (_gpgme_io_read): Add some debug output. 
1014         (_gpgme_io_write): Ditto.
1015         (_gpgme_io_select): Increased the timeout.
1016
1017 2001-02-12  Werner Koch  <wk@gnupg.org>
1018
1019         Enhanced the signature verification, so that it can how handle
1020         more than one signature and is able to return more information on 
1021         the signatures.
1022         * verify.c (gpgme_get_sig_key): New.
1023         (gpgme_get_sig_status): New.
1024
1025         * gpgme.h: Add stdio.h. 
1026         (GpgmeSigStat): New status DIFF.
1027
1028 2001-02-01  Werner Koch  <wk@gnupg.org>
1029
1030         * w32-io.c (set_synchronize): Add EVENT_MODIFY_STATE.  Add Debug
1031         code to all Set/ResetEvent().
1032
1033         * rungpg.c (read_status): Check for end of stream only if we have
1034         an r.  By Timo.
1035
1036 2001-01-31  Werner Koch  <wk@gnupg.org>
1037
1038         * wait.c (_gpgme_wait_on_condition): Removed all exit code processing.
1039         (propagate_term_results,clear_active_fds): Removed.
1040         (count_active_fds): Renamed to .. 
1041         (count_active_and_thawed_fds): .. this and count only thawed fds. 
1042
1043         * rungpg.c (gpg_colon_line_handler): Return colon.eof and not
1044         status.eof ;-)
1045
1046 2001-01-30  Werner Koch  <wk@gnupg.org>
1047
1048         * w32-io.c (_gpgme_io_spawn): Use the supplied path arg.
1049
1050         * version.c (get_engine_info): Return better error information.
1051
1052         * posix-util.c, w32-util.c: New.
1053         (_gpgme_get_gpg_path): New, suggested by Jan-Oliver.
1054         * rungpg.c (_gpgme_gpg_spawn): Use new function to get GPG's path.
1055
1056         * signers.c (gpgme_signers_add): Ooops, one should test code and
1057         not just write it; the newarr was not assigned.  Thanks to José
1058         for pointing this out.  Hmmm, still not tested, why shoudl a coder
1059         test his fix :-)
1060
1061         * w32-io.c: Does now use reader threads, so that we can use
1062         WaitForMultipleObjects. 
1063         * sema.h, posix-sema.c, w32-sema.c: Support for Critcial sections.
1064         Does currently only work for W32.
1065
1066         * debug.c, util.h : New. Changed all fprintfs to use this new
1067         set of debugging functions.
1068
1069 2001-01-23  Werner Koch  <wk@gnupg.org>
1070
1071         * data.c (_gpgme_data_release_and_return_string): Fixed string
1072         termination.
1073
1074 2001-01-22  Werner Koch  <wk@gnupg.org>
1075
1076         * delete.c: New.
1077
1078         * signers.c: New.
1079         * key.c (gpgme_key_ref, gpgme_key_unref): New.
1080         * sign.c (gpgme_op_sign_start): Allow the use of other keys.
1081
1082         * version.c (gpgme_get_engine_info,gpgme_check_engine): New.
1083         * rungpg.c (_gpgme_gpg_set_simple_line_handler): New.
1084
1085 2001-01-05  Werner Koch  <wk@gnupg.org>
1086
1087         * data.c (gpgme_data_rewind): Allow to rewind data_type_none.
1088
1089
1090  Copyright 2001, 2002 g10 Code GmbH
1091
1092  This file is free software; as a special exception the author gives
1093  unlimited permission to copy and/or distribute it, with or without
1094  modifications, as long as this notice is preserved.
1095
1096  This file is distributed in the hope that it will be useful, but
1097  WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
1098  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1099