diff --git a/lib/sp-capture-reader.c b/lib/sp-capture-reader.c index f8f7a1ac..3c845d5f 100644 --- a/lib/sp-capture-reader.c +++ b/lib/sp-capture-reader.c @@ -812,3 +812,38 @@ sp_capture_reader_get_start_time (SpCaptureReader *self) return self->header.time; } + +/** + * sp_capture_reader_copy: + * + * This function makes a copy of the reader. Since readers use + * positioned reads with pread(), this allows you to have multiple + * readers with the shared file descriptor. This uses dup() to create + * another file descriptor. + * + * Returns: (transfer full): A copy of @self with a new file-descriptor. + */ +SpCaptureReader * +sp_capture_reader_copy (SpCaptureReader *self) +{ + SpCaptureReader *copy; + int fd; + + g_return_val_if_fail (self != NULL, NULL); + + if (-1 == (fd = dup (self->fd))) + return NULL; + + copy = g_new0 (SpCaptureReader, 1); + + *copy = *self; + + copy->ref_count = 1; + copy->filename = g_strdup (self->filename); + copy->fd = fd; + + copy->buf = g_malloc (self->bufsz); + memcpy (copy->buf, self->buf, self->bufsz); + + return copy; +} diff --git a/lib/sp-capture-reader.h b/lib/sp-capture-reader.h index f8160f38..bf1d1521 100644 --- a/lib/sp-capture-reader.h +++ b/lib/sp-capture-reader.h @@ -29,6 +29,7 @@ SpCaptureReader *sp_capture_reader_new (const GError **error); SpCaptureReader *sp_capture_reader_new_from_fd (int fd, GError **error); +SpCaptureReader *sp_capture_reader_copy (SpCaptureReader *self); SpCaptureReader *sp_capture_reader_ref (SpCaptureReader *self); void sp_capture_reader_unref (SpCaptureReader *self); const gchar *sp_capture_reader_get_filename (SpCaptureReader *self);