static void test_cat_seek (GMimeStream *whole, struct _StreamPart *parts, int bounded) { struct _StreamPart *part = parts; GMimeStream *stream, *cat; gint64 offset, len; Exception *ex; int fd; if (whole->bound_end != -1) { len = whole->bound_end - whole->bound_start; } else if ((len = g_mime_stream_length (whole)) == -1) { ex = exception_new ("unable to get original stream length"); throw (ex); } cat = g_mime_stream_cat_new (); while (part != NULL) { d(fprintf (stderr, "adding %s start=%lld, end=%lld...\n", part->filename, part->pstart, part->pend)); if ((fd = open (part->filename, O_RDONLY, 0)) == -1) { ex = exception_new ("could not open `%s': %s", part->filename, g_strerror (errno)); g_object_unref (cat); throw (ex); } stream = g_mime_stream_fs_new_with_bounds (fd, part->pstart, bounded ? part->pend : -1); g_mime_stream_cat_add_source ((GMimeStreamCat *) cat, stream); g_object_unref (stream); part = part->next; } /* calculate a random seek offset to compare at */ offset = (gint64) (len * (rand () / (RAND_MAX + 1.0))); if (g_mime_stream_seek (whole, offset, GMIME_STREAM_SEEK_SET) == -1) { ex = exception_new ("could not seek to %lld in original stream: %s", offset, g_strerror (errno)); throw (ex); } if (g_mime_stream_seek (cat, offset, GMIME_STREAM_SEEK_SET) == -1) { ex = exception_new ("could not seek to %lld: %s", offset, g_strerror (errno)); throw (ex); } if (check_streams_match (whole, cat, "stream.part*", TRUE) == -1) { ex = exception_new ("streams did not match"); g_object_unref (cat); throw (ex); } }
static off_t pkcs7_stream_seek (void *stream, off_t offset, int whence) { switch (whence) { case SEEK_SET: return (off_t) g_mime_stream_seek ((GMimeStream *) stream, (gint64) offset, GMIME_STREAM_SEEK_SET); case SEEK_CUR: return (off_t) g_mime_stream_seek ((GMimeStream *) stream, (gint64) offset, GMIME_STREAM_SEEK_CUR); case SEEK_END: return (off_t) g_mime_stream_seek ((GMimeStream *) stream, (gint64) offset, GMIME_STREAM_SEEK_END); default: return -1; } }
static gint64 stream_length (GMimeStream *stream) { gint64 position = stream->position; gint64 bound_end; if (stream->bound_end != -1) return stream->bound_end - stream->bound_start; bound_end = g_mime_stream_seek (stream, 0, GMIME_STREAM_SEEK_END); g_mime_stream_seek (stream, position, GMIME_STREAM_SEEK_SET); if (bound_end < stream->bound_start) return -1; return bound_end - stream->bound_start; }