/** * Write data to stream. * * @param os the output stream * @param data start of data to write * @param len length of data to write * * @return size of data written, -1 on error. */ ssize_t ostream_write(ostream_t *os, const void *data, size_t len) { ssize_t w = (ssize_t) -1; ostream_check(os); len = MIN(len, MAX_INT_VAL(ssize_t)); switch (os->type) { case OSTREAM_T_FILE: { size_t n = fwrite(data, len, 1, os->u.f); w = (0 == n) ? -1 : (ssize_t) len; } break; case OSTREAM_T_FD: w = write(os->u.fd, data, len); break; case OSTREAM_T_MEM: pmsg_slist_append(os->u.sl, data, len); w = len; break; case OSTREAM_T_PMSG: w = pmsg_write(os->u.mb, data, len); w = (len == UNSIGNED(w)) ? w : -1; break; case OSTREAM_T_MAX: g_assert_not_reached(); } if (-1 == w) os->ioerr = TRUE; return w; }
/** * Append data to the dump buffer. */ static void dump_append(struct dump *dump, const void *data, size_t size) { g_return_if_fail(dump->slist); pmsg_slist_append(dump->slist, data, size); dump->fill += size; }