X-Git-Url: https://git.distorted.org.uk/~mdw/disorder/blobdiff_plain/681cb9fb117ab20661273bf45bd5eaa75eddbf8a..902b9f3ff9d45ff4dccc35b1acaa3311865656ad:/lib/sink.c diff --git a/lib/sink.c b/lib/sink.c index 2c1279b..84b9c25 100644 --- a/lib/sink.c +++ b/lib/sink.c @@ -1,38 +1,33 @@ /* * This file is part of DisOrder - * Copyright (C) 2004, 2007, 2008 Richard Kettlewell + * Copyright (C) 2004, 2007-9, 2013 Richard Kettlewell * - * This program is free software; you can redistribute it and/or modify + * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA + * along with this program. If not, see . */ /** @file lib/sink.c * @brief Abstract output sink type */ -#include -#include "types.h" +#include "common.h" -#include #include -#include #include #include "mem.h" #include "vector.h" -#include "sink.h" #include "log.h" +#include "sink.h" #include "printf.h" /** @brief Formatted output to a sink @@ -60,6 +55,14 @@ int sink_printf(struct sink *s, const char *fmt, ...) { return n; } +static int sink_generic_flush(struct sink attribute((unused)) *s) { + return 0; +} + +static int sink_generic_error(struct sink attribute((unused)) *s) { + return 0; +} + /* stdio sink *****************************************************************/ /** @brief Sink that writes to a stdio @c FILE */ @@ -72,6 +75,8 @@ struct stdio_sink { /** @brief Stream to write to */ FILE *fp; + + int error; }; /** @brief Reinterpret a @ref sink as a @ref stdio_sink */ @@ -81,14 +86,19 @@ struct stdio_sink { static int sink_stdio_write(struct sink *s, const void *buffer, int nbytes) { int n = fwrite(buffer, 1, nbytes, S(s)->fp); if(n < nbytes) { + S(s)->error = errno; if(S(s)->name) - fatal(errno, "error writing to %s", S(s)->name); + disorder_fatal(errno, "error writing to %s", S(s)->name); else return -1; } return n; } +static int sink_stdio_error(struct sink *s) { + return S(s)->error; +} + /** @brief Create a sink that writes to a stdio stream * @param name Filename for use in error messages * @param fp Stream to write to @@ -98,6 +108,9 @@ struct sink *sink_stdio(const char *name, FILE *fp) { struct stdio_sink *s = xmalloc(sizeof *s); s->s.write = sink_stdio_write; + s->s.flush = sink_generic_flush; + s->s.error = sink_stdio_error; + s->s.eclass = ec_errno; s->name = name; s->fp = fp; return (struct sink *)s; @@ -127,6 +140,9 @@ struct sink *sink_dynstr(struct dynstr *output) { struct dynstr_sink *s = xmalloc(sizeof *s); s->s.write = sink_dynstr_write; + s->s.flush = sink_generic_flush; + s->s.error = sink_generic_error; + s->s.eclass = ec_errno; s->d = output; return (struct sink *)s; } @@ -144,6 +160,9 @@ struct sink *sink_discard(void) { struct sink *s = xmalloc(sizeof *s); s->write = sink_discard_write; + s->flush = sink_generic_flush; + s->error = sink_generic_error; + s->eclass = ec_errno; return s; } @@ -160,6 +179,9 @@ struct sink *sink_error(void) { struct sink *s = xmalloc(sizeof *s); s->write = sink_error_write; + s->flush = sink_generic_flush; + s->error = sink_generic_error; + s->eclass = ec_errno; return s; }