From: Martin Willi Date: Thu, 27 Jun 2013 09:46:41 +0000 (+0200) Subject: stream: add printf()-style covenience functions X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a44b92b6073c806c466ed6c94c1fc7656553ca64;p=thirdparty%2Fstrongswan.git stream: add printf()-style covenience functions --- diff --git a/src/libstrongswan/networking/streams/stream.c b/src/libstrongswan/networking/streams/stream.c index 43a6bd47e2..144792e08c 100644 --- a/src/libstrongswan/networking/streams/stream.c +++ b/src/libstrongswan/networking/streams/stream.c @@ -33,6 +33,11 @@ struct private_stream_t { * Underlying socket */ int fd; + + /** + * FILE* for convenience functions, or NULL + */ + FILE *file; }; METHOD(stream_t, read_, ssize_t, @@ -91,10 +96,44 @@ METHOD(stream_t, write_, ssize_t, } } +METHOD(stream_t, vprint, int, + private_stream_t *this, char *format, va_list ap) +{ + if (!this->file) + { + this->file = fdopen(this->fd, "w+"); + if (!this->file) + { + return -1; + } + } + return vfprintf(this->file, format, ap); +} + +METHOD(stream_t, print, int, + private_stream_t *this, char *format, ...) +{ + va_list ap; + int ret; + + va_start(ap, format); + ret = vprint(this, format, ap); + va_end(ap); + + return ret; +} + METHOD(stream_t, destroy, void, private_stream_t *this) { - close(this->fd); + if (this->file) + { + fclose(this->file); + } + else + { + close(this->fd); + } free(this); } @@ -109,6 +148,8 @@ stream_t *stream_create_from_fd(int fd) .public = { .read = _read_, .write = _write_, + .print = _print, + .vprint = _vprint, .destroy = _destroy, }, .fd = fd, diff --git a/src/libstrongswan/networking/streams/stream.h b/src/libstrongswan/networking/streams/stream.h index 219e16ade9..bcf7fb4143 100644 --- a/src/libstrongswan/networking/streams/stream.h +++ b/src/libstrongswan/networking/streams/stream.h @@ -64,6 +64,24 @@ struct stream_t { */ ssize_t (*write)(stream_t *this, void *buf, size_t len, bool block); + /** + * printf() convenience function for this stream. + * + * @param format printf format string + * @param ... argument list for format string + * @return number of characters written, negative on error + */ + int (*print)(stream_t *this, char *format, ...); + + /** + * vprintf() convenience function for this stream. + * + * @param format printf format string + * @param ap argument list for format string + * @return number of characters written, negative on error + */ + int (*vprint)(stream_t *this, char *format, va_list ap); + /** * Destroy a stream_t. */