From 3d4ef0c814698381371c9d5563cf158950af896c Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Mon, 26 Nov 2007 11:00:39 +0000 Subject: [PATCH] Add option --data to GETAUDITLOG command. Return HTML formatted dummy output. --- common/audit.c | 29 ++++++++++++++++++----------- common/audit.h | 3 ++- sm/ChangeLog | 4 ++-- sm/gpgsm.c | 7 +++---- sm/server.c | 44 ++++++++++++++++++++++++++++++++------------ 5 files changed, 57 insertions(+), 30 deletions(-) diff --git a/common/audit.c b/common/audit.c index baa7d8d51..d82052363 100644 --- a/common/audit.c +++ b/common/audit.c @@ -297,18 +297,20 @@ audit_log_cert (audit_ctx_t ctx, audit_event_t event, /* Print the formatted audit result. THIS IS WORK IN PROGRESS. */ void -audit_print_result (audit_ctx_t ctx, FILE *fp) +audit_print_result (audit_ctx_t ctx, estream_t out) { int idx; int maxlen; size_t n; + es_fputs ("
\n", out); + if (!ctx) - return; + goto leave; if (!ctx->log || !ctx->logused) { - fprintf (fp, "AUDIT-LOG: No entries\n"); - return; + es_fprintf (out, "

AUDIT-LOG: No entries

\n"); + goto leave; } for (idx=0,maxlen=0; idx < DIM (eventstr_msgidx); idx++) @@ -318,19 +320,24 @@ audit_print_result (audit_ctx_t ctx, FILE *fp) maxlen = n; } + es_fputs ("\n", out); + + leave: + es_fputs ("
\n", out); } diff --git a/common/audit.h b/common/audit.h index ca7b70405..83baa41c7 100644 --- a/common/audit.h +++ b/common/audit.h @@ -22,6 +22,7 @@ #include +#include "estream.h" struct audit_ctx_s; typedef struct audit_ctx_s *audit_ctx_t; @@ -132,7 +133,7 @@ void audit_log_s (audit_ctx_t ctx, audit_event_t event, const char *value); void audit_log_cert (audit_ctx_t ctx, audit_event_t event, ksba_cert_t cert, gpg_error_t err); -void audit_print_result (audit_ctx_t ctx, FILE *fp); +void audit_print_result (audit_ctx_t ctx, estream_t stream); diff --git a/sm/ChangeLog b/sm/ChangeLog index 20f2866b1..d53740463 100644 --- a/sm/ChangeLog +++ b/sm/ChangeLog @@ -1,7 +1,7 @@ -2007-11-22 Werner Koch +h2007-11-22 Werner Koch * server.c (cmd_getauditlog): New. - (register_commands): Register GETAUDITLOG + (register_commands): Register GETAUDITLOG. 2007-11-19 Werner Koch diff --git a/sm/gpgsm.c b/sm/gpgsm.c index 7ed4372a2..9958a8138 100644 --- a/sm/gpgsm.c +++ b/sm/gpgsm.c @@ -1649,7 +1649,7 @@ main ( int argc, char **argv) case aVerify: { FILE *fp = NULL; - FILE *auditfp = NULL; + estream_t auditfp = NULL; set_binary (stdin); if (argc == 2 && opt.outfile) @@ -1661,7 +1661,7 @@ main ( int argc, char **argv) { audit_release (ctrl.audit); ctrl.audit = audit_new (); - auditfp = open_fwrite (auditlog); + auditfp = open_es_fwrite (auditlog); } if (!argc) @@ -1682,8 +1682,7 @@ main ( int argc, char **argv) if (fp && fp != stdout) fclose (fp); - if (auditfp && auditfp != stdout) - fclose (auditfp); + es_fclose (auditfp); } break; diff --git a/sm/server.c b/sm/server.c index beab14284..d54865ac9 100644 --- a/sm/server.c +++ b/sm/server.c @@ -934,36 +934,56 @@ cmd_genkey (assuan_context_t ctx, char *line) -/* GETAUDITLOG +/* GETAUDITLOG [--data] !!!WORK in PROGRESS!!! + + If --data is used, the output is send using D-lines and not to the + source given by an OUTPUT command. */ static int cmd_getauditlog (assuan_context_t ctx, char *line) { ctrl_t ctrl = assuan_get_pointer (ctx); int out_fd; - FILE *out_fp; + estream_t out_stream; + int opt_data; int rc; + opt_data = has_option (line, "--data"); + line = skip_options (line); + if (!ctrl->audit) return gpg_error (GPG_ERR_NO_DATA); - out_fd = translate_sys2libc_fd (assuan_get_output_fd (ctx), 1); - if (out_fd == -1) - return set_error (GPG_ERR_ASS_NO_OUTPUT, NULL); - - out_fp = fdopen ( dup(out_fd), "w"); - if (!out_fp) + if (opt_data) { - return set_error (GPG_ERR_ASS_GENERAL, "fdopen() failed"); + out_stream = es_fopencookie (ctx, "w", data_line_cookie_functions); + if (!out_stream) + return set_error (GPG_ERR_ASS_GENERAL, + "error setting up a data stream"); } - audit_print_result (ctrl->audit, out_fp); + else + { + out_fd = translate_sys2libc_fd (assuan_get_output_fd (ctx), 1); + if (out_fd == -1) + return set_error (GPG_ERR_ASS_NO_OUTPUT, NULL); + + out_stream = es_fdopen_nc ( dup (out_fd), "w"); + if (!out_stream) + { + return set_error (GPG_ERR_ASS_GENERAL, "es_fdopen() failed"); + } + } + + audit_print_result (ctrl->audit, out_stream); rc = 0; - fclose (out_fp); + + es_fclose (out_stream); /* Close and reset the fd. */ - assuan_close_output_fd (ctx); + if (!opt_data) + assuan_close_output_fd (ctx); return rc; }