df950b09d7e90c67c3937758b550ea6951e3207d
[gpgme.git] / gpgme / ChangeLog
1 2003-01-29  Marcus Brinkmann  <marcus@g10code.de>
2
3         * key.c (gpgme_key_sig_get_string_attr): Use validity_to_string
4         instead otrust_to_string to calculate validity.
5         
6 2003-01-19  Miguel Coca  <mcoca@gnu.org>
7
8         * w32-io.c (_gpgme_io_select): Add missing argument in calls to
9         DEBUG_BEGIN.
10         * w32-util.c: Include "sema.h".
11         (find_program_in_registry): Change DEBUG1 to DEBUG2, fixes compilation
12         error.
13
14 2003-01-19  Marcus Brinkmann  <marcus@g10code.de>
15
16         * rungpg.c (_gpgme_engine_ops_gpg): Remove gpg_start.
17         (gpg_start): Rename to ...
18         (start): ... this function.  Change arguments to GpgObject.
19         (gpg_decrypt): Call start.
20         (gpg_edit): Likewise.
21         (gpg_encrypt): Likewise.
22         (gpg_encrypt_sign): Likewise.
23         (gpg_export): Likewise.
24         (gpg_import): Likewise.
25         (gpg_keylist): Likewise.
26         (gpg_keylist_ext): Likewise.
27         (gpg_trustlist): Likewise.
28         (gpg_verify): Likewise.
29
30         * engine-gpgsm.c (_gpgme_engine_ops_encrypt): Remove gpgsm_start.
31         (gpgsm_start): Rename to ...
32         (struct gpgsm_object_s): Remove member command.
33         (gpgsm_release): Don't free command.
34         (start): ... this function.  Change arguments to GpgsmObject and
35         const char *.
36         (gpgsm_decrypt): Call start.
37         (gpgsm_delete): Likewise.
38         (gpgsm_encrypt): Likewise.
39         (gpgsm_export): Likewise.
40         (gpgsm_genkey): Likewise.
41         (gpgsm_import): Likewise.
42         (gpgsm_keylist): Likewise.
43         (gpgsm_keylist_ext): Likewise.
44         (gpgsm_verify): Likewise.
45
46         * decrypt.c (_gpgme_decrypt_start): Don't call
47         _gpgme_engine_start.
48         * delete.c (_gpgme_op_delete_start): Likewise.
49         * edit.c (_gpgme_op_edit_start): Likewise.
50         * encrypt.c (_gpgme_op_encrypt_start): 
51         * encrypt-sign.c (_gpgme_op_encrypt_sign_start): 
52         * export.c (_gpgme_op_export_start): Likewise.
53         * genkey.c (_gpgme_op_genkey_start): Likewise.
54         * import.c (_gpgme_op_import_start): Likewise.
55         * keylist.c (gpgme_op_keylist_ext_start): Likewise.
56         (gpgme_op_keylist_start): Likewise.
57         * sign.c (_gpgme_op_sign_start): Likewise.
58         * trustlist.c (gpgme_op_trustlist_start): Likewise.
59         * verify.c (_gpgme_op_verify_start): Likewise.
60
61         * engine-backend.h (struct engine_ops): Remove member start.
62
63         * engine.h (_gpgme_engine_start): Remove prototype.
64         * engine.c (_gpgme_engine_start): Remove function.
65
66 2003-01-06  Werner Koch  <wk@gnupg.org>
67
68         * keylist.c (set_mainkey_capability): Handle 'd' and 'D' used
69         since gpg 1.3 to denote disabled keys.
70
71 2003-01-06  Marcus Brinkmann  <marcus@g10code.de>
72
73         * data-mem.c: Include <string.h>.
74         * engine.c: Likewise.
75
76 2003-01-06  Marcus Brinkmann  <marcus@g10code.de>
77
78         * Makefile.am (libgpgme_la_DEPENDENCIES): Correct bug in last change.
79
80 2002-12-24  Marcus Brinkmann  <marcus@g10code.de>
81
82         * gpgme.h (gpgme_op_verify, gpgme_op_decrypt_verify): Drop R_STAT
83         argument.
84         * decrypt-verify.c (gpgme_op_decrypt_verify): Drop R_STAT
85         argument.
86         * verify.c (gpgme_op_verify): Drop R_STAT argument.
87         (_gpgme_intersect_stati): Function removed.
88         * ops.h (_gpgme_intersect_stati): Remove prototype.
89
90 2002-12-24  Marcus Brinkmann  <marcus@g10code.de>
91
92         * libgpgme.vers: New file.
93         * Makefile.am (EXTRA_DIST): Add libgpgme.vers.
94         (libgpgme_version_script_cmd): New variable.
95         (libgpgme_la_LDFLAGS): Add libgpgme_version_script_cmd here.
96         (libgpgme_la_DEPENDENCIES): New variable.
97
98 2002-12-23  Marcus Brinkmann  <marcus@g10code.de>
99
100         * key.c (gpgme_key_get_string_attr): Don't accept GPGME_ATTR_IS_SECRET.
101         (otrust_to_string): New function.
102         (gpgme_key_get_as_xml): Use it.
103         (validity_to_string): New function.
104         (gpgme_key_get_string_attr): Beautify using above functions.
105         (gpgme_key_get_ulong_attr): Likewise.
106
107 2002-12-23  Marcus Brinkmann  <marcus@g10code.de>
108
109         * data-mem.c (mem_release): Fix gcc warning.
110         * data-user.c (user_release): Likewise.
111
112 2002-12-06  Marcus Brinkmann  <marcus@g10code.de>
113
114         * data.h (gpgme_data_release_cb): Change return type to void.
115         (gpgme_data_read_cb): Change return type to ssize_t.
116         * data.c (gpgme_data_read): Likewise.
117         * data-stream.c (stream_read): Likewise.
118         * data-fd.c (fd_read): Likewise.
119         * data-mem.c (mem_read): Likewise.
120         (mem_release): Change return type to void.
121         * data-user.c (user_read): Change return type to ssize_t.
122         (user_release): Change return type to void.
123         * data-compat.c (old_user_read): Change return type to ssize_t. 
124         * gpgme.h (GpgmeDataReadCb): Likewise.
125         (gpgme_data_read): Likewise.
126         (GpgmeDataSeekCb): Change return type to off_t.
127
128 2002-12-04  Marcus Brinkmann  <marcus@g10code.de>
129
130         * gpgme.h: Add prototype for gpgme_get_key.
131         * key.c (gpgme_get_key): New function.
132         * verify.c (gpgme_get_sig_key): Rewrite using gpgme_get_key.
133
134         * gpgme.h: Add prototypes for new interfaces
135         gpgme_key_sig_get_string_attr and gpgme_key_get_ulong_attr.
136         (enum GpgmeAttr): New attribute GPGME_ATTR_SIG_CLASS.
137         * gpgme.c (gpgme_set_keylist_mode): Allow GPGME_KEYLIST_MODE_SIGS.
138         * key.h (struct certsig_s): New members ALGO, NAME_PART,
139         EMAIL_PART, COMMENT_PART, NAME, SIG_STAT and SIG_CLASS.
140
141         * conversion.c (_gpgme_decode_c_string): Add new parameter LEN.
142         Use that to determine if allocation is desired or not.
143         * util.h: Adjust prototype of _gpgme_decode_c_string.
144         * keylist.c (keylist_colon_handler): Adjust caller of
145         _gpgme_decode_c_string.
146
147         * key.h (struct gpgme_key_s): New member last_uid.
148         * key.c (_gpgme_key_append_name): Rewritten using
149         _gpgme_decode_c_string and the last_uid pointer.
150         (my_isdigit): Macro removed.
151         (ALLOC_CHUNK): Likewise.
152         * keylist.c (set_userid_flags): Use last_uid member of KEY.
153
154         * context.h (struct user_id_s): New member last_certsig.
155         * key.h: Add prototype for _gpgme_key_add_certsig.
156         * key.c (_gpgme_key_add_certsig): New function.
157         (set_user_id_part): Move function before _gpgme_key_add_certsig.
158         (parse_user_id): Change first argument to SRC, add new arguments
159         NAME, EMAIL and COMMENT.  Change code to use these arguments
160         instead going through UID.  Move function before
161         _gpgme_add_certsig.
162         (parse_x509_user_id): Likewise.
163         (_gpgme_key_append_name): Adjust arguments to parse_x509_user_id
164         and parse_user_id invocation.
165         (one_certsig_as_xml): New function.
166         (one_uid_as_xml): Print signatures.
167         * context.h (struct gpgme_context_s): New member TMP_UID.
168         * keylist.c (keylist_colon_handler): Rewritten, implement "sig"
169         record entries.
170
171         * key.c (get_certsig): New function.
172         (gpgme_key_sig_get_string_attr): Likewise.
173         (gpgme_key_sig_get_ulong_attr): Likewise.
174
175         * keylist.c: Include <ctype.h>.
176         (my_isdigit): Macro removed.
177         (set_mainkey_trust_info): Use isdigit, not my_isdigit.
178         (set_userid_flags): Likewise.
179         (set_subkey_trust_info): Likewise.
180         (set_ownertrust): Likewise.
181         (finish_key): Move function up a bit and remove prototype.
182
183         * rungpg.c (gpg_keylist_ext): Correct precedence of signature
184         listing mode.
185         (gpg_keylist_ext): Implement signature listing mode.
186
187 2002-11-25  Marcus Brinkmann  <marcus@g10code.de>
188
189         * rungpg.c (_gpgme_gpg_spawn): Do not set parent fds to -1.
190         * posix-io.c (_gpgme_io_spawn): Call _gpgme_io_close instead close
191         for parent fds.
192         * w32-io.c (_gpgme_io_spawn): Call _gpgme_io_close instead
193         CloseHandle for parent fds.
194
195 2002-11-22  Marcus Brinkmann  <marcus@g10code.de>
196
197         * gpgme.h [_MSC_VER]: Define ssize_t as long.
198
199 2002-11-22  Werner Koch  <wk@gnupg.org>
200
201         * engine-gpgsm.c (_gpgme_gpgsm_new): Save the result of a first
202         setlocale before doing another setlocale.
203
204 2002-11-21  Marcus Brinkmann  <marcus@g10code.de>
205
206         * decrypt.c: Some beautyfication.
207
208         * verify.c (_gpgme_verify_status_handler): Treat
209         GPGME_STATUS_UNEXPECTED like GPGME_STATUS_NODATA.
210         Reported by Miguel Coca <e970095@zipi.fi.upm.es>.
211
212 2002-11-19  Marcus Brinkmann  <marcus@g10code.de>
213
214         * genkey.c: Only include <config.h> if [HAVE_CONFIG_H].
215         (struct genkey_result_s): Add new member FPR.
216         (_gpgme_release_genkey_result): Free RESULT->fpr if set.
217         (genkey_status_handler): Extract the fingerprint from the status
218         line.
219         (gpgme_op_genkey): Add new argument FPR and return the fingerprint
220         in it.
221         * gpgme.h: Adjust prototype of gpgme_op_genkey.
222
223 2002-11-19  Marcus Brinkmann  <marcus@g10code.de>
224
225         * rungpg.c (gpg_keylist): Add --with-fingerprint to gpg invocation
226         twice, to get fingerprints on subkeys.  Suggested by Timo Schulz
227         <twoaday@freakmail.de>.
228         (gpg_keylist_ext): Likewise.
229
230 2002-11-05  Marcus Brinkmann  <marcus@g10code.de>
231
232         * import.c (append_xml_impinfo): Use
233         _gpgme_data_append_string_for_xml rather than
234         _gpgme_data_append_string for the field content.
235         Submitted by Miguel Coca <e970095@zipi.fi.upm.es>.
236         
237 2002-10-10  Marcus Brinkmann  <marcus@g10code.de>
238
239         * rungpg.h, engine-gpgsm.h: File removed.
240         * engine-backend.h: New file.
241         * Makefile.am (gpgsm_components): New variable, set depending on
242         automake conditional HAVE_GPGSM.
243         (libgpgme_la_SOURCES): Add engine-backend.h, remove rungpg.h and
244         engine-gpgsm.h.  Replace engine-gpgsm.c with ${gpgsm_components}.
245         (status-table.h): Depend on gpgme.h, not rungpg.h.
246         * conversion.c: Include <stdlib.h>.
247         * engine-gpgsm.c: Do not set ENABLE_GPGSM here.  Include
248         "engine-backend.h" instead "engine-gpgsm.h".  Reorder some
249         functions and remove all function prototypes.
250         (_gpgme_gpgsm_get_version): Make static and rename to ...
251         (gpgsm_get_version): ... this.
252         (_gpgme_gpgsm_check_version): Make static and rename to ...
253         (gpgsm_check_version): ... this.
254         (_gpgme_gpgsm_new): Make static.  Change argument type from
255         GpgsmObject * to void **.  Call gpgsm_release instead
256         _gpgme_gpgsm_release.
257         (_gpgme_gpgsm_op_decrypt): Make static and rename to ...
258         (gpgsm_check_decrypt): ... this.
259         (_gpgme_gpgsm_op_delete): Make static and rename to ...
260         (gpgsm_check_delete): ... this.
261         (_gpgme_gpgsm_set_recipients): Make static and rename to ...
262         (gpgsm_check_set_recipients): ... this.
263         (_gpgme_gpgsm_op_encrypt): Make static and rename to ...
264         (gpgsm_encrypt): ... this.
265         (_gpgme_gpgsm_op_export): Make static and rename to ...
266         (gpgsm_export): ... this.
267         (_gpgme_gpgsm_op_genkey): Make static and rename to ...
268         (gpgsm_genkey): ... this.
269         (_gpgme_gpgsm_op_import): Make static and rename to ...
270         (gpgsm_import): ... this.
271         (_gpgme_gpgsm_op_keylist): Make static and rename to ...
272         (gpgsm_keylist): ... this.
273         (_gpgme_gpgsm_op_keylist_ext): Make static and rename to ...
274         (gpgsm_keylist_ext): ... this.
275         (_gpgme_gpgsm_op_sign): Make static and rename to ...
276         (gpgsm_sign): ... this.
277         (_gpgme_gpgsm_op_trustlist): Make static and rename to ...
278         (gpgsm_trustlist): ... this.
279         (_gpgme_gpgsm_op_verify): Make static and rename to ...
280         (gpgsm_verify): ... this.
281         (gpgsm_status_handler): Rename to ...
282         (status_handler): ... this.
283         (_gpgme_gpgsm_set_status_handler): Make static and rename to ...
284         (gpgsm_set_status_handler): ... this.
285         (_gpgme_gpgsm_set_colon_line_handler): Make static and rename to ...
286         (gpgsm_set_colon_line_handler): ... this.
287         (_gpgme_gpgsm_add_io_cb): Rename to ...
288         (add_io_cb): ... this.
289         (_gpgme_gpgsm_start): Make static and rename to ...
290         (gpgsm_start): ... this.
291         (_gpgme_gpgsm_set_io_cb): Make static and rename to ...
292         (gpgsm_set_io_cb): ... this.
293         (_gpgme_gpgsm_io_event): Make static and rename to ...
294         (gpgsm_io_event): ... this.
295         (struct _gpgme_engine_ops_gpgsm): New variable.
296         [!ENABLE_GPGSM]: Removed.
297         * engine.c: Do not include <time.h>, <sys/types.h>, <string.h>,
298         <assert.h>, "io.h", "rungpg.h" and "engine-gpgsm.h".  Include
299         <stdlib.h> and "engine-backend.h".
300         (struct engine_object_s): Rewritten.
301         (engine_ops): New variable.
302         * engine.c (_gpgme_engine_get_path, _gpgme_engine_get_version,
303         _gpgme_engine_check_version, _gpgme_engine_new,
304         _gpgme_engine_release, _gpgme_engine_set_verbosity,
305         _gpgme_engine_set_status_handler,
306         _gpgme_engine_set_command_handler,
307         _gpgme_engine_set_colon_line_handler, _gpgme_engine_op_decrypt,
308         _gpgme_engine_op_delete, _gpgme_engine_op_edit,
309         _gpgme_engine_op_encrypt, _gpgme_engine_op_encrypt_sign,
310         _gpgme_engine_op_export, _gpgme_engine_op_genkey,
311         _gpgme_engine_op_import, _gpgme_engine_op_keylist,
312         _gpgme_engine_op_keylist_ext, _gpgme_engine_op_sign,
313         _gpgme_engine_op_trustlist, _gpgme_engine_op_verify,
314         _gpgme_engine_start, _gpgme_engine_set_io_cbs,
315         _gpgme_engine_io_event): Reimplement.
316         * engine.h: Fix a few comments and a variable name in a prototype.
317         * ops.h: Do not include "rungpg.h".
318         * passphrase.c: Include config.h only if [HAVE_CONFIG_H].  Do not
319         include "rungpg.h".
320         * recipient.c: Likewise.
321         * signers.c: Likewise.
322         * version.c: Likewise.
323         * rungpg.c: Likewise.  Include "engine-backend.h".  Reorder
324         functions and remove prototypes.
325         (_gpgme_gpg_get_version): Make static and rename to ...
326         (gpg_get_version): ... this.
327         (_gpgme_gpg_check_version): Make static and rename to ...
328         (gpg_check_version): ... this.
329         (_gpgme_gpg_new): Make static.  Change argument type from
330         GpgObject * to void **.  Call gpg_release instead
331         _gpgme_gpg_release.
332         (_gpgme_gpg_op_decrypt): Make static and rename to ...
333         (gpg_check_decrypt): ... this.
334         (_gpgme_gpg_op_delete): Make static and rename to ...
335         (gpg_check_delete): ... this.
336         (_gpgme_gpg_set_recipients): Make static and rename to ...
337         (gpg_check_set_recipients): ... this.
338         (_gpgme_gpg_op_encrypt): Make static and rename to ...
339         (gpg_encrypt): ... this.
340         (_gpgme_gpg_op_export): Make static and rename to ...
341         (gpg_export): ... this.
342         (_gpgme_gpg_op_genkey): Make static and rename to ...
343         (gpg_genkey): ... this.
344         (_gpgme_gpg_op_import): Make static and rename to ...
345         (gpg_import): ... this.
346         (_gpgme_gpg_op_keylist): Make static and rename to ...
347         (gpg_keylist): ... this.
348         (_gpgme_gpg_op_keylist_ext): Make static and rename to ...
349         (gpg_keylist_ext): ... this.
350         (_gpgme_gpg_op_sign): Make static and rename to ...
351         (gpg_sign): ... this.
352         (_gpgme_gpg_op_trustlist): Make static and rename to ...
353         (gpg_trustlist): ... this.
354         (_gpgme_gpg_op_verify): Make static and rename to ...
355         (gpg_verify): ... this.
356         (gpg_status_handler): Rename to ...
357         (status_handler): ... this.
358         (_gpgme_gpg_set_status_handler): Make static and rename to ...
359         (gpg_set_status_handler): ... this.
360         (_gpgme_gpg_set_colon_line_handler): Make static and rename to ...
361         (gpg_set_colon_line_handler): ... this.
362         (gpgme_gpg_add_io_cb): Rename to ...
363         (add_io_cb): ... this.
364         (_gpgme_gpg_start): Make static and rename to ...
365         (gpg_start): ... this.
366         (_gpgme_gpg_set_io_cb): Make static and rename to ...
367         (gpg_set_io_cb): ... this.
368         (_gpgme_gpg_io_event): Make static and rename to ...
369         (gpg_io_event): ... this.
370         (struct _gpgme_engine_ops_gpg): New variable.
371
372 2002-10-10  Marcus Brinkmann  <marcus@g10code.de>
373
374         * engine-gpgsm.c (_gpgme_gpgsm_op_verify) [!ENABLE_GPGSM]: Add
375         missing argument.
376
377 2002-10-09  Marcus Brinkmann  <marcus@g10code.de>
378
379         * data.h, data-user.c, data-stream.c, data-mem.c, data-fd.c,
380         data-compat.c: New file.  Really check them in this time, completes
381         2002-10-08 change.
382
383         * rungpg.h (GpgStatusHandler): Rename type to GpgmeStatusHandler
384         and move to ...
385         * types.h (GpgmeStatusHandler): ... here.
386         * rungpg.h (GpgColonLineHandler): Rename type to GpgmeColonLineHandler.
387         and move to ...
388         * types.h (GpgmeColonLineHandler): ... here.
389         * rungpg.h (GpgCommandHandler): Rename type to GpgmeCommandHandler.
390         and move to ...
391         * types.h (GpgmeCommandHandler): ... here.
392         * engine.h: Don't include "rungpg.h".
393         (_gpgme_engine_set_status_handler): Change type of
394         argument from GpgStatusHandler to GpgmeStatusHandler.
395         (_gpgme_engine_set_colon_line_handler): Change type of
396         argument from GpgColonLineHandler to GpgmeColonLineHandler.
397         (_gpgme_engine_set_command_handler): Change type of
398         argument from GpgCommandHandler to GpgmeCommandHandler.
399         * engine-gpgsm.h: Don't include "rungpg.h".
400         (_gpgme_gpgsm_set_status_handler): Change type of
401         argument from GpgStatusHandler to GpgmeStatusHandler.
402         (_gpgme_gpgsm_set_colon_line_handler): Change type of
403         argument from GpgColonLineHandler to GpgmeColonLineHandler.
404         * engine-gpgsm.c: Do not include "rungpg.h".
405         (struct gpgsm_object_s): Change type of
406         status.fnc to GpgmeStatusHandler.  Change type of colon.fnc to
407         GpgmeColonLineHandler.
408         (gpgsm_assuan_simple_command): Change type of argument from
409         GpgStatusHandler to GpgmeStatusHandler.
410         (_gpgme_gpgsm_set_status_handler): Likewise.
411         (_gpgme_gpgsm_set_colon_line_handler): Change type of argument from
412         GpgColonLineHandler to GpgmeColonLineHandler.
413         * rungpg.h (_gpgme_gpg_set_status_handler): Change type of
414         argument from GpgStatusHandler to GpgmeStatusHandler.
415         (_gpgme_gpg_set_colon_line_handler): Change type of
416         argument from GpgColonLineHandler to GpgmeColonLineHandler.
417         (_gpgme_gpg_set_command_handler): Change type of
418         argument from GpgCommandHandler to GpgmeCommandHandler.
419         * rungpg.c (struct gpg_object_s): Change type of status.fnc to
420         GpgmeStatusHandler.  Change type of colon.fnc to
421         GpgmeColonLineHandler.  Change type of cmd.fnc to
422         GpgmeCommandLineHandler.
423         (_gpgme_gpg_set_status_handler): Change type of argument FNC to
424         GpgmeStatusHandler.
425         (_gpgme_gpg_set_colon_line_handler): Change type of argument FNC
426         to GpgmeColonLineHandler.
427         (_gpgme_gpg_set_command_handler): Change type of argument FNC to
428         GpgmeCommandHandler.
429         * engine.c (_gpgme_engine_set_status_handler): Change type of
430         argument FNC to GpgmeStatusHandler.
431         (_gpgme_engine_set_colon_line_handler): Change type of argument FNC
432         to GpgmeColonLineHandler.
433         (_gpgme_engine_set_command_handler): Change type of argument FNC to
434         GpgmeCommandHandler.
435
436         * rungpg.h (_gpgme_gpg_enable_pipemode): Remove prototype.
437         * rungpg.c (struct gpg_object_s): Remove PM.
438         (pipemode_cb): Prototype removed.
439         (add_pm_data): Function removed.
440         (_gpgme_gpg_enable_pipemode): Likewise.
441         (pipemode_copy): Likewise.
442         (pipemode_cb): Likewise.
443         (add_arg): Don't check for pipemode.
444         (add_data): Likewise.
445         (_gpgme_gpg_set_status_handler): Likewise.
446         (_gpgme_gpg_set_colon_line_handler): Likewise.
447         (_gpgme_gpg_set_command_handler): Likewise.
448         (_gpgme_gpg_spawn): Likewise.
449         (_gpgme_gpg_spawn): Don't set PM.active.
450         (_gpgme_gpg_op_verify): Remove pipemode case.
451         * verify.c (_gpgme_op_verify_start): Remove pipemode case.
452
453         * rungpg.h (_gpgme_gpg_add_arg, _gpgme_gpg_add_data,
454         _gpgme_gpg_add_pm_data, _gpgme_gpg_housecleaning,
455         _gpgme_gpg_set_simple_line_handler): Prototype removed.
456         (_gpgme_gpg_set_verbosity): New prototype.
457         * rungpg.c (_gpgme_gpg_add_data): Make static and rename to ...
458         (add_data): ... this.
459         (_gpgme_gpg_add_pm_data): Call add_data, not _gpgme_gpg_add_data.
460         (_gpgme_gpg_set_command_handler): Likewise.
461         (_gpgme_gpg_op_decrypt, _gpgme_gpg_op_edit, _gpgme_gpg_op_encrypt,
462         _gpgme_gpg_op_encrypt_sign, _gpgme_gpg_op_export,
463         _gpgme_gpg_op_genkey, _gpgme_gpg_op_import, _gpgme_gpg_op_sign,
464         _gpgme_gpg_op_verify): Likewise.
465         (_gpgme_gpg_add_pm_data): Rename to ...
466         (add_pm_data): ... this.
467         (_gpgme_gpg_op_verify): Call add_pm_data, not
468         _gpgme_gpg_add_pm_data.
469         (_gpgme_gpg_add_arg): Make static and rename to ...
470         (add_arg): ... this.
471         (_gpgme_gpg_set_command_handler, _gpgme_gpg_new,
472         _gpgme_gpg_op_decrypt, _gpgme_gpg_op_delete,
473         _gpgme_append_gpg_args_from_signers, _gpgme_gpg_op_edit,
474         _gpgme_append_gpg_args_from_recipients, _gpgme_gpg_op_encrypt,
475         _gpgme_gpg_op_encrypt_sign, _gpgme_gpg_op_export,
476         _gpgme_gpg_op_genkey, _gpgme_gpg_op_import, _gpgme_gpg_op_keylist,
477         _gpgme_gpg_op_keylist_ext, _gpgme_gpg_op_trustlist,
478         _gpgme_gpg_op_sign, _gpgme_gpg_op_verify): Use add_arg, not
479         _gpgme_gpg_add_arg.
480         (_gpgme_gpg_set_verbosity): New function.
481         (struct gpg_object_s): Remove member simple from colon.
482         (_gpgme_gpg_set_colon_line_handler): Don't initialize simple.
483         (_gpgme_gpg_set_simple_line_handler): Removed function.
484         (read_colon_line): Don't check the GPG->colon.simple.
485         * engine.c (_gpgme_engine_set_verbosity): Call
486         _gpgme_gpg_set_verbosity instead _gpgme_gpg_add_arg.
487
488 2002-10-08  Marcus Brinkmann  <marcus@g10code.de>
489
490         * util.h (_gpgme_malloc, _gpgme_realloc, _gpgme_calloc,
491         _gpgme_strdup, _gpgme_free): Remove prototypes.
492         (xtrymalloc, xtrycalloc, xtryrealloc, xtrystrdup, xfree): Remove
493         macros.
494         * util.c: File removed.
495         * Makefile.am (libgpgme_la_SOURCES): Remove util.h.
496         * conversion.c (_gpgme_decode_c_string): Use malloc instead of
497         xtrymalloc, realloc instead of xtryrealloc, calloc instead of
498         xtrycalloc, free instead of xfree.
499         (_gpgme_data_append_percentstring_for_xml): Likewise.
500         * data.c (_gpgme_data_new, _gpgme_data_release): Likewise.
501         * data-compat.c (gpgme_data_new_from_filepart): Likewise.
502         * data-mem.c (mem_write, mem_release, gpgme_data_new_from_mem,
503         _gpgme_data_get_as_string): Likewise.
504         * debug.c (debug_init): Likewise.
505         * decrypt.c (_gpgme_release_decrypt_result): Likewise.
506         * delete.c (_gpgme_release_delete_result): Likewise.
507         * edit.c (_gpgme_release_edit_result, _gpgme_op_edit_start):
508         Likewise.
509         * encrypt.c (_gpgme_release_encrypt_result): Likewise.
510         * engine.c (_gpgme_engine_get_info, _gpgme_engine_new,
511         _gpgme_engine_release): Likewise.
512         * engine-gpgsm.c (_gpgme_gpgsm_new, _gpgme_gpgsm_release,
513         _gpgme_gpgsm_op_decrypt, _gpgme_gpgsm_op_delete,
514         gpgsm_set_recipients, _gpgme_gpgsm_op_encrypt,
515         _gpgme_gpgsm_op_export, _gpgme_gpgsm_op_genkey,
516         _gpgme_gpgsm_op_import, _gpgme_gpgsm_op_keylist,
517         _gpgme_gpgsm_op_keylist_ext, _gpgme_gpgsm_op_sign,
518         _gpgme_gpgsm_op_verify, gpgsm_status_handler): Likewise.
519         * genkey.c (_gpgme_release_genkey_result): Likewise.
520         * gpgme.c (gpgme_new, gpgme_release): Likewise.
521         * import.c (_gpgme_release_import_result): Likewise.
522         * key.c (_gpgme_key_cache_init, _gpgme_key_cache_add, key_new,
523         add_subkey, gpgme_key_release, _gpgme_key_append_name): Likewise.
524         * keylist.c (_gpgme_release_keylist_result, keylist_colon_handler,
525         _gpgme_op_keylist_event_cb, gpgme_op_keylist_next): Likewise.
526         * ops.h (test_and_allocate_result): Likewise.
527         * passphrase.c (_gpgme_release_passphrase_result,
528         _gpgme_passphrase_status_handler,
529         _gpgme_passphrase_command_handler): Likewise.
530         * progress.c (_gpgme_progress_status_handler): Likewise.
531         * recipient.c (gpgme_recipients_new, gpgme_recipients_release,
532         gpgme_recipients_add_name_with_validity): Likewise.
533         * rungpg.c (_gpgme_gpg_new, _gpgme_gpg_release,
534         _gpgme_gpg_add_arg, _gpgme_gpg_add_data,
535         _gpgme_gpg_set_colon_line_handler, free_argv, free_fd_data_map,
536         build_argv, _gpgme_gpg_spawn, read_status, read_colon_line):
537         Likewise.
538         * sign.c (_gpgme_release_sign_result): Likewise.
539         * signers.c (_gpgme_signers_add): Likewise.
540         * trustlist.c (trust_item_new, trustlist_colon_handler,
541         _gpgme_op_trustlist_event_cb, gpgme_op_trustlist_next,
542         gpgme_trustitem_release): Likewise.
543         * verify.c (_gpgme_release_verify_result, finish_sig): Likewise.
544         * version.c (gpgme_get_engine_info, _gpgme_get_program_version):
545         Likewise.
546         * w32-io.c (create_reader, create_writer, destroy_reader,
547         destroy_writer, build_commandline, _gpgme_io_spawn): Likewise.
548         * w32-sema.c (critsect_init, _gpgme_sema_cs_destroy): Likewise.
549         * w32-util.c (read_w32_registry_string): Likewise.
550         * wait.c (_gpgme_fd_table_deinit, _gpgme_fd_table_put,
551         _gpgme_wait_event_cb, _gpgme_add_io_cb, _gpgme_remove_io_cb)
552         * data-compat.c: Include <stdlib.h>.
553
554 2002-10-08  Marcus Brinkmann  <marcus@g10code.de>
555
556         New data object component:
557
558         * gpgme.h (GpgmeDataReadCb, GpgmeDataWriteCb, GpgmeDataSeekCb,
559         GpgmeDataReleaseCb): New types.
560         (struct GpgmeDataCbs): New structure.
561         (gpgme_data_read): Changed prototype to match that of read() closely.
562         (gpgme_data_write): Similar for write().
563         (gpgme_data_seek, gpgme_data_new_from_cbs, gpgme_data_new_from_fd,
564         gpgme_data_new_from_stream): New prototypes.
565         (gpgme_data_get_type, gpgme_check_engine): Prototype removed.
566
567         * Makefile.am (libgpgme_la_SOURCES): Add data.h, data-fd.c,
568         data-stream.c, data-mem.c, data-user.c and data-compat.c.
569         * data.c: Reimplemented from scratch.
570         * (data-compat.c, data-fd.c, data.h, data-mem.c, data-stream.c,
571         data-user.c): New file.
572         * context.h (struct gpgme_data_s): Removed.
573         * conversion.c: Include <errno.h> and <sys/types.h>.
574         (_gpgme_data_append): New function.
575         * data.c (_gpgme_data_append_string): Move to ...
576         * conversion.c (_gpgme_data_append_string): ... here.
577         * data.c (_gpgme_data_append_for_xml): Move to ...
578         * conversion.c (_gpgme_data_append_for_xml): ... here.
579         * data.c (_gpgme_data_append_string_for_xml): Move to ...
580         * conversion.c (_gpgme_data_append_string_for_xml): ... here.
581         * data.c (_gpgme_data_append_percentstring_for_xml): Move to ...
582         * conversion.c (_gpgme_data_append_percentstring_for_xml): ... here.
583
584         * ops.h (_gpgme_data_get_mode, _gpgme_data_set_mode): Prototype
585         removed.
586         * types.h (GpgmeDataMode): Type removed.
587
588         * decrypt.c (_gpgme_decrypt_start): Don't check data type or mode.
589         * edit.c (_gpgme_op_edit_start): Likewise.
590         * encrypt.c (_gpgme_op_encrypt_start): Likewise.
591         * encrypt-sign.c (_gpgme_op_encrypt_sign_start): Likewise.
592         * encrypt-sign.c (_gpgme_op_encrypt_sign_start): Likewise.
593         * export.c (_gpgme_op_export_start): Likewise.
594         * genkey.c (_gpgme_op_genkey_start): Likewise.
595         * import.c (_gpgme_op_import_start): Likewise.
596         * sign.c (_gpgme_op_sign_start): Likewise.
597         * verify.c (_gpgme_op_verify_start): Likewise.
598         
599         * encrypt.c (gpgme_op_encrypt): Remove hack that returns invalid
600         no recipient if no data was returned.
601         * encrypt-sign.c (gpgme_op_encrypt_sign): Remove hack that returns
602         no recipient if no data was returned.
603         * encrypt-sign.c (gpgme_op_encrypt_sign): Remove hack that returns
604         no recipient if no data was returned.
605
606         * engine.c (_gpgme_engine_op_verify): Add new argument to
607         differentiate detached from normal signatures.
608         * engine.h (_gpgme_engine_op_verify): Likewise for prototype.
609         * engine-gpgsm.c (_gpgme_gpgsm_op_verify): Likewise.  Don't check
610         mode of data argument.
611         * engine-gpgsm.h (_gpgme_gpgsm_op_verify): Likewise for prototype.
612         * gpgme.h (gpgme_op_verify_start): Likewise for prototype.
613         (gpgme_op_verify): Likewise for prototype.
614         * rungpg.c (_gpgme_gpg_op_verify): Likewise.
615         * rungpg.h (_gpgme_gpg_op_verify): Likewise for prototype.
616         * verify.c (_gpgme_op_verify_start): Likewise.
617         (gpgme_op_verify_start): Likewise.
618         (gpgme_op_verify): Likewise.
619
620         * rungpg.c (struct arg_and_data_s): New member INBOUND to hold
621         direction of data object.
622         (_gpgme_gpg_add_data): Add new argument INBOUND.  Use it to
623         determine direction of data object.
624         (_gpgme_gpg_add_pm_data, _gpgme_gpg_set_command_handler,
625         _gpgme_gpg_op_decrypt, _gpgme_gpg_op_edit, _gpgme_gpg_op_encrypt,
626         _gpgme_gpg_op_encrypt_sign, _gpgme_gpg_op_export,
627         _gpgme_gpg_op_genkey, _gpgme_gpg_op_import, _gpgme_gpg_op_sign,
628         _gpgme_gpg_op_verify): Add new argument to _gpgme_gpg_add_data
629         invocation.
630         (build_argv): Use new member INBOUND to determine direction of
631         file descriptor.  Don't check the data type.
632         * rungpg.h (_gpgme_gpg_add_data): Add new argument to prototype.
633         
634         * gpgme.c (gpgme_get_op_info): Don't call
635         _gpgme_data_get_as_string if CTX->op_info is NULL.
636
637         * version.c (gpgme_check_engine): Function removed.
638
639 2002-09-30  Werner Koch  <wk@gnupg.org>
640
641         * keylist.c (keylist_colon_handler): Take care when printing a
642         NULL with the DEBUG.
643
644         * engine-gpgsm.c (struct gpgsm_object_s): New member ANY.
645         (gpgsm_status_handler): Run the colon function to indicate EOF.
646         (_gpgme_gpgsm_set_colon_line_handler): Better reset ANY here.
647
648 2002-09-28  Marcus Brinkmann  <marcus@g10code.de>
649
650         * conversion.c (_gpgme_hextobyte): Prevent superfluous
651         multiplication with base.  Reported by Stéphane Corthésy.
652
653         * keylist.c (gpgme_op_keylist_ext_start): Use private asynchronous
654         operation type in invocation of _gpgme_op_reset.
655
656 2002-09-20  Werner Koch  <wk@gnupg.org>
657
658         * ath.c: Include sys/time.h if sys/select.h is not available.
659
660 2002-09-13  Marcus Brinkmann  <marcus@g10code.de>
661
662         * keylist.c (keylist_status_handler): Do not call finish_key() here.
663         (gpgme_op_keylist_ext_start): Set CTX->tmp_key to NULL.
664
665 2002-09-03  Marcus Brinkmann  <marcus@g10code.de>
666
667         * Makefile.am (assuan_libobjs): Remove @LTLIBOBJS@ as we link them
668         into gpgme unconditionally.
669         (libgpgme_la_LIBADD): Change @LIBOBJS@ into @LTLIBOBJS@.
670
671 2002-09-02  Marcus Brinkmann  <marcus@g10code.de>
672
673         * Makefile.am (assuan_libobjs): Use @LTLIBOBJS@ instead @LIBOBJS@.
674
675 2002-09-02  Marcus Brinkmann  <marcus@g10code.de>
676
677         * debug.c (_gpgme_debug_add): Test *LINE, not LINE.
678         (_gpgme_debug_end): Likewise.
679         Reported by Dr. Stefan Dalibor <Dr.Stefan.Dalibor@bfa.de>.
680
681 2002-09-02  Marcus Brinkmann  <marcus@g10code.de>
682
683         * posix-io.c (_gpgme_io_select): Don't use a non-constant struct
684         initializer.
685         * version.c (_gpgme_get_program_version): Likewise.
686         Reported by Dr. Stefan Dalibor <Dr.Stefan.Dalibor@bfa.de>.
687
688 2002-09-02  Marcus Brinkmann  <marcus@g10code.de>
689
690         * conversion.c (_gpgme_decode_c_string): Set DESTP before
691         modifying DEST.
692
693         * conversion.c (_gpgme_decode_c_string): Fix off by one error in
694         last change.
695         * rungpg.c (_gpgme_append_gpg_args_from_signers): Move before
696         _gpgme_op_edit so its prototype is known early on.
697
698         * conversion.c: New file.
699         * util.h: Add prototypes for _gpgme_decode_c_string and
700         _gpgme_hextobyte.
701         * keylist.c (keylist_colon_handler): Call _gpgme_decode_c_string
702         on issuer name.
703         * Makefile.am (libgpgme_la_SOURCES): Add conversion.c
704         * key.c (_gpgme_key_append_name): Replace calls to hextobyte by
705         calls to _gpgme_hextobyte.
706         (hash_key): Likewise.
707
708 2002-09-01  Marcus Brinkmann  <marcus@g10code.de>
709
710         * op-support.c (_gpgme_op_reset): Set CTX->pending after calling
711         _gpgme_engine_release, as this will reset pending to zero in the
712         event done callback on cancelled operations.
713
714 2002-08-30  Marcus Brinkmann  <marcus@g10code.de>
715
716         * rungpg.c (_gpgme_gpg_op_edit): Add args from signers.
717         Suggested by Miguel Coca <e970095@zipi.fi.upm.es>.
718
719         * rungpg.c (_gpgme_gpg_op_edit): Add bogus ctx argument.
720         * rungpg.h: Also to prototype.
721         * engine.c (_gpgme_engine_op_edit): Likewise.
722         * engine.h: Likewise.
723         * edit.c (_gpgme_op_edit_start): Likewise.
724
725 2002-08-29  Werner Koch  <wk@gnupg.org>
726
727         * engine-gpgsm.c (_gpgme_gpgsm_op_sign): Implement signer
728         selection.
729         * vasprintf.c (va_copy): Define macro if not yet defined.
730
731 2002-08-29  Marcus Brinkmann  <marcus@g10code.de>
732
733         * passphrase.c (_gpgme_passphrase_status_handler): Reset
734         CTX->result.passphrase->no_passphrase if passphrase is given (good
735         or bad).  Submitted by Jean DIRAISON <jean.diraison@free.fr>.
736
737 2002-08-28  Marcus Brinkmann  <marcus@g10code.de>
738
739         * posix-io.c (_gpgme_io_spawn): Use a double-fork approach.
740         Return 0 on success, -1 on error.
741         * version.c (_gpgme_get_program_version): Don't wait for the child.
742         * engine.c (_gpgme_engine_housecleaning): Function removed.
743         (do_reaping): Likewise.
744         (_gpgme_engine_add_child_to_reap_list): Likewise.
745         (struct reap_s): Removed.
746         (reap_list): Likewise.
747         (reap_list_lock): Likewise.
748         * engine.h (_gpgme_engine_io_event): Remove prototypes for
749         _gpgme_engine_housecleaning and
750         _gpgme_engine_add_child_to_reap_list.
751         * rungpg.c (_gpgme_gpg_release): Don't add child to reap list.
752         (struct gpg_object_s): Remove PID member.
753         (_gpgme_gpg_new): Don't initialize GPG->pid.
754         (_gpgme_gpg_spawn): Don't set GPG->pid.
755         * wait.c (run_idle): Removed.
756         (gpgme_wait): Run idle_function directly.
757
758 2002-08-21  Marcus Brinkmann  <marcus@g10code.de>
759
760         * encrypt-sign.c (encrypt_sign_status_handler): Remove dead
761         variables encrypt_info and encrypt_info_len.
762         * trustlist.c (gpgme_op_trustlist_start): Set colon line handler.
763         * posix-sema.c (sema_fatal): Remove function.
764         All these reported by Stéphane Corthésy.
765
766 2002-08-23  Werner Koch  <wk@gnupg.org>
767
768         * gpgme-config.in: Made --prefix work for --libs. 
769
770 2002-08-21  Marcus Brinkmann  <marcus@g10code.de>
771
772         * ath.h: Update list of symbols that get a prefix: Rename the
773         ath_mutex_*_available symbols to ath_*_available.
774
775 2002-08-21  Marcus Brinkmann  <marcus@g10code.de>
776
777         * stpcpy.c: New file from gnulib.
778         * Makefile.am (assuan_libobjs): Remove jnlib.
779
780 2002-08-20  Marcus Brinkmann  <marcus@g10code.de>
781
782         * gpgme.h: Add prototype for gpgme_op_import_ext.
783         * import.c (struct import_result_s): New member `nr_considered'.
784         Rename `any_imported' to `nr_imported'.
785         (import_status_handler): Increment nr_imported.  Set nr_considered
786         if appropriate.
787         (gpgme_op_import_ext): New function.
788         (gpgme_op_import): Implement in terms of gpgme_op_import_ext.
789
790 2002-08-20  Werner Koch  <wk@gnupg.org>
791
792         * gpgme.m4: Replaced with a new and faster version.  This does not
793         anymore try to build test programs.  If we really need test
794         programs, we should add an option to gpgme-config to do so. 
795
796         * vasprintf.c (int_vasprintf): Hack to handle NULL passed for %s.
797
798 2002-08-20  Marcus Brinkmann  <marcus@g10code.de>
799
800         * gpgme.c (_gpgme_set_op_info): Append data on subsequent calls.
801         * encrypt-sign.c (encrypt_sign_status_handler): Remove op_info
802         handling.
803
804 2002-08-19  Werner Koch  <wk@gnupg.org>
805
806         * decrypt.c (is_token,skip_token): Duplicated from verify.c
807         (gpgme_op_decrypt): Hack to properly return Decryption_Failed..
808         (_gpgme_decrypt_status_handler): Create an operation info.
809
810 2002-08-14  Werner Koch  <wk@gnupg.org>
811
812         * key.h (struct certsig_s): New.  Use it in gpgme_key_s.
813         * key.c (gpgme_key_release): Release it. We need to add more code
814         of course.
815         (_gpgme_key_append_name): Use memset to intialize the struct.
816         * gpgme.h (GPGME_KEYLIST_MODE_SIGS): New.
817         * rungpg.c (_gpgme_gpg_op_keylist): Include sigs in listing depending
818         non the list mode.
819         
820         * key.c (gpgme_key_get_string_attr): Use GPGME_ATTR_TYPE to return
821         information about the key type (PGP or X.509).
822         (gpgme_key_get_ulong_attr): Likewise.
823
824         * keylist.c (keylist_colon_handler): Include 1 in the check for
825         valid algorithms so that RSA is usable.  Store the issuer name and
826         serial number also for "crs" records.  Parse the expire date for
827         subkeys.
828         (set_userid_flags): Put them onto the last appended key.
829
830 2002-07-29  Marcus Brinkmann  <marcus@g10code.de>
831
832         * rungpg.c (_gpgme_gpg_op_edit): Use --with-colons.
833
834 2002-07-28  Marcus Brinkmann  <marcus@g10code.de>
835
836         * data.c (gpgme_data_read): For GPGME_DATA_TYPE_NONE, return EOF
837         instead an error.
838
839         The following changes make it possible to flush an inbound data
840         pipe before invoking a command handler:
841
842         * posix-io.c (_gpgme_io_select): Accept new argument NONBLOCK to
843         _gpgme_io_select.  Set timeout of 0 if this is set.
844         * w32-io.c (_gpgme_io_select): Likewise.
845         * io.h: Add new argument NONBLOCK to _gpgme_io_select prototype.
846         * wait.c (do_select): Add new argument to _gpgme_io_select
847         invocation.
848         * rungpg.h (_gpgme_gpg_set_command_handler): Add new argument
849         linked_data to prototype.
850         * engine.h (_gpgme_engine_set_command_handler): Likewise.
851         * engine.c (_gpgme_engine_set_command_handler): Likewise.
852         * passphrase.c (_gpgme_passphrase_start): Pass NULL as linked_data
853         argument to _gpgme_engine_set_command_handler.
854         * rungpg.c (struct gpg_object_s): New members linked_data and
855         linked_idx in CMD.
856         (_gpgme_gpg_new): Initialize those new members.
857         (_gpgme_gpg_set_command_handler): Accept new argument linked_data.
858         (build_argv): Handle linked_data in the same hack as cb_data.
859         (read_status): If linked_data is in use, flush the pipe before
860         activating the command handler.
861         * gpgme.h: Add prototypes for gpgme_op_edit_start and
862         gpgme_op_edit.
863
864         The next changes export the status codes to the user:
865
866         * decrypt.c (_gpgme_decrypt_status_handler): Likewise, also prefix
867         all STATUS_ with GPGME_.
868         * delete.c (delete_status_handler): Likewise.
869         * decrypt-verify.c (decrypt_verify_status_handler): Likewise.
870         * encrypt.c (_gpgme_encrypt_status_handler): Likewise.
871         (_gpgme_encrypt_sym_status_handler): Likewise.
872         * encrypt-sign.c (encrypt_sign_status_handler): Likewise.
873         * engine-gpgsm.c (parse_status): Likewise.
874         (gpgsm_status_handler): Likewise.
875         (gpgsm_set_recipients): Likewise.
876         * export.c (export_status_handler): Likewise.
877         * genkey.c (genkey_status_handler): Likewise.
878         * import.c (append_xml_impinfo): Likewise.
879         (import_status_handler): Likewise.
880         * keylist.c (keylist_status_handler): Likewise.
881         * passphrase.c (_gpgme_passphrase_status_handler): Likewise.
882         (command_handler): Likewise.
883         * progress.c (_gpgme_progress_status_handler): Likewise.
884         * sign.c (_gpgme_sign_status_handler): Likewise.
885         * trustlist.c (trustlist_status_handler): Likewise.
886         * verify.c (_gpgme_verify_status_handler): Likewise.
887         * gpgme.h (GpgmeEditCb): New type.
888         * rungpg.h (GpgStatusCode): Rename and move to ...
889         * gpgme.h (GpgmeStatusCode): ... this and here.
890         * Makefile.am (status-table.h): Run mkstatus on gpgme.h, not rungpg.h.
891         * mkstatus: Prefix STATUS with GPGME_.
892         * rungpg.h (GpgStatusHandler, GpgCommandHandler): Change type
893         accordingly.
894         * ops.h (_gpgme_verify_status_handler,
895         _gpgme_decrypt_status_handler, _gpgme_sign_status_handler,
896         _gpgme_encrypt_status_handler, _gpgme_passphrase_status_handler,
897         _gpgme_progress_status_handler): Likewise.
898         * rungpg.c (struct gpg_object_s): Likewise for CMD.code.
899
900         These changes add an edit operation to GPGME:
901         
902         * context.h (struct gpgme_context_s): New member RESULT.edit.  *
903         ops.h: Add prototype for _gpgme_release_edit_result and
904         _gpgme_passphrase_command_handler.
905         * passphrase.c (command_handler): Make non-static and rename to ...
906         (_gpgme_passphrase_command_handler): ... this.
907         (_gpgme_passphrase_start): Use new name for command handler.
908         * types.h: Add EditResult type.
909         * gpgme.c (_gpgme_release_result): Release EDIT result.
910         * edit.c: New file.
911         * Makefile.am (libgpgme_la_SOURCES): Add edit.c.
912         (libgpgme_la_LDADD): Rename to libgpgme_la_LIBADD, and include
913         assuan_libobjs.
914         (assuan_libobjs): New variable, set this instead
915         libgpgme_la_LIBADD.
916         * engine.h (_gpgme_engine_op_edit): New prototype.
917         * engine.c (_gpgme_engine_op_edit): New function.
918         * rungpg.h (_gpgme_gpg_op_edit): New prototype.
919         * rungpg.c (_gpgme_gpg_op_edit): New function.
920
921 2002-07-27  Marcus Brinkmann  <marcus@g10code.de>
922
923         * delete.c (delete_problem): New case ambigious specification.
924         (delete_status_handler): Handle new case (poorly).
925
926 2002-07-25  Marcus Brinkmann  <marcus@g10code.de>
927
928         * engine-gpgsm.c (_gpgme_gpgsm_op_delete): Implement this.
929
930 2002-07-25  Marcus Brinkmann  <marcus@g10code.de>
931
932         * Makefile.am (libgpgme_la_LDADD): Add @LIBOBJS@ for vasprintf and
933         fopencookie.
934         * vasprintf.c: Update to more recent libiberty version.
935         * debug.h: Replace #elsif with #elif.
936
937         Submitted by Stéphane Corthésy:
938         * util.h (vasprintf): Correct prototype.
939         * encrypt-sign.c: Include <stddef.h>.
940         (encrypt_sign_status_handler): Change type of ENCRYPT_INFO_LEN to
941         size_t.
942         * ath-pthread.c: Include <stdlib.h>, not <malloc.h>.
943         * ath-pth.c: Likewise.
944
945 2002-07-25  Marcus Brinkmann  <marcus@g10code.de>
946
947         * wait.c (fdt_global): Make static.  Reported by Stéphane
948         Corthésy.
949
950         * rungpg.c (_gpgme_gpg_op_keylist_ext): Skip empty string
951         patterns.  Reported by Stéphane Corthésy.
952
953         * key.c (gpgme_key_get_as_xml): Add OTRUST attribute.  Requested
954         by Stéphane Corthésy.
955         (gpgme_key_get_string_attr): Add GPGME_ATTR_SIG_SUMMARY case to
956         silence gcc warning.
957
958         * rungpg.c (_gpgme_gpg_new): Always set utf8 as charset.
959
960 2002-07-03  Marcus Brinkmann  <marcus@g10code.de>
961
962         * gpgme.c (gpgme_set_io_cbs): Deal with CTX being NULL.
963
964         * gpgme.c (_gpgme_op_event_cb_user): New function.
965         * op-support.c (_gpgme_op_reset): Support a new mode of operation
966         for private or user event loop.  Use new user event callback
967         wrapper.
968         * trustlist.c (gpgme_op_trustlist_start): Use this new mode.
969         * keylist.c (gpgme_op_keylist_start): Likewise.
970
971         * rungpg.c (_gpgme_gpg_io_event): New function.
972         * rungpg.h (_gpgme_gpg_io_event): New prototype.
973         * engine-gpgsm.c (_gpgme_gpg_io_event): New function.
974         * engine-gpgsm.h (_gpgme_gpgsm_io_event): New prototype.
975         * engine.c (_gpgme_engine_io_event): New function.
976         * engine.h (_gpgme_engine_io_event): New prototype.
977         * keylist.c (finish_key): Call _gpgme_engine_io_event, and move
978         the real work for the default IO callback routines to ...
979         (_gpgme_op_keylist_event_cb): ... here.  New function.
980         * trustlist.c (trustlist_colon_handler): Signal
981         GPGME_EVENT_NEXT_TRUSTITEM.  Move queue manipulation to ...
982         (_gpgme_op_trustlist_event_cb): ... here.  New function.
983         * gpgme.c (_gpgme_op_event_cb): Call _gpgme_op_keylist_event_cb
984         and _gpgme_op_trustlist_event_cb when appropriate.
985         * ops.h (_gpgme_op_keylist_event_cb): New prototype.
986         (_gpgme_op_trustlist_event_cb): Likewise.
987         * op-support.c (_gpgme_op_reset): Add comment why we don't use the
988         user provided event handler directly.
989         * gpgme.h (GpgmeRegisterIOCb): Return GpgmeError value, and TAG in
990         a pointer argument.
991         * wait.c (_gpgme_add_io_cb): Likewise.
992         * wait.h (_gpgme_add_io_cb): Likewise for prototype.
993         * rungpg.c (_gpgme_gpg_add_io_cb): Call IO_CBS->add with new
994         argument.  Fix up error handling.
995         * engine-gpgsm.c (_gpgme_gpgsm_add_io_cb): Call IO_CBS->add with
996         new argument, fix up error handling.
997
998 2002-07-03  Werner Koch  <wk@gnupg.org>
999
1000         * encrypt.c (status_handler_finish): New.
1001         (_gpgme_encrypt_status_handler): Moved some code out to the new
1002         function and call this function also in case we get into the
1003         status handler with an error which might happen due to a kludge in
1004         engine-gpgsm.c
1005
1006 2002-06-28  Marcus Brinkmann  <marcus@g10code.de>
1007
1008         * keylist.c (gpgme_op_keylist_ext_start): Always use our own FD
1009         table (eg use synchronous mode).
1010
1011 2002-06-28  Marcus Brinkmann  <marcus@g10code.de>
1012
1013         * ops.h (_gpgme_wait_on_condition): Remove HANG argument from
1014         prototype and change return type to GpgmeError.
1015         (_gpgme_wait_one): New prototype.
1016         * wait.c (gpgme_wait): Replace with the meat from
1017         _gpgme_wait_on_condition here, and remove the support for
1018         conditions.
1019         (_gpgme_wait_on_condition): Remove HANG argument from prototype
1020         and change return type to GpgmeError.  Replace with meat from
1021         _gpgme_wait_one and add support for conditions.
1022         (_gpgme_wait_one): Just call _gpgme_wait_on_condition without
1023         condition.
1024         * keylist.c (gpgme_op_keylist_ext_start): Always use our own FD
1025         table (eg use synchronous mode).
1026         (gpgme_op_keylist_next): Remove HANG argument from
1027         _gpgme_wait_on_condition.  Check its return value.
1028         * trustlist.c (gpgme_op_trustlist_start): Always use our own FD
1029         table (eg use synchronous mode).
1030         (gpgme_op_trustlist_next): Remove HANG argument from
1031         _gpgme_wait_on_condition.  Check its return value.
1032         
1033 2002-06-27  Marcus Brinkmann  <marcus@g10code.de>
1034
1035         * gpgme.h: Fix documentation of key attribute retrieval functions.
1036
1037 2002-06-26  Werner Koch  <wk@gnupg.org>
1038
1039         * engine-gpgsm.c (map_assuan_error): Map No_Data_Available to EOF.
1040
1041         * import.c (append_xml_impinfo): Kludge to print fingerprint
1042         instead of keyid for use with gpgsm.
1043         (import_status_handler): Set a flag to know whether any import
1044         occured.
1045         (gpgme_op_import): Reurn -1 if no certificate ewas imported.
1046
1047 2002-06-25  Werner Koch  <wk@gnupg.org>
1048
1049         * engine-gpgsm.c (_gpgme_gpgsm_set_io_cbs) [ENABLE_GPGSM]: Fixed
1050         function arguments.
1051
1052 2002-06-25  Marcus Brinkmann  <marcus@g10code.de>
1053
1054         * engine-gpgsm.c (_gpgme_gpgsm_op_export): Only export the keys
1055         listed in RECP.
1056         * export.c (gpgme_op_export): If no data was returned, return
1057         GPGME_No_Recipients.
1058
1059 2002-06-25  Marcus Brinkmann  <marcus@g10code.de>
1060
1061         * engine-gpgsm.c (_gpgme_gpgsm_op_export): Implement.
1062
1063 2002-06-21  Marcus Brinkmann  <marcus@g10code.de>
1064
1065         * engine-gpgsm.c (gpgsm_assuan_simple_command): Return ERR.
1066         (parse_status): New function.
1067         (gpgsm_status_handler): Use parse_status.
1068         (gpgsm_assuan_simple_command): Accept new arguments STATUS_FNC and
1069         STATUS_FNC_VALUE and process status messages.
1070         (gpgsm_set_recipients): Pass new arugments to gpgsm_assuan_simple_command.
1071         (gpgsm_set_fd): Likewise.
1072         (_gpgme_gpgsm_op_keylist): Likewise.
1073         (_gpgme_gpgsm_op_keylist_ext): Likewise.
1074         (_gpgme_gpgsm_op_sign): Likewise.
1075
1076 2002-06-21  Marcus Brinkmann  <marcus@g10code.de>
1077
1078         * wait.c (_gpgme_remove_io_cb): Unlock FDT->lock.
1079
1080 2002-06-20  Werner Koch  <wk@gnupg.org>
1081
1082         * rungpg.c (build_argv): Ignore GPG_AGENT_INFO if set but empty.
1083
1084         * verify.c (calc_sig_summary): Set bad policy for wrong key usage.
1085         (skip_token): New.
1086         (_gpgme_verify_status_handler): Watch out for wrong key usage.
1087         (gpgme_get_sig_string_attr): Hack to return info on the key
1088         usage.  Does now make use of the former RESERVED argument which
1089         has been renamed to WHATIDX.
1090         (gpgme_get_sig_ulong_attr): Renamed RESERVED to WHATIDX.
1091
1092 2002-06-14  Marcus Brinkmann  <marcus@g10code.de>
1093
1094         * wait.c (do_select): Return -1 on error, and 0 if nothing to run.
1095         (_gpgme_wait_one): Only set HANG to zero if do_select returned an
1096         error, or there are no more file descriptors to wait on.
1097         (_gpgme_wait_on_condition): Ignore return value from do_select for
1098         now.
1099
1100 2002-06-13  Werner Koch  <wk@gnupg.org>
1101
1102         * verify.c (gpgme_op_verify): Make sure that we never access an
1103         unitialized result structure.
1104
1105 2002-06-12  Werner Koch  <wk@gnupg.org>
1106
1107         * keylist.c (struct keylist_result_s): New.
1108         (_gpgme_release_keylist_result): Release it here 
1109         (keylist_status_handler): Handle truncated.
1110         (append_xml_keylistinfo): New.
1111         * gpgme.c (_gpgme_release_result): and use it here.
1112         * types.h: Declare the new type here.
1113         * context.h (struct gpgme_context_s): Use it here.
1114
1115 2002-06-11  Marcus Brinkmann  <marcus@g10code.de>
1116
1117         * engine-gpgsm.c (_gpgme_gpgsm_release): Close status_cb.fd.
1118         (_gpgme_gpgsm_new): Duplicate status file descriptor, so we can
1119         use our own close notification mechanism without interfering with
1120         assuan.
1121
1122 2002-06-11  Werner Koch  <wk@gnupg.org>
1123
1124         * gpgme.h: Add GPGME_ATTR_SIG_SUMMARY and the GPGME_SIGSUM_
1125         constants.
1126         * verify.c (calc_sig_summary): New.
1127         (gpgme_get_sig_ulong_attr): And use it here.
1128
1129 2002-06-10  Werner Koch  <wk@gnupg.org>
1130
1131         * rungpg.h: Add new status codes TRUNCATED and ERROR.
1132         * verify.c (is_token, copy_token): New.
1133         (_gpgme_verify_status_handler): Use copy_token, handle the new
1134         ERROR status and store the errorcode used withgpgsm and trust
1135         status codes.
1136         * gpgme.h: New attribute ERRTOK.
1137         * key.c (gpgme_key_get_string_attr): Add dummy case for it.
1138         (gpgme_get_sig_string_attr): Use it here to return the last error.
1139
1140 2002-06-10  Marcus Brinkmann  <marcus@g10code.de>
1141
1142         * engine-gpgsm.c (_gpgme_gpgsm_start): Move the code that sets the
1143         close notification for the status fd to ...
1144         (_gpgme_gpgsm_new): ... here.
1145         * wait.h: Include "sema.h".  Remove prototypes of
1146         _gpgme_remove_proc_from_wait_queue and
1147         _gpgme_register_pipe_handler.  Add prototypes of
1148         _gpgme_fd_table_init, _gpgme_fd_table_deinit, _gpgme_fd_table_put,
1149         _gpgme_add_io_cb, _gpgme_remove_io_cb, _gpgme_wait_event_cb and
1150         _gpgme_wait_one..
1151         * wait.c: Remove global variables PROC_QUEUE, PROC_QUEUE_LOCK,
1152         FD_TABLE_SIZE, FD_TABLE, FD_TABLE_LOCK.  New global variables
1153         FDT_GLOBAL, CTX_DONE_LIST, CTX_DONE_LIST_SIZE,
1154         CTX_DONE_LIST_LENGTH and CTX_DONE_LIST_LOCK.  Remove struct
1155         proc_s.  Replace struct wait_item_s.
1156         (_gpgme_fd_table_init): New function.
1157         (_gpgme_fd_table_deinit): Likewise.
1158         (_gpgme_fd_table_put): Likewise.
1159         (set_process_done): Remove function.
1160         (do_select): Take argument FDT.  Use that to decide which fds to
1161         select on.
1162         (_gpgme_remove_proc_from_wait_queue): Remove function.
1163         (_gpgme_wait_event_cb): New function.
1164         (_gpgme_wait_one): Likewise.
1165         (_gpgme_register_pipe_hanldler): Remove function.
1166         (_gpgme_add_io_cb): New function.
1167         (_gpgme_remove_io_cb): Likewise.
1168         (_gpgme_freeze_fd): Remove function.
1169         (_gpgme_thaw_fd): Remove function.
1170         * rungpg.c (struct fd_data_map_s): Add new member TAG.
1171         (struct gpg_object_s): Likewise for STATUS and COLON.  Add member
1172         IDX to CMD.  Add new member IO_CBS.
1173         (close_notify_handler): New variables POSSIBLY_DONE and NOT_DONE.
1174         For each I/O callback, check if it should be unregistered.  If all
1175         callbacks have been unregistered, trigger GPGME_EVENT_DONE.
1176         Remove member RUNNING.
1177         (_gpgme_gpg_new): Initialize new members.
1178         (_gpgme_gpg_release): Check PID not RUNNING.  Don't call
1179         _gpgme_remove_proc_from_wait_queue.  Close GPG->CMD.FD if set.
1180         (build_argv): Store away the index instead the file descriptor for
1181         CMD.
1182         (_gpgme_gpg_add_io_cb): New function.
1183         (_gpgme_gpg_spawn): Use _gpgme_gpg_add_io_cb to register IO
1184         callbacks.
1185         (gpg_status_handler): Change return type to void, remove PID
1186         argument, close filedescriptor if EOF or error occurs.
1187         (read_status): Use _gpgme_gpg_add_io_cb instead _gpgme_thaw_fd.
1188         Use IO_CBS->remove instead _gpgme_freeze_fd.
1189         (gpg_colon_line_handler): Change return type to void, remove PID
1190         argument, close filedescriptor if EOF or error occurs.
1191         (command_cb): Use IO_CBS->remove instead _gpgme_freeze_fd.
1192         (_gpgme_gpg_set_io_cbs): New function.
1193         * rungpg.h (_gpgme_gpg_set_io_cbs): Prototype for
1194         _gpgme_gpg_set_io_cbs.
1195         * gpgme.h (GpgmeIOCb): New type.
1196         (GpgmeRegisterIOCb): Likewise.
1197         (GpgmeRemoveIOCb): Likewise.
1198         (GpgmeEventIO): Likewise.
1199         (GpgmeEventIOCb): Likewise.
1200         (struct GpgmeIOCbs): New structure to hold I/O callbacks.
1201         (gpgme_set_op_io_cbs): New prototype.
1202         (gpgme_get_op_io_cbs): Likewise.
1203         * ops.h: New prototype for _gpgme_op_event_cb.  Remove prototypes
1204         for _gpgme_freeze_fd and _gpgme_thaw_fd.  Remove PID argument from
1205         _gpgme_data_inbound_handler and _gpgme_data_outbound_handler
1206         prototype.  Add prototype for _gpgme_op_reset.
1207         Add synchronous argument to _gpgme_decrypt_start prototype.
1208         * io.h: Beautification.
1209         * gpgme.c: Include "wait.h".
1210         (gpgme_new): Initialize FDT.
1211         (gpgme_set_io_cbs): New function.
1212         (gpgme_get_io_cbs): Likewise.
1213         (_gpgme_op_event_cb): Likewise.
1214         * data.c (_gpgme_data_inbound_handler): Change return type to
1215         void.  Drop PID argument.  Close FD on error and EOF.
1216         (write_mem_data): Don't close FD here ...
1217         (write_cb_data): ... or here ...
1218         (_gpgme_data_outbound_handler): ... but here.  Change return type
1219         to void.  Drop PID argument.
1220         * context.h: Include "wait.h".
1221         (struct gpgme_context_s): New members FDT and IO_CBS.
1222         * op-support.c: New file.
1223         * Makefile.am (libgpgme_la_SOURCES): Add op-support.c.
1224         * ops.h: Add prototype for _gpgme_op_reset().
1225         * decrypt.c (_gpgme_decrypt_start): New argument SYNCHRONOUS.  Use
1226         _gpgme_op_reset.
1227         (gpgme_op_decrypt_start): Add synchronous argument.
1228         (gpgme_op_decrypt): Likewise.  Use _gpgme_wait_one instead
1229         gpgme_wait.
1230         * delete.c (gpgme_op_delete_start): Rename to ...
1231         (_gpgme_op_delete_start): ... this.  New argument SYNCHRONOUS.
1232         Use _gpgme_op_reset.  Make function static.
1233         (gpgme_op_delete_start): Just a wrapper around
1234         _gpgme_op_delete_start now.
1235         (gpgme_op_delete): Add synchronous argument.  Use _gpgme_wait_one
1236         instead gpgme_wait.
1237         * encrypt.c: Include "wait.h".
1238         (ggpgme_op_encrypt_start): Rename to ...
1239         (_gpgme_op_encrypt_start): ... this.  New argument SYNCHRONOUS.
1240         Use _gpgme_op_reset.  Make function static.
1241         (gpgme_op_encrypt_start): Just a wrapper around
1242         _gpgme_op_encrypt_start now.
1243         (gpgme_op_encrypt): Add synchronous argument.  Use _gpgme_wait_one
1244         instead gpgme_wait.
1245         * encrypt_sign.c (gpgme_op_encrypt_sign_start): Rename to ...
1246         (_gpgme_op_encrypt_sign_start): ... this.  New argument
1247         SYNCHRONOUS.  Use _gpgme_op_reset.  Make function static.
1248         (gpgme_op_encrypt_sign_start): Just a wrapper around
1249         _gpgme_op_encrypt_sign_start now.
1250         (gpgme_op_encrypt_sign): Add synchronous argument.  Use
1251         _gpgme_wait_one instead gpgme_wait.
1252         * export.c (gpgme_op_export_start): Rename to ...
1253         (_gpgme_op_export_start): ... this.  New argument SYNCHRONOUS.
1254         Use _gpgme_op_reset.  Make function static.
1255         (gpgme_op_export_start): Just a wrapper around
1256         _gpgme_op_export_start now.
1257         (gpgme_op_export): Add synchronous argument.  Use _gpgme_wait_one
1258         instead gpgme_wait.
1259         * genkey.c (gpgme_op_genkey_start): Rename to ...
1260         (_gpgme_op_genkey_start): ... this.  New argument SYNCHRONOUS.
1261         Use _gpgme_op_reset.  Make function static.
1262         (gpgme_op_genkey_start): Just a wrapper around
1263         _gpgme_op_genkey_start now.
1264         (gpgme_op_genkey): Add synchronous argument.  Use _gpgme_wait_one
1265         instead gpgme_wait.
1266         * import.c (gpgme_op_import_start): Rename to ...
1267         (_gpgme_op_import_start): ... this.  New argument SYNCHRONOUS.
1268         Use _gpgme_op_reset.  Make function static.
1269         (gpgme_op_import_start): Just a wrapper around
1270         _gpgme_op_import_start now.
1271         (gpgme_op_import): Add synchronous argument.  Use _gpgme_wait_one
1272         instead gpgme_wait.
1273         * keylist.c (gpgme_op_keylist_start): Use _gpgme_op_reset.
1274         (gpgme_op_keylist_ext_start): Likewise.
1275         * sign.c (gpgme_op_sign_start): Rename to ...
1276         (_gpgme_op_sign_start): ... this.  New argument SYNCHRONOUS.  Use
1277         _gpgme_op_reset.  Make function static.
1278         (gpgme_op_sign_start): Just a wrapper around _gpgme_op_sign_start
1279         now.
1280         (gpgme_op_sign): Add synchronous argument.  Use _gpgme_wait_one
1281         instead gpgme_wait.
1282         * trustlist.c (gpgme_op_trustlist_start): Use _gpgme_op_reset.
1283         * verify.c (gpgme_op_verify_start): Rename to ...
1284         (_gpgme_op_verify_start): ... this.  New argument SYNCHRONOUS.
1285         Use _gpgme_op_reset.  Make function static.
1286         (gpgme_op_verify_start): Just a wrapper around
1287         _gpgme_op_verify_start now.
1288         (gpgme_op_verify): Add synchronous argument.  Use _gpgme_wait_one
1289         instead gpgme_wait.
1290         * engine-gpgsm.c (iocb_data_t): New type.
1291         (struct gpgsm_object_s): New member status_cb.  Replace input_fd
1292         and input_data with input_cb.  Replace output_fd and output_data
1293         with output_cb.  Replace message_fd and message_data with
1294         message_cb.  New member io_cbs.
1295         (_gpgme_gpgsm_new): Initialize all new members (and drop the old
1296         ones).
1297         (close_notify_handler): New variable POSSIBLY_DONE.  For each I/O
1298         callback, check if it should be unregistered.  If all callbacks
1299         have been unregistered, trigger GPGME_EVENT_DONE.
1300         (_gpgme_gpgsm_release): Remove variable PID.  Use new variable
1301         names to close the file descriptors.
1302         (_gpgme_gpgsm_op_decrypt): Use new variable names,
1303         (_gpgme_gpgsm_op_encrypt): Likewise.
1304         (_gpgme_gpgsm_op_genkey): Likewise.
1305         (_gpgme_gpgsm_op_import): Likewise.
1306         (_gpgme_gpgsm_op_keylist): Likewise.
1307         (_gpgme_gpgsm_op_keylist_ext): Likewise.
1308         (_gpgme_gpgsm_op_sign): Likewise.
1309         (_gpgme_gpgsm_op_verify): Likewise.
1310         (gpgsm_status_handler): Drop argument PID.  Change return type to
1311         void.  Close status pipe before returning because of EOF or error.
1312         (_gpgme_gpgsm_add_io_cb): New function.
1313         (_gpgme_gpgsm_start): Use _gpgme_gpgsm_add_io_cb to register
1314         callback function.
1315         (_gpgme_gpgsm_set_io_cbs): New function.
1316         * engine-gpgsm.h: New prototype for _gpgme_gpgsm_set_io_cbs.
1317         * engine.c (_gpgme_engine_set_io_cbs): New function.
1318         * engine.h: New prototype for _gpgme_engine_set_io_cbs.
1319
1320 2002-06-04  Marcus Brinkmann  <marcus@g10code.de>
1321
1322         * Makefile.am (libgpgme_la_SOURCES): Remove mutex.h.
1323
1324 2002-06-03  Marcus Brinkmann  <marcus@g10code.de>
1325
1326         * key.c: Include <ctype.h>.
1327         (_gpgme_key_append_name): Skip one more char when
1328         processing escaped char.  Submitted by Marc Mutz <mutz@kde.org>.
1329         Handle hexadecimal encodings.  Also reported by Marc.  Thanks!
1330
1331 2002-06-02  Marcus Brinkmann  <marcus@g10code.de>
1332
1333         * ath.h: Enable the _gpgme_ prefix.  Fix all those prefix macros.
1334         * posix-sema.c: Use that prefix here.
1335         * posix-io.c: Include "ath.h".
1336         (_gpgme_io_read): Use _gpgme_ath_read instead read.
1337         (_gpgme_io_write): Use _gpgme_ath_write instead write.
1338         (_gpgme_io_waitpid): Use _gpgme_ath_waitpid instead waitpid.
1339         (_gpgme_io_select): Use _gpgme_ath_select instead select.
1340
1341 2002-06-02  Marcus Brinkmann  <marcus@g10code.de>
1342
1343         * Makefile.am (ath_components): New variable.
1344         (ath_components_pthread): Likewise.
1345         (ath_components_pth): Likewise.
1346         (system_components): Add ath_componentes.
1347
1348         * ath.h: New file.
1349         * ath.c: Likewise.
1350         * ath-pthread.c: Likewise.
1351         * ath-pth.c: Likewise.
1352         * posix-sema.c (_gpgme_sema_cs_enter): Rework to use the ATH
1353         interface.
1354         * mutex.h: Remove file.
1355
1356 2002-05-30  Werner Koch  <wk@gnupg.org>
1357
1358         * key.c (gpgme_key_get_string_attr): Return NULL when asking for
1359         an issuer with IDX > 0.  We don't support altIssuerNames for now.
1360
1361 2002-05-22  Werner Koch  <wk@gnupg.org>
1362
1363         * engine-gpgsm.c (_gpgme_gpgsm_op_keylist_ext): Aehmm, added
1364         missing variable definition.  Oohh - Marcus was faster.
1365
1366 2002-05-22  Marcus Brinkmann  <marcus@gnu.org>
1367
1368         * engine-gpgsm.c (_gpgme_gpgsm_op_keylist_ext): Fix last change.
1369
1370 2002-05-21  Werner Koch  <wk@gnupg.org>
1371
1372         * engine-gpgsm.c (_gpgme_gpgsm_op_keylist)
1373         (_gpgme_gpgsm_op_keylist_ext):  Pass the keylist mode to gpgsm.
1374
1375 2002-05-10  Werner Koch  <wk@gnupg.org>
1376
1377         * key.h (gpgme_key_s): Add OTRUST.
1378         * keylist.c (set_ownertrust): New.
1379         (keylist_colon_handler): Get the ownertrust value
1380         * key.c (gpgme_key_get_string_attr,gpgme_key_get_ulong_attr):
1381         Return that value.
1382
1383 2002-05-08  Marcus Brinkmann  <marcus@g10code.de>
1384
1385         * w32-util.c: New static variable GET_PATH_LOCK.
1386         (_gpgme_get_gpg_path): Remove superfluous NULL initializer.
1387         Take lock while determining path.
1388         (_gpgme_get_gpgsm_path): Likewise.
1389         * version.c (do_subsystem_inits): Set DONE to 1 after
1390         initialization.
1391         (gpgme_get_engine_info): New variable ENGINE_INFO_LOCK.  Take lock
1392         while determining engine info.
1393         * rungpg.c (_gpgme_gpg_get_version): New variable
1394         GPG_VERSION_LOCK.  Take the lock while determining the program
1395         version.
1396         * posix-io.c: Include "sema.h".
1397         (_gpgme_io_spawn): New variable FIXED_SIGNALS_LOCK.  Take the lock
1398         while fixing the signals.
1399         (_gpgme_io_select): Make READFDS and WRITEFDS non-static.
1400         * key.c: Include "sema.h".  New globals KEY_CACHE_LOCK and
1401         KEY_REF_LOCK.
1402         (capabilities_to_string): Make STRINGS very const.
1403         (_gpgme_key_cache_add): Lock the key cache.
1404         (_gpgme_key_cache_get): Likewise.
1405         (gpgme_key_ref, gpgme_key_release): Lock the key_ref_lock.
1406         * import.c (append_xml_impinfo): Make IMPORTED_FIELDS and
1407         IMPORT_RES_FIELDS very const.  Make FIELD and FIELD_NAME a litle
1408         const.
1409         * engine.c (_gpgme_engine_get_info): New variable
1410         ENGINE_INFO_LOCK.  Take lock while determining engine info.
1411         * engine-gpgsm.c: Include "sema.h".
1412         (_gpgme_gpgsm_get_version): New variable GPGSM_VERSION_LOCK.  Take
1413         lock while getting program version.
1414
1415 2002-05-08  Marcus Brinkmann  <marcus@g10code.de>
1416
1417         * debug.h: New file.
1418         * Makefile.am (libgpgme_la_SOURCES): Add debug.h.
1419         * util.h: Removed all prototypes and declarations related to
1420         debugging.  Include "debug.h".
1421
1422         * debug.c (debug_level): Comment variable and remove superfluous
1423         zero initializer.
1424         (errfp): Likewise.
1425         (_gpgme_debug_enabled): Function removed.
1426         (struct debug_control_s): Definition removed.
1427         (_gpgme_debug_level): Function removed.
1428         (_gpgme_debug_begin): Rewritten to use vasprintf.  Accept a
1429         pritnf-style format specification and a variable number of
1430         arguments.
1431         (_gpgme_debug_add): Rewritten using vasprintf.  Expect that format
1432         starts out with "%s" for simplicity.
1433         (_gpgme_debug_end): Rewritten using vasprintf.  Do not accept a
1434         TEXT argument anymore.
1435
1436         * posix-io.c (_gpgme_io_select): Use new level argument for
1437         DEBUG_BEGIN instead explicit if construct.
1438
1439         * debug.c (debug_init): Remove superfluous zero initializer,
1440         remove volatile flag of INITIALIZED.  Do not use the
1441         double-checked locking algorithm, it is fundamentally flawed and
1442         will empty your fridge (on a more serious note, despite the
1443         volatile flag it doesn't give you the guarantee you would expect,
1444         for example on a DEC Alpha or an SMP machine.  The volatile only
1445         serializes accesses to the volatile variable, but not to the other
1446         variables).
1447
1448 2002-05-03  Werner Koch  <wk@gnupg.org>
1449
1450         * engine-gpgsm.c (_gpgme_gpgsm_new): Redirect any gpgsm error
1451         output to /dev/null.
1452
1453         * verify.c (gpgme_get_sig_key): Set the protocol of the listctx.
1454         * gpgme.c (gpgme_get_protocol): New.
1455
1456         * data.c (gpgme_data_write): Changed type of BUFFER to void*.
1457         (gpgme_data_read): Ditto.
1458
1459         * verify.c (_gpgme_verify_status_handler): Handle TRUST_* status
1460         lines so that a claim can be made without looking up the key.
1461         (gpgme_get_sig_string_attr): New. 
1462         (gpgme_get_sig_ulong_attr): New.
1463
1464         * gpgme.h (GpgmeAttr): Added GPGME_ATTR_SIG_STATUS.
1465
1466         * rungpg.h: Add new status codes from gpg 1.0.7 and formatted the
1467         list to align with the status.h file from gnupg.
1468
1469         * gpgme.h (GpgmeSigStat): Add _GOOD_EXP and _GOOD_EXPKEY.
1470         * verify.c (_gpgme_verify_status_handler, finish_sig): Handle
1471         these new status codes.  Store the expiration time 
1472
1473 2002-04-27  Werner Koch  <wk@gnupg.org>
1474
1475         * gpgme.h (GpgmeData_Encoding): New.
1476         * data.c (gpgme_data_get_encoding,gpgme_data_set_encoding): New.
1477         * engine-gpgsm.c (map_input_enc): New. Use it in all local
1478         functions where the INPUT command gets send.
1479
1480 2002-04-27  Marcus Brinkmann  <marcus@g10code.de>
1481
1482         * engine-gpgsm.c (_gpgme_gpgsm_op_verify): Close the output
1483         descriptor only when we don't need it anymore.  Close the message
1484         descriptor if we don't need it.
1485
1486 2002-04-26  Werner Koch  <wk@gnupg.org>
1487
1488         * Makefile.am (libgpgme_la_LIBADD): Use libtool libraries.
1489
1490 2002-04-25  Marcus Brinkmann  <marcus@g10code.de>
1491
1492         * rungpg.c (_gpgme_gpg_release): Call gpgme_data_release on
1493         GPG->cmd.cb_data, not xfree.
1494
1495 2002-04-25  Marcus Brinkmann  <marcus@g10code.de>
1496
1497         * engine-gpgsm.c (_gpgme_gpgsm_new): Set the display, ttyname,
1498         ttytype, lc_ctype and lc_messages options in the server.
1499
1500 2002-04-24  Marcus Brinkmann  <marcus@g10code.de>
1501
1502         * engine-gpgsm.c (map_assuan_error): Add new error codes.
1503
1504 2002-04-23  Werner Koch  <wk@gnupg.org>
1505
1506         * key.c (gpgme_key_get_ulong_attr): Swapped use of can_encrypt and
1507         can_certify to return the requested values.
1508
1509 2002-04-23  Marcus Brinkmann  <marcus@g10code.de>
1510
1511         * gpgme.c (gpgme_get_progress_cb): Allow either return parameter
1512         to be NULL.
1513         (gpgme_get_passphrase_cb): Likewise.
1514
1515 2002-04-22  Marcus Brinkmann  <marcus@g10code.de>
1516
1517         * gpgme.c (gpgme_get_passphrase_cb): New function.
1518         (gpgme_get_progress_cb): New function.
1519         * gpgme.h: Add new prototypes for gpgme_get_passphrase_cb and
1520         gpgme_get_progress_cb.
1521
1522 2002-03-28  Werner Koch  <wk@gnupg.org>
1523
1524         * gpgme.h (GpgmeAttr): Add values for issuer and chaining.
1525         * key.h (gpgme_key_s): Add issuer and chaining elements for X509.
1526         * keylist.c (keylist_colon_handler): Store them.
1527         * key.c (gpgme_key_release): Free them.
1528         (gpgme_key_get_as_xml,gpgme_key_get_string_attr): Print them.
1529
1530 2002-03-26  Werner Koch  <wk@gnupg.org>
1531
1532         * Makefile.am (libgpgme_la_SOURCES): Add mutex.h
1533
1534 2002-03-21  Werner Koch  <wk@gnupg.org>
1535
1536         * util.h [!HAVE_FOPENCOOKIE]: Make sure off_t and ssize_t are
1537         defined.
1538
1539 2002-03-18  Marcus Brinkmann  <marcus@g10code.de>
1540
1541         * Makefile.am (system_components): New variable, set depending on
1542         HAVE_DOSISH_SYSTEM.
1543         (libgpgme_la_SOURCES): Use system_components.  Remove `syshdr.h'.
1544         * syshdr.h: File removed.
1545
1546         * posix-io.c: Remove !HAVE_DOSISH_SYSTEM safeguard.  Clean up source.
1547         * posix-sema.c: Likewise.
1548         * posix-util.c: Likewise.
1549
1550         * w32-io.c: Remove HAVE_DOSISH_SYSTEM safeguard.
1551         * w32-sema.c: Likewise.
1552         * w32-util.c: Likewise.
1553
1554         * posix-io.c: Include `unistd.h', do not include `syshdr.h'.
1555         * posix-sema.c: Likewise.
1556         * w32-io.c: Include `io.h', do not include `syshdr.h'
1557         * w32-sema.c: Likewise.
1558         * w32-util.c: Likewise.
1559         * data.c: Do not include `syshdr.h'.
1560         * wait.c: Likewise.
1561         * wait.h: Code cleanup.
1562
1563         * mutex.h: New file.
1564         * posix-sema.c: Implement.
1565
1566 2002-03-08  Werner Koch  <wk@gnupg.org>
1567
1568         * util.h [!HAVE_FOPENCOOKIE]: Fixed type.  Thanks to Frank Heckenbach.
1569
1570 2002-03-07  Werner Koch  <wk@gnupg.org>
1571
1572         * gpgme.h (gpgme_op_keylist_ext_start): Add prototype.
1573
1574 2002-03-06  Marcus Brinkmann  <marcus@g10code.de>
1575
1576         * encrypt.c (_gpgme_encrypt_sym_status_handler): New function.
1577         (gpgme_op_encrypt_start): New variable SYMMETRIC, set it if RECP
1578         is null, and if it is set, use _gpgme_encrypt_sym_status_handler
1579         as status handler and run _gpgme_passphrase_start.
1580         * rungpg.c (_gpgme_gpg_op_encrypt): If RECP is zero, do symmetric
1581         encryption.
1582         * engine-gpgsm.c (_gpgme_gpgsm_op_encrypt): If RECP is zero,
1583         return error value.
1584
1585         * rungpg.c (_gpgme_gpg_op_verify): Add "--" argument.
1586
1587 2002-03-03  Marcus Brinkmann  <marcus@g10code.de>
1588
1589         * passphrase.c (_gpgme_passphrase_status_handler): Also set the
1590         error No_Passphrase if only a bad passphrase was provided.
1591
1592 2002-03-03  Marcus Brinkmann  <marcus@g10code.de>
1593
1594         * rungpg.c (_gpgme_gpg_op_verify): If TEXT is of mode
1595         GPGME_DATA_MODE_IN, construct a command line that stores the
1596         plaintext in TEXT.
1597         * verify.c (gpgme_op_verify_start): Accept TEXT being
1598         uninitialized, and in this case interpret SIG as a normal or
1599         cleartext signature and TEXT as a return data object.
1600         * engine-gpgsm.c (_gpgme_gpgsm_op_verify): Likewise.
1601
1602 2002-03-03  Marcus Brinkmann  <marcus@g10code.de>
1603
1604         * engine-gpgsm.c (_gpgme_gpgsm_op_keylist_ext) [!ENABLE_GPGSM]:
1605         Add stub function.
1606
1607 2002-02-28  Werner Koch  <wk@gnupg.org>
1608
1609         * key.h (subkey_s): New member expires_at.
1610         * keylist.c (keylist_colon_handler): Set it here
1611         * key.c (gpgme_key_get_as_xml,gpgme_key_get_ulong_attr): Return it.
1612
1613 2002-02-27  Marcus Brinkmann  <marcus@g10code.de>
1614
1615         * rungpg.h (_gpgme_gpg_op_keylist_ext): New prototype.
1616         * rungpg.c (_gpgme_gpg_op_keylist_ext): New function.
1617         * engine-gpgsm.h (_gpgme_gpgsm_op_keylist_ext): New prototype.
1618         * engine-gpgsm.c (_gpgme_gpgsm_op_keylist_ext): New function.
1619         * engine.h (_gpgme_engine_op_keylist_ext): New prototype.
1620         * engine.c (_gpgme_engine_op_keylist_ext): New function.
1621         * keylist.c (gpgme_op_keylist_ext_start): New function.
1622
1623 2002-02-27  Marcus Brinkmann  <marcus@g10code.de>
1624
1625         * gpgme.h: Add new error code GPGME_Invalid_Recipient.
1626         * encrypt.c (struct encrypt_result_s): New member invalid_recipients,
1627         rename no_recipients to no_valid_recipients.
1628         (_gpgme_encrypt_status_handler): Include error for invalid
1629         recipients.
1630         * engine-gpgsm.c (gpgsm_set_recipients): Change type of first
1631         argument to GpgsmObject.  Use that to report back the status about
1632         the recipients.
1633
1634 2002-02-26  Marcus Brinkmann  <marcus@g10code.de>
1635
1636         * verify.c (_gpgme_verify_status_handler): Fix the last change.
1637
1638 2002-02-25  Marcus Brinkmann  <marcus@g10code.de>
1639
1640         * engine.c (_gpgme_engine_op_encrypt_sign): New function.
1641         * engine.h (_gpgme_engine_op_encrypt_sign): New prototype.
1642         * rungpg.c (_gpgme_append_gpg_args_from_signers): New function.
1643         (_gpgme_gpg_op_sign): Use that new function.
1644         (_gpgme_gpg_op_encrypt_sign): New function.
1645         * rungpg.h (_gpgme_gpg_op_encrypt_sign): New prototype. 
1646         * gpgme.h (gpgme_op_encrypt_sign_start): New prototype.
1647         (gpgme_op_encrypt_sign): Likewise.
1648         * Makefile.am (libgpgme_la_SOURCES): Add encrypt-sign.c.
1649         * ops.h (_gpgme_encrypt_status_handler): Add prototype.
1650         (_gpgme_sign_status_handler): Add prototype.
1651         * sign.c (sign_status_handler): Rename to ...
1652         (_gpgme_sign_status_handler): ... this and make non-static.
1653         * encrypt.c (encrypt_status_handler): Rename to ...
1654         (_gpgme_encrypt_status_handler): ... this and make non-static.
1655         * encrypt.c (gpgme_op_encrypt_start): Use new status handler name.
1656         * sign.c (gpgme_op_sign_start): Likewise.
1657         
1658 2002-02-25  Marcus Brinkmann  <marcus@g10code.de>
1659
1660         * verify.c (_gpgme_verify_status_handler): Parse the args line to
1661         see if the problem is due to a missing key, and report that back
1662         to the user.
1663
1664 2002-02-25  Marcus Brinkmann  <marcus@g10code.de>
1665
1666         * context.h (struct gpgme_context_s): New member include_certs.
1667         * gpgme.h (gpgme_set_include_certs): Add prototype.
1668         (gpgme_get_include_certs): Likewise.
1669         * gpgme.c (gpgme_set_include_certs): New function.
1670         (gpgme_get_include_certs): Likewise.
1671         (gpgme_new): Set include_certs to 1 (the default).
1672         * engine.c (_gpgme_engine_op_sign): Accept new argument include_certs,
1673         and pass it to _gpgme_gpgsm_op_sign.
1674         * engine.h (_gpgme_engine_op_sign): Likewise for prototype.
1675         * engine-gpgsm.c (_gpgme_gpgsm_op_sign): Accept new argument
1676         include_certs and handle it.
1677         * engine-gpgsm.h (_gpgme_gpgsm_start): Add new argument include_certs.
1678         * sign.c (gpgme_op_sign_start): Add new argument to
1679         _gpgme_engine_op_sign call.
1680
1681 2002-02-14  Werner Koch  <wk@gnupg.org>
1682
1683         * keylist.c (gpgme_op_keylist_start): Do not use a verbose listing.
1684
1685 2002-02-13  Werner Koch  <wk@gnupg.org>
1686
1687         * vasprintf.c, fopencookie.c: Add replacement functions.
1688         * util.h: Add prototypes for them.
1689
1690 2002-02-09  Marcus Brinkmann  <marcus@g10code.de>
1691
1692         * engine-gpgsm.c (gpgsm_assuan_simple_command): Return 0 if we
1693         reach the end of the function.
1694
1695 2002-02-09  Marcus Brinkmann  <marcus@g10code.de>
1696
1697         * genkey.c (gpgme_op_genkey_start): Fix logic in validity check.
1698         (gpgme_op_genkey_start): Skip newlines after opening tag.
1699
1700         * engine-gpgsm.c (_gpgme_gpgsm_start): Remove cruft.
1701
1702 2002-02-08  Marcus Brinkmann  <marcus@g10code.de>
1703
1704         * genkey.c (gpgme_op_genkey_start): Allow PUBKEY and SECKEY to be
1705         set, and pass them down to the crypto engine.
1706         * engine-gpgsm.h (_gpgme_gpgsm_start): New arguments PUBKEY and SECKEY.
1707         * engine.h: Likewise.
1708         * rungpg.h (_gpgme_gpg_spawn): Likewise.
1709         * engine.c (_gpgme_engine_op_genkey): Likewise.  Use those
1710         arguments.
1711         * rungpg.c (_gpgme_gpg_op_genkey): Likewise.  Complain if those
1712         arguments are set.
1713         * engine-gpgsm.c (_gpgme_gpgsm_op_genkey): Likewise.  Implement
1714         function.
1715
1716         * engine-gpgsm.c (_gpgme_gpgsm_op_keylist): Beautify comment.
1717
1718 2002-02-06  Marcus Brinkmann  <marcus@g10code.de>
1719
1720         * rungpg.c (_gpgme_gpg_op_keylist): Remove handling of keylist
1721         mode (for now).
1722
1723 2002-02-06  Marcus Brinkmann  <marcus@g10code.de>
1724
1725         * wait.c (gpgme_wait): Add new argument STATUS, in which the
1726         status of the returned context is returned.
1727         (_gpgme_wait_on_condition): Rework the function a bit, to make it
1728         aware of cancelled processes, and to allow to use gpgme_wait with
1729         CTX being NULL (as documented in the source).
1730         (struct proc_s): New member REPORTED.
1731         * gpgme.h: Fix prototype.
1732         * verify.c (gpgme_op_verify): Fix use of gpgme_wait.
1733         * sign.c (gpgme_op_sign): Likewise.
1734         * import.c (gpgme_op_import): Likewise.
1735         * genkey.c (gpgme_op_genkey): Likewise.
1736         * export.c (gpgme_op_export): Likewise.
1737         * encrypt.c (gpgme_op_encrypt): Likewise.
1738         * delete.c (gpgme_op_delete): Likewise.
1739         * decrypt-verify.c (gpgme_op_decrypt_verify): Likewise.
1740
1741 2002-02-06  Marcus Brinkmann  <marcus@g10code.de>
1742
1743         * gpgme.c (gpgme_set_keylist_mode): Possibly return an error
1744         value.
1745         (gpgme_get_keylist_mode): New function.
1746         (gpgme_new): Set the default for keylist_mode member of CTX.
1747
1748         * gpgme.h (gpgme_set_keylist_mode): Fix prototype.
1749         (gpgme_get_keylist_mode): New prototype.
1750         (GPGME_KEYLIST_MODE_LOCAL): New macro.
1751         (GPGME_KEYLIST_MODE_EXTERN): Likewise..
1752
1753 2002-02-02  Marcus Brinkmann  <marcus@g10code.de>
1754
1755         This patch has gotten a bit large... mmh.  The main thing that
1756         happens here is that error values are now not determined in the
1757         operation function after gpgme_wait completed, but in the status
1758         handler when EOF is received.  It should always be the case that
1759         either an error is flagged or EOF is received, so that after a
1760         gpgme_wait you should never have the situation that no error is
1761         flagged and EOF is not received.  One problem is that the engine
1762         status handlers don't have access to the context, a horrible
1763         kludge works around this for now.  All errors that happen during a
1764         pending operation should be catched and reported in ctx->error,
1765         including out-of-core and cancellation.  This rounds up neatly a
1766         couple of loose ends, and makes it possible to pass up any errors
1767         in the communication with the backend as well.  As a bonus, there
1768         will be a function to access gpgme->wait, so that the operations
1769         can truly be implemented with their _start function.
1770
1771         * engine-gpgsm.c (gpgsm_status_handler): Horrible kludge to report
1772         error back to the context.
1773         * rungpg.c (gpg_status_handler): Same horrible kludge applied here.
1774
1775         * engine-gpgsm.c (gpgsm_assuan_simple_command): Add error checking.
1776
1777         * wait.c (_gpgme_wait_on_condition): If canceled, set CTX->error
1778         to a value indication that.
1779
1780         * verify.c (add_notation): Set error, not out_of_core.
1781         (finish_sig): Likewise.
1782         (gpgme_op_verify_start): Don't clear out_of_core.
1783         (_gpgme_verify_status_handler): At EOF, clean up the notation data.
1784         (gpgme_op_verify): And don't do it here.
1785
1786         * trustlist.c (trustlist_status_handler): Check error, not out_of_core.
1787         (gpgme_op_trustlist_start): Don't clear out_of_core.
1788         (gpgme_op_trustlist_next): Check error, not out_of_core.
1789         (gpgme_op_trustlist_end): Likewise.
1790
1791         * ops.h (test_and_allocate_result): New macro.
1792         (_gpgme_passphrase_result): Remove prototype.
1793         * delete.c (gpgme_op_delete): Return error from context.
1794         (delete_status_handler): Use macro test_and_allocate_result.
1795         Perform error checking at EOF.
1796         (gpgme_op_delete_start): Release result.
1797         * passphrase.c (_gpgme_passphrase_status_handler): Use macro
1798         test_and_allocate_result, and perform error checking here.
1799         (_gpgme_passphrase_result): Function removed.
1800         * sign.c (gpgme_op_sign_start): Do not set out_of_core to zero.
1801         (gpgme_op_sign): Just return the error value from the context.
1802         (sign_status_handler): Only progress if no error is set yet.  If
1803         we process an EOF, set the resulting error value (if any).
1804         * decrypt.c (_gpgme_decrypt_result): Function removed.
1805         (create_result_struct): Function removed.
1806         (_gpgme_decrypt_status_handler): Use macro test_and_allocate_result,
1807         caclulate error on EOF, do not progress with errors.
1808         (_gpgme_decrypt_start): Do not set out_of_core to zero.
1809         (gpgme_op_decrypt): Just return the error value from the context.
1810         * encrypt.c (encrypt_status_handler): Perform the error checking
1811         here.
1812         (gpgme_op_encrypt_start): Do not clear out_of_core.
1813         * export.c (export_status_handler): Return if error is set in context.
1814         (gpgme_op_export_start): Release result.
1815         (gpgme_op_export): Return error from context.
1816         * decrypt-verify.c (gpgme_op_decrypt_verify): Return the error in
1817         the context.
1818         * genkey.c (genkey_status_handler): Use macro
1819         test_and_allocate_result.  Perform error checking at EOF.
1820         (gpgme_op_genkey): Just return the error from context.
1821         * import.c (gpgme_op_import): Return the error from context.
1822         (import_status_handler): Use macro test_and_allocate_result.
1823         * keylist.c (gpgme_op_keylist_start): Do not clear out_of_core.
1824         (gpgme_op_keylist_next): Return error of context.
1825         (keylist_colon_handler): Set error instead out_of_code.
1826         (finish_key): Likewise.
1827
1828         * context.h: Remove member out_of_core, add member error.
1829         * gpgme.c (_gpgme_release_result): Clear error flag.
1830
1831         * engine.h (_gpgme_engine_get_error): New prototype.
1832         * engine.c (_gpgme_engine_get_error): New function.
1833         * engine-gpgsm.c (_gpgme_gpgsm_get_error): New function.
1834
1835         * engine-gpgsm.c (map_assuan_error): New function.
1836         (gpgsm_assuan_simple_command): Change return type to GpgmeError,
1837         use the new function to map error values.
1838         (gpgsm_set_fd): Change return type tp GpgmeError.
1839         (_gpgme_gpgsm_op_decrypt): Change type of ERR to GpgmeError.
1840         (gpgsm_set_recipients): Likewise.  Change type of return value
1841         equivalently.  Adjust error values.
1842         (_gpgme_gpgsm_op_import): Likewise.
1843         (_gpgme_gpgsm_op_sign): Likewise.
1844         (struct gpgsm_object_s): New member error.
1845         (gpgsm_status_handler): Set error if error occurs.  Determine
1846         error number from ERR line received.  If assuan_read_line fails,
1847         terminate the connection.
1848
1849 2002-02-01  Marcus Brinkmann  <marcus@g10code.de>
1850
1851         * Makefile.am (MOSTLYCLEANFILES): New variable.
1852
1853 2002-02-01  Marcus Brinkmann  <marcus@g10code.de>
1854
1855         * engine-gpgsm.c (gpgsm_status_handler): At error, terminate the
1856         connection to the server.
1857
1858 2002-01-31  Marcus Brinkmann  <marcus@g10code.de>
1859
1860         * rungpg.h: Add STATUS_KEY_CREATED.
1861
1862         * progress.c: New file.
1863         * Makefile.am (libgpgme_la_SOURCES): Add progress.c.
1864
1865         * genkey.c (genkey_status_handler): Use
1866         _gpgme_progress_status_handler.  Add check for status.
1867         (struct genkey_result_s): New structure.
1868         (_gpgme_release_genkey_result): New function.
1869         (gpgme_op_genkey): Check for error.
1870         * gpgme.c (_gpgme_release_result): Call
1871         _gpgme_release_genkey_result.
1872         * ops.h (_gpgme_release_genkey_result): Add prototype.
1873         * types.h (GenKeyResult): New type.
1874         * context.h (gpgme_context_s): Add GenKeyResult to member result.
1875
1876 2002-01-30  Marcus Brinkmann  <marcus@g10code.de>
1877
1878         * gpgme.c (_gpgme_release_result): Call
1879         _gpgme_release_delete_result.
1880         * ops.h (_gpgme_release_delete_result): Add prototype.
1881         * types.h (DeleteResult): New type.
1882         * context.h (gpgme_context_s): Add DeleteResult to member result.
1883
1884         * delete.c (enum delete_problem): New type.
1885         (struct delete_result_s): New structure.
1886         (_gpgme_release_delete_result): New function.
1887         (delete_status_handler): Implement more status codes.
1888         (gpgme_op_delete): Return error on failure.
1889
1890         * import.c (MAX_IMPORTED_FIELDS): Bump up to 14.
1891
1892 2002-01-30  Marcus Brinkmann  <marcus@g10code.de>
1893
1894         * import.c (struct import_result_s): New structure.
1895         (_gpgme_release_import_result): New function.
1896         (append_xml_impinfo): Likewise.
1897         (import_status_handler): Implement.
1898         * gpgme.c (_gpgme_release_result): Add call to
1899         _gpgme_release_import_result.
1900         * ops.h (_gpgme_release_import_result): Add prototype.
1901         * types.h (ImportResult): New type.
1902         * context.h (gpgme_context_s): Add ImportResult to member result.
1903
1904         * encrypt.c (gpgme_op_encrypt): Code clean up.
1905
1906 2002-01-30  Marcus Brinkmann  <marcus@g10code.de>
1907
1908         * gpgme.h: Add lots of comment and fix the formatting.  Add
1909         gpgme_trustlist_end prototype.
1910
1911 2002-01-29  Marcus Brinkmann  <marcus@g10code.de>
1912
1913         * gpgme.h: Add new type GpgmeIdleFunc.  Change type of
1914         gpgme_register_idle to return and accept this type.
1915         * wait.c (gpgme_register_idle): Fix type.
1916         Save and return old value of idle_function.
1917
1918 2002-01-29  Werner Koch  <wk@gnupg.org>
1919
1920         * engine-gpgsm.c (_gpgme_gpgsm_op_keylist): Implement secret only mode.
1921
1922         * keylist.c (keylist_colon_handler): Add support for the new "crs"
1923         record type.
1924
1925 2002-01-22  Marcus Brinkmann  <marcus@g10code.de>
1926
1927         * engine-gpgsm.c (_gpgme_gpgsm_release): Call assuan_disconnect,
1928         not assuan_pipe_disconnect.
1929
1930         * Makefile.am (libgpgme_la_LIBADD): Change to link assuan and
1931         jnlib (needed by assuan) statically into libgpgme.  Linking a
1932         static library into a shared library this way is not portable.
1933
1934 2002-01-22  Marcus Brinkmann  <marcus@g10code.de>
1935
1936         * gpgme.h (GpgmePassphraseCb): Change type of R_HD from void* to
1937         void**.
1938
1939 2002-01-22  Marcus Brinkmann  <marcus@g10code.de>
1940
1941         * data.c (gpgme_data_new_from_filepart): Change type of LENGTH
1942         from off_t to size_t.
1943         * gpgme.h: Likewise.
1944
1945 2002-01-22  Marcus Brinkmann  <marcus@g10code.de>
1946
1947         * wait.c (_gpgme_wait_on_condition): If the process finished,
1948         reset the pending flag.  Also if the operation was cancelled.
1949
1950         (struct proc_s): Rename READY to DONE.
1951         (wait_item_s): Likewise.
1952         (set_process_ready): Rename to ...
1953         (set_process_done): ... this.
1954         (_gpgme_remove_proc_from_wait_queue): Call set_process_done
1955         instead set_process_ready.
1956         (_gpgme_wait_on_condition): Likewise.
1957         (do_select): Rename READY to DONE.
1958
1959         * verify.c (gpgme_op_verify): Do not set pending to zero here.
1960         * sign.c (gpgme_op_sign): Likewise.
1961         * import.c (gpgme_op_import): Likewise.
1962         * genkey.c (gpgme_op_genkey): Likewise.
1963         * export.c (gpgme_op_export): Likewise.
1964         * encrypt.c (gpgme_op_encrypt): Likewise.
1965         * delete.c (gpgme_op_delete): Likewise.
1966         * decrypt-verify.c (gpgme_op_decrypt_verify): Likewise.
1967         * decrypt.c (gpgme_op_decrypt): Likewise.
1968
1969 2002-01-22  Marcus Brinkmann  <marcus@g10code.de>
1970
1971         * export.c: Cleanup.
1972
1973 2002-01-15  Marcus Brinkmann  <marcus@g10code.de>
1974
1975         * trustlist.c: Various source clean ups.
1976         (my_isdigit): Removed.
1977         (gpgme_op_trustlist_end): New function.
1978
1979 2002-01-13  Marcus Brinkmann  <marcus@g10code.de>
1980
1981         * gpgme.c: Various source clean ups, like renaming C to CTX where
1982         appropriate.
1983         (gpgme_new): Clear R_CTX before starting the work.
1984         (my_isdigit): Removed.
1985         (my_isxdigit): Likewise.
1986
1987         * data.c: Various source clean ups.
1988         (gpgme_data_new_from_mem): Check BUFFER after clearing R_DH.
1989         (gpgme_data_new_with_read_cb): Similar for READ_CB.
1990         (gpgme_data_new_from_file): Loop over fread while EINTR.
1991         (gpgme_data_new_from_filepart): Rediddled a bit.  Allow LENGTH to
1992         be zero.  Loop over fread while EINTR.
1993
1994         (my_isdigit): Removed.
1995         (my_isxdigit): Likewise.
1996
1997 2001-12-21  Marcus Brinkmann  <marcus@g10code.de>
1998
1999         * engine-gpgsm.c (_gpgme_gpgsm_new): Replace General_Error with
2000         Pipe_Error where appropriate.
2001
2002 2001-12-19  Marcus Brinkmann  <marcus@g10code.de>
2003
2004         * engine.c: Include `string.h'.  Reported by Stéphane Corthésy.
2005
2006         * version.c (get_engine_info): Remove prototype.
2007
2008 2001-12-19  Marcus Brinkmann  <marcus@g10code.de>
2009
2010         * engine-gpgsm.c (_gpgme_gpgsm_new): New variable CHILD_FDS.
2011         Fill it with the servers fds, and pass it to assuan_pipe_connect.
2012
2013 2001-12-18  Marcus Brinkmann  <marcus@g10code.de>
2014
2015         * keylist.c (gpgme_op_keylist_end): New function.
2016         * gpgme.h (gpgme_op_keylist_end): New prototype.
2017
2018         * engine.h (gpgme_engine_check_version): Move prototype to ...
2019         * gpgme.h (gpgme_engine_check_version): ... here.
2020
2021         * genkey.c (gpgme_op_genkey_start): Remove unused variable.
2022
2023 2001-12-18  Marcus Brinkmann  <marcus@g10code.de>
2024
2025         * version.c (gpgme_get_engine_info): Reimplemented.
2026         (gpgme_check_engine): Reimplemented.
2027         (_gpgme_compare_versions): Return NULL if MY_VERSION is NULL.
2028
2029         * engine.c: Include `io.h'.
2030         (gpgme_engine_get_info): New function.
2031         * engine.h (gpgme_engine_check_version, _gpgme_engine_get_info):
2032         Add prototype.
2033
2034 2001-12-18  Marcus Brinkmann  <marcus@g10code.de>
2035
2036         * rungpg.c (struct reap_s, reap_list, reap_list_lock): Moved to ...
2037         * engine.c (struct reap_s, reap_list, reap_list_lock): ... here.
2038         Include `time.h', `sys/types.h', `assert.h', and `sema.h'.
2039
2040         * rungpg.c (_gpgme_engine_add_child_to_reap_list): New function.
2041         (do_reaping, _gpgme_gpg_housecleaning): Moved to ...
2042         * engine.c (do_reaping, _gpgme_engine_housecleaning): ... here.
2043         * rungpg.c (_gpgme_gpg_release): Replace code that is now in its
2044         own function by call to _gpgme_engine_add_child_to_reap_list().
2045
2046         * wait.c: Include `engine.h'.
2047         (run_idle): Call _gpgme_engine_housecleaning(), not
2048         _gpgme_gpg_housecleaning().
2049         
2050 2001-12-18  Marcus Brinkmann  <marcus@g10code.de>
2051
2052         * key.c (_gpgme_key_append_name): Append, not prepend, the uid.
2053         Initialize the next field of the uid structure.
2054         (gpgme_key_get_as_xml): Do not list last uid first.
2055
2056 2001-12-17  Marcus Brinkmann  <marcus@g10code.de>
2057
2058         * engine-gpgsm.c (_gpgme_gpgsm_set_colon_line_handler): New
2059         function [!ENABLE_GPGSM].
2060
2061 2001-12-14  Marcus Brinkmann  <marcus@g10code.de>
2062
2063         * engine-gpgsm.c (_gpgme_gpgsm_op_verify): Put TEXT into
2064         message_data, not SIG.
2065         (_gpgme_gpgsm_op_sign): Use `--detached', not `--detach'.
2066
2067         * sign.c (sign_status_handler): Call
2068         _gpgme_passphrase_status_handler early.
2069
2070 2001-12-14  Marcus Brinkmann  <marcus@g10code.de>
2071
2072         * engine-gpgsm.c: Revert last change.
2073
2074 2001-12-14  Marcus Brinkmann  <marcus@g10code.de>
2075
2076         * engine-gpgsm.c (gpgsm_status_handler): Freeze the output file
2077         handler when ending this operation, otherwise the wait function
2078         will sit on it.
2079
2080 2001-12-14  Marcus Brinkmann  <marcus@g10code.de>
2081
2082         * engine-gpgsm.c (struct gpgsm_object_s): New member colon.attic.
2083         (_gpgme_gpgsm_new): Initialize some more members.
2084         (_gpgme_gpgsm_release): Free the colon line handler's attic line.
2085         (gpgsm_status_handler): Rework the inline-data processing.
2086
2087 2001-12-13  Marcus Brinkmann  <marcus@g10code.de>
2088
2089         * rungpg.c (_gpgme_gpg_spawn): Do not add the fds to the child
2090         list that are not dup'ed, for those the close-on-exec flag is set
2091         now.
2092         * version.c (_gpgme_get_program_version): Remove first entry in
2093         CFD, as the close-on-exec flag is now set for this fd.
2094
2095 2001-12-13  Marcus Brinkmann  <marcus@g10code.de>
2096
2097         * engine-gpgsm.c (_gpgme_gpgsm_op_encrypt): Do not add `armor'
2098         option to `ENCRYPT'.
2099         * engine-gpgsm.c (gpgsm_set_recipients): Free LINE when returning
2100         successfully.
2101
2102 2001-12-13  Marcus Brinkmann  <marcus@g10code.de>
2103
2104         * engine-gpgsm.c (close_notify_handler): New function.
2105         (_gpgme_gpgsm_new): Manage the file descriptors a
2106         bit differently.  Do not set close-on-exec flags.
2107         (_gpgme_gpgsm_op_decrypt): Do not set message_fd
2108         to -1, this is done by the close handler.
2109         (_gpgme_gpgsm_op_encrypt): Likewise.
2110         (_gpgme_gpgsm_op_import): Likewise (also for output_fd).
2111         (_gpgme_gpgsm_op_keylist): Likewise (also for input_fd and output_fd).
2112         (_gpgme_gpgsm_op_sign): Likewise.
2113         (_gpgme_gpgsm_op_verify): Likewise, but for output_fd.
2114
2115         * posix-io.c (_gpgme_io_pipe): Set the close-on-exec flag for the
2116         non-inherited file descriptor index of the pipe.
2117
2118 2001-12-13  Werner Koch  <wk@gnupg.org>
2119
2120         * engine-gpgsm.c (_gpgme_gpgsm_set_colon_line_handler): New.
2121         (gpgsm_status_handler): Pass datalines to a colon handler
2122         * engine.c (_gpgme_engine_set_colon_line_handler): Set the colon
2123         handler for gpgsm.
2124
2125         * engine-gpgsm.c (_gpgme_gpgsm_op_keylist): Allow NULL for
2126         pattern.
2127         (gpgsm_assuan_simple_command): Removed underscore from
2128         assuan_write_line.
2129         (_gpgme_gpgsm_start): Ditto.
2130         (gpgsm_assuan_simple_command): Replaced interal Assuan read
2131         function by the new assuan_read_line.  Removed the use of the
2132         internal header.
2133         (gpgsm_status_handler): Ditto. Use the new assuan_pending_line.
2134         (_gpgme_gpgsm_start): Use the documented way to get an fd from
2135         assuan.
2136
2137         * keylist.c (keylist_colon_handler): Handle "crt" records
2138         * key.h (gpgme_key_s): Add an x509 flag.
2139         * key.c (parse_x509_user_id): New.
2140         (_gpgme_key_append_name): Handle x.509 names.
2141
2142 2001-12-05  Marcus Brinkmann  <marcus@g10code.de>
2143
2144         * engine-gpgsm.c (gpgsm_status_handler): Make it work with current
2145         version of assuan.
2146
2147 2001-12-05  Marcus Brinkmann  <marcus@g10code.de>
2148
2149         * engine-gpgsm.c (gpgsm_set_fd): Accept one more argument OPT.
2150         (_gpgme_gpgsm_op_encrypt): Pass armor argument to gpgsm_set_fd for
2151         output descriptor.
2152         (_gpgme_gpgsm_op_sign): Likewise.
2153
2154 2001-12-05  Marcus Brinkmann  <marcus@g10code.de>
2155
2156         * keylist.c (gpgme_op_keylist_next): Set pending to 0 if EOF
2157         occurs.
2158
2159 2001-11-26  Marcus Brinkmann  <marcus@g10code.de>
2160
2161         * engine-gpgsm.c (_gpgme_gpgsm_op_sign): Fix stupid typo.
2162
2163 2001-11-24  Marcus Brinkmann  <marcus@g10code.de>
2164
2165         * engine-gpgsm.c (gpgsm_status_handler): Don't break if bsearch fails.
2166         Deal with assuan read line returning more than one line (for now).
2167
2168 2001-11-23  Marcus Brinkmann  <marcus@g10code.de>
2169
2170         * engine-gpgsm.c (_gpgme_gpgsm_op_sign): Implement it according to
2171         the current protocol definition.
2172
2173 2001-11-23  Marcus Brinkmann  <marcus@g10code.de>
2174
2175         * engine-gpgsm.c (_gpgme_gpgsm_new): Set CLOEXEC flag for parent
2176         ends of the pipe.
2177
2178 2001-11-22  Marcus Brinkmann  <marcus@g10code.de>
2179
2180         * engine-gpgsm.c: Include stdlib.h and string.h.  Also include,
2181         for now, rungpg.h and status-table.h.
2182         (gpgsm_status_handler): Implement more of the status handler.
2183
2184 2001-11-22  Marcus Brinkmann  <marcus@g10code.de>
2185
2186         * engine.c (_gpgme_engine_op_decrypt): Implement CMS case.
2187         (_gpgme_engine_op_delete): Likewise.
2188         (_gpgme_engine_op_encrypt): Likewise.
2189         (_gpgme_engine_op_export): Likewise.
2190         (_gpgme_engine_op_genkey): Likewise.
2191         (_gpgme_engine_op_keylist): Likewise.
2192         (_gpgme_engine_op_sign): Likewise.
2193         (_gpgme_engine_op_trustlist): Likewise.
2194
2195         * engine-gpgsm.c (_gpgme_gpgsm_op_encrypt): New function.
2196         (gpgsm_assuan_simple_command): Likewise.
2197         (gpgsm_set_recipients): Likewise.
2198         (gpgsm_set_fd): Reimplement using gpgsm_assuan_simple_command.
2199         (_gpgme_gpgsm_op_delete): New function.
2200         (_gpgme_gpgsm_op_export): Likewise.
2201         (_gpgme_gpgsm_op_genkey): Likewise.
2202         (_gpgme_gpgsm_op_sign): Likewise.
2203         (_gpgme_gpgsm_op_keylist): Likewise.
2204         (_gpgme_gpgsm_op_trustlist): Likewise.
2205         (_gpgme_gpgsm_release): Release command.
2206         (_gpgme_gpgsm_op_decrypt): Allocate command.
2207         (_gpgme_gpgsm_op_import): Likewise.
2208         (gpgsm_status_handler): Also treat `ERR' strings as EOF.
2209
2210 2001-11-22  Marcus Brinkmann  <marcus@g10code.de>
2211
2212         * gpgme.h (gpgme_set_protocol): New prototype.
2213
2214 2001-11-22  Marcus Brinkmann  <marcus@g10code.de>
2215
2216         * engine-gpgsm.c (_gpgme_gpgsm_op_decrypt): New function.
2217         (_gpgme_gpgsm_op_import): Likewise.
2218
2219 2001-11-22  Marcus Brinkmann  <marcus@g10code.de>
2220
2221         * engine-gpgsm.c: Shuffle around header inclusion a bit, to still
2222         keep them seperate.
2223         (_gpgme_set_status_handler) [!ENABLE_GPGSM]: New function.
2224
2225 2001-11-22  Werner Koch  <wk@gnupg.org>
2226
2227         * engine-gpgsm.c: Include more headers so that NULL and mk_error
2228         is defined even with an undefined GPGSM_PATH.
2229
2230 2001-11-22  Marcus Brinkmann  <marcus@g10code.de>
2231
2232         * rungpg.c (gpg_inbound_handler, write_mem_data, write_cb_data,
2233         gpg_outbound_handler): Moved to ...
2234         * data.c (_gpgme_data_inbound_handler, write_mem_data,
2235         write_cb_data, _gpgme_data_outbound_handler): ... here.  Make the
2236         _gpgme_* ones non-static.
2237         * data.c: Include io.h.
2238
2239         * ops.h (_gpgme_data_inbound_handler): New prototype.
2240         (_gpgme_data_outbound_handler): Likewise.
2241         (_gpgme_gpg_spawn): Use these new functions.
2242
2243         * engine-gpgsm.h (_gpgme_gpgsm_op_decrypt, _gpgme_gpgsm_op_delete,
2244         _gpgme_gpgsm_op_encrypt, _gpgme_gpgsm_op_export,
2245         _gpgme_gpgsm_op_genkey, _gpgme_gpgsm_op_import,
2246         _gpgme_gpgsm_op_keylist, _gpgme_gpgsm_op_sign,
2247         _gpgme_gpgsm_op_trustlist, _gpgme_gpgsm_op_verify,
2248         _gpgme_gpgsm_start, _gpgme_gpgsm_set_status_handler): New prototype.
2249         Include <rungpg.h> for status handler function.
2250
2251         * engine-gpgsm.c (struct gpgsm_object_s): New members input_fd,
2252         input_data, output_fd, output_data, message_fd, message_data, command
2253         and status.
2254         (_gpgme_gpgsm_new): Open input, output and message pipes before
2255         connecting to the client.  Close server's ends afterwards.
2256         (_gpgme_gpgsm_release): Close open file descriptors.  Remove
2257         server process from wait queue.
2258         (_gpgme_gpgsm_op_verify, _gpgme_gpgsm_start,
2259         _gpgme_gpgsm_set_status_handler, gpgms_status_handler): New function.
2260         
2261         * engine.c (_gpgme_engine_start): Implement for GPGME_PROTOCOL_CMS.
2262         (_gpgme_engine_set_status_handler): Likewise.
2263         (_gpgme_engine_op_verify): Likewise.
2264
2265 2001-11-21  Marcus Brinkmann  <marcus@g10code.de>
2266
2267         * context.h: Do not include rungpg.h, but engine.h.
2268         (struct gpgme_context_s): Replace member gpg with engine.
2269         * gpgme.c (gpgme_release): Release engine, not gpg.
2270
2271         * recipient.c (_gpgme_append_gpg_args_from_recifgpients): Function
2272         moved ...
2273         * rungpg.c (_gpgme_append_gpg_args_from_recipients): ... here.
2274         Make static, change order of arguments, and return an error value.
2275         * ops.h (_gpgme_append_gpg_args_from_recipients): Removed prototype.
2276
2277         * rungpg.h (_gpgme_gpg_op_verify): Add prototype.
2278         (_gpgme_gpg_op_encrypt): Likewise.
2279         (_gpgme_gpg_op_decrypt): Likewise.
2280         (_gpgme_gpg_op_delete): Likewise.
2281         (_gpgme_gpg_op_export): Likewise.
2282         (_gpgme_gpg_op_genkey): Likewise.
2283         (_gpgme_gpg_op_import): Likewise.
2284         (_gpgme_gpg_op_keylist): Likewise.
2285         (_gpgme_gpg_op_sign): Likewise.
2286         (_gpgme_gpg_op_trustlist): Likewise.
2287         * rungpg.c (_gpgme_gpg_op_verify): New function.
2288         (_gpgme_gpg_op_encrypt): Likewise.
2289         (_gpgme_gpg_op_decrypt): Likewise.
2290         (_gpgme_gpg_op_delete): Likewise.
2291         (_gpgme_gpg_op_export): Likewise.
2292         (_gpgme_gpg_op_genkey): Likewise.
2293         (_gpgme_gpg_op_import): Likewise.
2294         (_gpgme_gpg_op_keylist): Likewise.
2295         (_gpgme_gpg_op_sign): Likewise.
2296         (_gpgme_gpg_op_trustlist): Likewise.
2297
2298         * engine.h (_gpgme_engine_set_status_handler): Add prototype.
2299         (_gpgme_engine_set_command_handler): Likewise.
2300         (_gpgme_engine_set_colon_line_handler): Likewise.
2301         (_gpgme_engine_op_decrypt): Likewise.
2302         (_gpgme_engine_op_delete): Likewise.
2303         (_gpgme_engine_op_encrypt): Likewise.
2304         (_gpgme_engine_op_export): Likewise.
2305         (_gpgme_engine_op_genkey): Likewise.
2306         (_gpgme_engine_op_import): Likewise.
2307         (_gpgme_engine_op_keylist): Likewise.
2308         (_gpgme_engine_op_sign): Likewise.
2309         (_gpgme_engine_op_trustlist): Likewise.
2310         (_gpgme_engine_op_verify): Likewise.
2311         (_gpgme_engine_start): Likewise.
2312         * engine.c (_gpgme_engine_set_status_handler): New function.
2313         (_gpgme_engine_set_command_handler): Likewise.
2314         (_gpgme_engine_set_colon_line_handler): Likewise.
2315         (_gpgme_engine_op_decrypt): Likewise.
2316         (_gpgme_engine_op_delete): Likewise.
2317         (_gpgme_engine_op_encrypt): Likewise.
2318         (_gpgme_engine_op_export): Likewise.
2319         (_gpgme_engine_op_genkey): Likewise.
2320         (_gpgme_engine_op_import): Likewise.
2321         (_gpgme_engine_op_keylist): Likewise.
2322         (_gpgme_engine_op_sign): Likewise.
2323         (_gpgme_engine_op_trustlist): Likewise.
2324         (_gpgme_engine_op_verify): Likewise.
2325         (_gpgme_engine_start): Likewise.
2326
2327         * verify.c (gpgme_op_verify_start): Reimplement in terms of above
2328         functions.
2329         * encrypt.c (gpgme_op_encrypt_start): Likewise.
2330         * decrypt.c (_gpgme_decrypt_start): Likewise.
2331         * passphrase.c (_gpgme_passphrase_start): Likewise.
2332         * keylist.c (gpgme_op_keylist_start): Likewise.
2333
2334 2001-11-20  Marcus Brinkmann  <marcus@g10code.de>
2335
2336         * types.h: Add types EngineObject and GpgsmObject.
2337
2338         * Makefile.am (libgpgme_la_SOURCES): Add engine-gpgsm.h,
2339         engine-gpgsm.c, engine.h and engine.c.
2340         * engine.h: New file.
2341         * engine.c: Likewise.
2342         * engine-gpgsm.h: Likewise.
2343         * engine-gpgsm.c: Likewise.
2344         
2345         * rungpg.c (_gpgme_gpg_get_version): New function.
2346         (_gpgme_gpg_check_version): Likewise.
2347         * rungpg.h: Add prototypes for _gpgme_gpg_get_version and
2348         _gpgme_gpg_check_version.
2349
2350         * version.c (compare_versions): Rename to ...
2351         (_gpgme_compare_versions): ... this.  Make non-static.
2352         (gpgme_check_version): Use _gpgme_compare_versions rather than
2353         compare_versions.
2354         (gpgme_check_engine): Likewise.
2355         * ops.h (_gpgme_get_program_version): Add prototype.
2356
2357 2001-11-20  Marcus Brinkmann  <marcus@g10code.de>
2358
2359         * Makefile.am (libgpgme_la_INCLUDES): Remove obsolete directive.
2360         (AM_CPPFLAGS): New directive [BUILD_ASSUAN].
2361         (libgpgme_la_LIBADD): Likewise.
2362
2363 2001-11-20  Marcus Brinkmann  <marcus@g10code.de>
2364
2365         * version.c: Remove global variables lineno and
2366         tmp_engine_version.
2367         (version_handler): Removed.
2368         (_gpgme_get_program_version): New function.
2369         (get_engine_info): Don't use context and version_handler,
2370         but _gpgme_get_program_version.
2371         * ops.h (_gpgme_get_program_version): Add prototype for
2372         _gpgme_get_program_version (we expect to use it elsewhere soon).
2373
2374 2001-11-18  Marcus Brinkmann  <marcus@g10code.de>
2375
2376         * version.c (get_engine_info): If GnuPG is not available, return
2377         an error message.
2378         * posix-util.c (_gpgme_get_gpg_path): Allow GPG_PATH to be
2379         undefined.
2380         (_gpgme_get_gpgsm_path): New function.
2381         * w32-util.c (find_program_in_registry): New static function.
2382         (_gpgme_get_gpg_path): Allow GPG_PATH to be undefined.  Rework
2383         to use find_program_in_registry.
2384         (_gpgme_get_gpgsm_path): New function.
2385         (util.h): Prototype _gpgme_get_gpgsm_path).
2386         * rungpg.c (_gpgme_gpg_spawn): Verify that _gpgme_get_gpg_path()
2387         returns non-null.
2388
2389 2001-11-16  Marcus Brinkmann  <marcus@g10code.de>
2390
2391         * decrypt-verify.c: New file.
2392         * Makefile.am (libgpgme_la_SOURCES): Add decrypt-verify.c.
2393         * types.h: Add decrypt-verify types.
2394         * ops.h: Likewise.
2395         * context.h: Add result type for decrypt-verify.
2396         * gpgme.h: Add decrypt-verify prototypes.
2397
2398         * decrypt.c (decrypt_status_handler): Renamed to ...
2399         (_gpgme_decrypt_status_handler): ... this.  Make non-static.
2400         (_gpgme_decrypt_start): New function, derived from
2401         gpgme_op_decrypt_start.
2402         (gpgme_op_decrypt_start): Reimplement in terms of
2403         _gpgme_decrypt_start.
2404         (_gpgme_decrypt_result): New function to retrieve error value.
2405         (gpgme_op_decrypt): Use _gpgme_decrypt_result.
2406         * ops.h: Add prototypes for new functions.
2407
2408         * verify.c (verify_status_handler): Renamed to ...
2409         (_gpgme_verify_status_handler): ... this.  Make non-static.
2410         (gpgme_op_verify_start): Use new function name.
2411         (intersect_stati): Renamed to ...
2412         (_gpgme_intersect_stati): ... this.  Make non-static.
2413         (gpgme_op_verify): Use new name.
2414         * ops.h: Add prototypes for new functions.
2415
2416 2001-11-16  Marcus Brinkmann  <marcus@g10code.de>
2417
2418         * passphrase.c: New file.
2419         * Makefile.am (libgpgme_la_SOURCES): Add passphrase.c.
2420         * ops.h (_gpgme_passphrase_result): Add prototypes from
2421         passphrase.c.
2422         * types.h: Likewise.
2423         * context.h: Add member passphrase to result.
2424         * gpgme.c (_gpgme_release_result): Release passphrase member.
2425
2426         * decrypt.c: Some formatting and variable name changes (like
2427         CTX instead C).
2428         (struct decrypt_result_s): Remove members now found in
2429         passphrase result.
2430         (_gpgme_release_decrypt_result): Don't release removed members.
2431         (decrypt_status_handler): Call _gpgme_passphrase_status_handler,
2432         and don't handle the cases catched there.
2433         (command_handler): Removed.
2434         (gpgme_op_decrypt_start): Don't set command handler, but invoke
2435         _gpgme_passphrase_start which does it.
2436         (gpgme_op_decrypt): Invoke _gpgme_passphrase_result and drop the
2437         cases covered by it.
2438
2439         * sign.c Some formatting and variable name changes (like
2440         CTX instead C).
2441         (struct sign_result_s): Remove members now found in
2442         passphrase result.
2443         (_gpgme_release_sign_result): Don't release removed members.
2444         (sign_status_handler): Call _gpgme_passphrase_status_handler,
2445         and don't handle the cases catched there.
2446         (command_handler): Removed.
2447         (gpgme_op_sign_start): Don't set command handler, but invoke
2448         _gpgme_passphrase_start which does it.
2449         (gpgme_op_sign): Invoke _gpgme_passphrase_result and drop the
2450         cases covered by it.
2451
2452 2001-11-15  Marcus Brinkmann  <marcus@g10code.de>
2453
2454         * decrypt.c (command_handler): Fix last change.
2455
2456 2001-11-15  Marcus Brinkmann  <marcus@g10code.de>
2457
2458         * verify.c (_gpgme_release_verify_result): Rename RES to RESULT.
2459         Rename R2 to NEXT_RESULT.
2460         (intersect_stati): Rename RES to RESULT.
2461         (gpgme_get_sig_status): Likewise.  Do not check return_type, but
2462         the member verify of result.
2463         (gpgme_get_sig_key): Likewise.
2464
2465         * sign.c (_gpgme_release_sign_result): Rename RES to RESULT.  If
2466         RESULT is zero, return.
2467         (sign_status_handler, command_handler): Do not check return_type,
2468         but the member sign of result.
2469         (gpgme_op_sign): Likewise.  Drop assertion.
2470
2471         * encrypt.c (_gpgme_release_encrypt_result): Rename RES to RESULT.
2472         If RESULT is zero, return.
2473         (encrypt_status_handler): Do not check return_type, but the member
2474         encrypt of result.
2475         (gpgme_op_encrypt): Likewise.  Drop assertion.
2476
2477         * decrypt.c (_gpgme_release_decrypt_result): Rename RES to RESULT.
2478         (create_result_struct): Do not set result_type.
2479         (command_handler, decrypt_status_handler): Do not check
2480         return_type, but the member decrypt of result.
2481         (gpgme_op_decrypt): Likewise.  Drop assertion.
2482
2483         * context.h (enum ResultType): Removed.
2484         (struct gpgme_context_s): Remove member result_type.
2485         (struct result): Replaces union result.
2486         * gpgme.c: Include string.h.
2487         (_gpgme_release_result): Release all members of c->result, which
2488         is now a struct.  Zero out all members of the struct afterwards.
2489
2490 2001-11-11  Marcus Brinkmann  <marcus@g10code.de>
2491
2492         * rungpg.c (_gpgme_gpg_release): Release GPG->cmd.cb_data.
2493         Release all members of the list GPG->arglist.
2494         Reported by Michael Schmidt <mschmidt@cs.uni-sb.de>.
2495
2496 2001-11-02  Marcus Brinkmann  <marcus@g10code.de>
2497
2498         * rungpg.c (pipemode_copy): Change type of NBYTES to size_t.
2499
2500         * key.c: Include string.h.
2501         * data.c: Likewise.
2502         * recipient.c: Likewise.
2503
2504 2001-10-29  Marcus Brinkmann  <marcus@g10code.de>
2505
2506         * context.h: New member signers_len.
2507         * signers.c (gpgme_signers_clear): Require that signers are
2508         non-NULL with assertion.  Use signers_len to determine how much
2509         keys to release.  Add documentation.
2510         (gpgme_signers_add): Use signers_len to determine if the buffer is
2511         large enough.  Use xtryrealloc rather than xtrymalloc and copying.
2512         Add documentation.
2513         (gpgme_signers_enum): Use signers_len to determine if key is
2514         available.  Add documentation.
2515
2516 2001-10-22  Marcus Brinkmann  <marcus@g10code.de>
2517
2518         * data.c (_gpgme_data_append): Check if LENGTH is smaller than
2519         ALLOC_CHUNK, not DH->length.
2520
2521 2001-10-17  Marcus Brinkmann  <marcus@g10code.de>
2522
2523         * gpgme.c (gpgme_set_protocol): Fix last change.
2524
2525 2001-10-15  Werner Koch  <wk@gnupg.org>
2526
2527         * gpgme.h (GpgmeProtocol): New.
2528         * gpgme.c (gpgme_set_protocol): New.
2529
2530 2001-09-26  Werner Koch  <wk@gnupg.org>
2531
2532         * gpgme.c (gpgme_set_passphrase_cb): Ignore a NULL context.
2533         (gpgme_set_progress_cb): Ditto. Suggested by Mark Mutz.
2534
2535 2001-09-17  Werner Koch  <wk@gnupg.org>
2536
2537         * keylist.c (finish_key): Shortcut for no tmp_key.  Changed all
2538         callers to use this function without a check for tmp_key.
2539         
2540         * keylist.c (gpgme_op_keylist_next): Reset the key_cond after
2541         emptying the queue.  Bug reported by Stéphane Corthésy.
2542
2543 2001-09-12  Werner Koch  <wk@gnupg.org>
2544
2545         * data.c (gpgme_data_rewind): Allow rewind for callbacks.
2546
2547 2001-09-07  Werner Koch  <wk@gnupg.org>
2548
2549         * rungpg.h: Add NO_RECP.
2550         * encrypt.c (encrypt_status_handler): Take on No_RECP.
2551         (gpgme_op_encrypt): Better error return.
2552
2553         * verify.c (verify_status_handler): Take on NODATA.
2554
2555 2001-09-03  Werner Koch  <wk@gnupg.org>
2556
2557         * rungpg.h: Added STATUS_INV_RECP.
2558         * gpgme.c (_gpgme_release_result): Add support for new
2559         EncryptResult object.
2560         * encrypt.c (append_xml_encinfo): New.
2561         (encrypt_status_handler): Add some status parsing.
2562         (_gpgme_release_encrypt_result): New.
2563
2564 2001-08-29  Werner Koch  <wk@gnupg.org>
2565
2566         * recipient.c (gpgme_recipients_release): Free the list.  By Timo.
2567
2568         * keylist.c (keylist_colon_handler): Do a finish key if we receive
2569         an EOF here.  This is probably the reason for a lot of bugs
2570         related to keylisting.  It is so obvious.  Kudos to Enno Cramer
2571         for pointing that out. 
2572
2573 2001-08-28  Werner Koch  <wk@gnupg.org>
2574
2575         * gpgme.c, gpgme.h (gpgme_get_op_info): New.
2576         (_gpgme_set_op_info): New. 
2577         (_gpgme_release_result): Reset the op_info here.
2578         * sign.c (append_xml_siginfo): New.
2579         (sign_status_handler): Store the sig create information.
2580
2581 2001-07-31  Werner Koch  <wk@gnupg.org>
2582
2583         * encrypt.c (gpgme_op_encrypt): Hack to detect no valid recipients.
2584
2585 2001-07-30  Werner Koch  <wk@gnupg.org>
2586
2587         * gpgme.c (gpgme_get_armor,gpgme_get_textmode): New.
2588
2589         * rungpg.c (build_argv): Disable armor comments
2590         * w32-io.c (build_commandline): Need to add quotes here
2591
2592 2001-07-24  Werner Koch  <wk@gnupg.org>
2593
2594         * data.c (gpgme_data_read): Add a a way to return the available bytes.
2595
2596 2001-07-23  Werner Koch  <wk@gnupg.org>
2597
2598         * util.c: Removed stpcpy() because we use the version from jnlib.
2599
2600 2001-07-19  Werner Koch  <wk@gnupg.org>
2601
2602         * mkstatus: Define the collating sequence for sort.
2603
2604 2001-06-26  Werner Koch  <wk@gnupg.org>
2605
2606         * rungpg.h: Add STATUS_UNEXPECTED as suggested by Timo.
2607
2608 2001-06-15  Werner Koch  <wk@gnupg.org>
2609
2610         * keylist.c (set_userid_flags): Fixed the assigned values. Kudos
2611         to Timo for pointing this out.
2612
2613 2001-06-01  Werner Koch  <wk@gnupg.org>
2614
2615         * debug.c (_gpgme_debug_begin): Fixed a /tmp race.  Noted by
2616         Johannes Poehlmann.
2617
2618 2001-05-28  Werner Koch  <wk@gnupg.org>
2619
2620         * version.c (gpgme_check_engine): Stop version number parsing at
2621         the opening angle and not the closing one.  By Tommy Reynolds.
2622
2623 2001-05-01  José Carlos García Sogo <jose@jaimedelamo.eu.org>
2624
2625         * encrypt.c (gpgme_op_encrypt_start): Deleted the assert ( !c->gpg )
2626         line, because it gave an error if another operation had been made 
2627         before using the same context.
2628         
2629         * decrypt.c (gpgme_op_decrypt_start): The same as above. Also added 
2630         one line to release the gpg object in the context (if any).
2631         
2632 2001-04-26  Werner Koch  <wk@gnupg.org>
2633
2634         * key.c, key.h (_gpgme_key_cache_init): New.
2635         (_gpgme_key_cache_add): New.
2636         (_gpgme_key_cache_get): New.
2637         * version.c (do_subsystem_inits): Init the cache.
2638         * keylist.c (finish_key): Put key into the cache
2639         * verify.c (gpgme_get_sig_key): First look into the cache.
2640
2641 2001-04-19  Werner Koch  <wk@gnupg.org>
2642
2643         * keylist.c (parse_timestamp): Adjusted for the changed
2644         --fixed-list-mode of gpg 1.0.4h.
2645
2646 2001-04-05  Werner Koch  <wk@gnupg.org>
2647
2648         * verify.c (gpgme_op_verify_start): Enabled pipemode for detached sigs.
2649
2650 2001-04-04  Werner Koch  <wk@gnupg.org>
2651
2652         * w32-io.c (_gpgme_io_select): Don't select on the writer if there
2653         are still bytes pending.  Timo found this not easy to track down
2654         race condition. 
2655
2656 2001-04-02  Werner Koch  <wk@gnupg.org>
2657
2658         * gpgme.h: Add GPGME_ATTR_KEY_{EXPIRED,DISABLED}.
2659         * key.c (gpgme_key_get_ulong_attr): And return those attribs.
2660
2661         * verify.c (gpgme_get_sig_key): Set keyliosting mode depending on 
2662         the mode set in the current context.  Suggested by Timo.
2663
2664         * key.c (gpgme_key_get_ulong_attr): Return can_certify and not
2665         can_encrypt. By Timo.
2666
2667 2001-03-30  Werner Koch  <wk@gnupg.org>
2668
2669         * debug.c (debug_init): Allow to specify a debug file.
2670         (_gpgme_debug_level): New.
2671
2672         * posix-io.c (_gpgme_io_read, _gpgme_io_write): Print output.
2673         (_gpgme_io_select): Debug only with level > 2.
2674
2675 2001-03-15  Werner Koch  <wk@gnupg.org>
2676
2677         * rungpg.c: Included time.h.
2678
2679         * key.h: New keyflags for capabilities.
2680         * keylist.c (set_mainkey_capability, set_subkey_capability): New.
2681         (keylist_colon_handler): Parse them.
2682         * gpgme.h: New attribute values for capabilties.
2683         * key.c (gpgme_key_get_string_attr): Return them.
2684         (capabilities_to_string): New.
2685         (gpgme_key_get_ulong_attr): Return the global caps.
2686
2687 2001-03-14  Werner Koch  <wk@gnupg.org>
2688
2689         * w32-io.c (destroy_reader,destroy_writer): Fixed syntax error. 
2690         Thanks to Jan Oliver Wagner.
2691
2692 2001-03-13  Werner Koch  <wk@gnupg.org>
2693
2694         * context.h: Add invalid and revoke flags to user_id structure.
2695         * keylist.c (gpgme_op_keylist_start): Use --fixed-list-mode.
2696         (keylist_colon_handler): Adjust for that.
2697         (set_userid_flags): New. 
2698         (set_mainkey_trust_info): Handle new key invalid flag
2699         (set_subkey_trust_info): Ditto.
2700         * gpgme.h: Add new attributes for key and user ID flags.
2701         * key.c (_gpgme_key_append_name): Init these flags
2702         (gpgme_key_get_as_xml): Print them.
2703         (one_uid_as_xml): New helper for above.
2704         (gpgme_key_get_string_attr, gpgme_key_get_ulong_attr):
2705         Return the new attributes.  Enhanced, so that subkey information
2706         can be returned now.
2707
2708 2001-02-28  Werner Koch  <wk@gnupg.org>
2709
2710         * w32-io.c (destroy_reader): Set stop_me flag.
2711         (writer,create_writer,destroy_writer,find_writer,kill_writer): New.
2712         (_gpgme_io_write): Use a writer thread to avaoid blocking.
2713         (_gpgme_io_close): Cleanup a writer thread
2714         (_gpgme_io_select): Repalce tthe faked wait on writing by a real
2715         waiting which is now possible due to the use of a writer thread.
2716
2717 2001-02-20  Werner Koch  <wk@gnupg.org>
2718
2719         * w32-io.c (destroy_reader,kill_reader): New. 
2720         (create_reader, reader): Add a new event to stop the thread.
2721         (_gpgme_io_close): Kill the reader thread.
2722
2723         * posix-io.c (_gpgme_io_select): Handle frozen fds here. 
2724         * 32-io.c (_gpgme_io_select): Ditto. Removed a bunch of unused code.
2725
2726         * wait.c: Reworked the whole thing.
2727         * rungpg.c (_gpgme_gpg_new): Init pid to -1.
2728         (_gpgme_gpg_release): Remove the process from the wait queue.
2729
2730 2001-02-19  Werner Koch  <wk@gnupg.org>
2731
2732         * w32-io.c (_gpgme_io_set_close_notify): New.
2733         (_gpgme_io_close): Do the notification.
2734
2735         * posix-io.c (_gpgme_io_select): Use a 1 sec timeout and not 200
2736         microseconds.
2737
2738         * wait.c (remove_process): Don't close the fd here.
2739         (do_select): Set the fd to -1 and remove the is_closed flag everywhere.
2740         (_gpgme_wait_on_condition): Remove the assert on the queue and
2741         break out if we could not find the queue.  The whole thing should
2742         be reworked.
2743
2744         * posix-io.c (_gpgme_io_set_close_notify): New.
2745         (_gpgme_io_close): Do the notification.
2746
2747         * rungpg.c (close_notify_handler): New. 
2748         (_gpgme_gpg_new): Register a callback for the fd.
2749         (_gpgme_gpg_set_colon_line_handler): Ditto.
2750         (build_argv): Ditto
2751
2752 2001-02-13  Werner Koch  <wk@gnupg.org>
2753
2754         * rungpg.c (struct reap_s): Replaced pid_t by int.
2755
2756         * types.h: Add ulong typedef.
2757
2758         * rungpg.c (do_reaping,_gpgme_gpg_housecleaning): New.
2759         (_gpgme_gpg_release): Reap children.
2760         * io.h, posix-io.c (_gpgme_io_kill): New.
2761         * w32-io.c (_gpgme_io_kill): New (dummy).
2762
2763         * keylist.c (gpgme_op_keylist_start): Cancel a pending request.
2764
2765         * posix-io.c (_gpgme_io_read): Add some debug output. 
2766         (_gpgme_io_write): Ditto.
2767         (_gpgme_io_select): Increased the timeout.
2768
2769 2001-02-12  Werner Koch  <wk@gnupg.org>
2770
2771         Enhanced the signature verification, so that it can how handle
2772         more than one signature and is able to return more information on 
2773         the signatures.
2774         * verify.c (gpgme_get_sig_key): New.
2775         (gpgme_get_sig_status): New.
2776
2777         * gpgme.h: Add stdio.h. 
2778         (GpgmeSigStat): New status DIFF.
2779
2780 2001-02-01  Werner Koch  <wk@gnupg.org>
2781
2782         * w32-io.c (set_synchronize): Add EVENT_MODIFY_STATE.  Add Debug
2783         code to all Set/ResetEvent().
2784
2785         * rungpg.c (read_status): Check for end of stream only if we have
2786         an r.  By Timo.
2787
2788 2001-01-31  Werner Koch  <wk@gnupg.org>
2789
2790         * wait.c (_gpgme_wait_on_condition): Removed all exit code processing.
2791         (propagate_term_results,clear_active_fds): Removed.
2792         (count_active_fds): Renamed to .. 
2793         (count_active_and_thawed_fds): .. this and count only thawed fds. 
2794
2795         * rungpg.c (gpg_colon_line_handler): Return colon.eof and not
2796         status.eof ;-)
2797
2798 2001-01-30  Werner Koch  <wk@gnupg.org>
2799
2800         * w32-io.c (_gpgme_io_spawn): Use the supplied path arg.
2801
2802         * version.c (get_engine_info): Return better error information.
2803
2804         * posix-util.c, w32-util.c: New.
2805         (_gpgme_get_gpg_path): New, suggested by Jan-Oliver.
2806         * rungpg.c (_gpgme_gpg_spawn): Use new function to get GPG's path.
2807
2808         * signers.c (gpgme_signers_add): Ooops, one should test code and
2809         not just write it; the newarr was not assigned.  Thanks to José
2810         for pointing this out.  Hmmm, still not tested, why shoudl a coder
2811         test his fix :-)
2812
2813         * w32-io.c: Does now use reader threads, so that we can use
2814         WaitForMultipleObjects. 
2815         * sema.h, posix-sema.c, w32-sema.c: Support for Critcial sections.
2816         Does currently only work for W32.
2817
2818         * debug.c, util.h : New. Changed all fprintfs to use this new
2819         set of debugging functions.
2820
2821 2001-01-23  Werner Koch  <wk@gnupg.org>
2822
2823         * data.c (_gpgme_data_release_and_return_string): Fixed string
2824         termination.
2825
2826 2001-01-22  Werner Koch  <wk@gnupg.org>
2827
2828         * delete.c: New.
2829
2830         * signers.c: New.
2831         * key.c (gpgme_key_ref, gpgme_key_unref): New.
2832         * sign.c (gpgme_op_sign_start): Allow the use of other keys.
2833
2834         * version.c (gpgme_get_engine_info,gpgme_check_engine): New.
2835         * rungpg.c (_gpgme_gpg_set_simple_line_handler): New.
2836
2837 2001-01-05  Werner Koch  <wk@gnupg.org>
2838
2839         * data.c (gpgme_data_rewind): Allow to rewind data_type_none.
2840
2841
2842  Copyright 2001, 2002 g10 Code GmbH
2843
2844  This file is free software; as a special exception the author gives
2845  unlimited permission to copy and/or distribute it, with or without
2846  modifications, as long as this notice is preserved.
2847
2848  This file is distributed in the hope that it will be useful, but
2849  WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
2850  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
2851