is very simple. Currently, the output has a very plain format. In the
future, further work may be done on improving the output appearance.
-There are is only one option:
+There are only a few options:
@table @code
@item output-file=@var{file-name}
File to which output should be sent. This can be an ordinary file name
(i.e., @code{"pspp.ps"}), a pipe (i.e., @code{"|lpr"}), or
-stdout (@code{"-"}). Default: @code{"pspp.html"}.
+stdout (@code{"-"}). Default: @file{"pspp.html"}.
+
+@item chart-files=@var{file-name-template}
+Template for the file names used for charts, which are output in PNG
+format. The name should contain a single @samp{#}, which is replaced by
+the chart number. Default: @file{"pspp-#.png"}.
@end table
@node Miscellaneous configuring,, HTML driver class, Configuration
+Sat Jul 1 17:20:03 2006 Ben Pfaff <blp@gnu.org>
+
+ Make the destination for charts configurable in the HTML driver.
+ Fixes bug #15723, "HTML driver creates .png files insecurely".
+
+ * htmlP.h: (struct html_driver_ext) Add chart_file_name, chart_cnt
+ members.
+
+ * html.c: (html_open_driver) Initialize new members.
+ (option_tab var) Add "chart-files" option.
+ (handle_option) Parse "chart-files" option.
+ (html_initialise_chart) Name file based on "chart-files" option.
+
Sat Jul 1 22:41:26 2006 Ben Pfaff <blp@gnu.org>
Fix bug #16644: Output Driver crashes in DISPLAY VARIABLES.
#include "manager.h"
#include "table.h"
#include <libpspp/version.h>
-#include <data/make-file.h>
+
+#include "size_max.h"
#include "gettext.h"
#define _(msgid) gettext (msgid)
this->ext = x = xmalloc (sizeof *x);
x->file_name = xstrdup ("pspp.html");
+ x->chart_file_name = xstrdup ("pspp-#.png");
x->file = NULL;
+ x->chart_cnt = 0;
outp_parse_options (options, handle_option, this);
static struct outp_option option_tab[] =
{
{"output-file", string_arg, 0},
+ {"chart-files", string_arg, 1},
{NULL, 0, 0},
};
key);
break;
case string_arg:
- free (x->file_name);
- x->file_name = ds_xstrdup (val);
+ switch (subcat)
+ {
+ case 0:
+ free (x->file_name);
+ x->file_name = ds_xstrdup (val);
+ break;
+ case 1:
+ if (ds_find_char (val, '#') != SIZE_MAX)
+ {
+ free (x->chart_file_name);
+ x->chart_file_name = ds_xstrdup (val);
+ }
+ error (0, 0, _("`chart-files' value must contain `#'"));
+ break;
+ default:
+ abort ();
+ }
break;
default:
abort ();
}
static void
-html_initialise_chart(struct outp_driver *d UNUSED, struct chart *ch)
+html_initialise_chart (struct outp_driver *this, struct chart *ch)
{
-
- FILE *fp;
-
- make_unique_file_stream(&fp, &ch->file_name);
-
#ifdef NO_CHARTS
- ch->lp = 0;
+ ch->lp = NULL;
#else
- ch->pl_params = pl_newplparams();
+ struct html_driver_ext *x = this->ext;
+
+ FILE *fp;
+ int number_pos;
+
+ x->chart_cnt++;
+
+ number_pos = strchr (x->chart_file_name, '#') - x->chart_file_name;
+ ch->file_name = xasprintf ("%.*s%d%s",
+ number_pos, x->chart_file_name,
+ x->chart_cnt,
+ x->chart_file_name + number_pos + 1);
+ fp = fopen (ch->file_name, "wb");
+ if (fp == NULL)
+ {
+ error (0, errno, _("creating \"%s\""), ch->file_name);
+ free (ch->file_name);
+ ch->file_name = NULL;
+ return;
+ }
+
+ ch->pl_params = pl_newplparams ();
ch->lp = pl_newpl_r ("png", 0, fp, stderr, ch->pl_params);
#endif
-
}
static void