+static cairo_status_t
+write_preview (void *closure,
+ const unsigned char *data,
+ unsigned int length)
+{
+ gint fd = GPOINTER_TO_INT (closure);
+ gssize written;
+
+ while (length > 0)
+ {
+ written = write (fd, data, length);
+
+ if (written == -1)
+ {
+ if (errno == EAGAIN || errno == EINTR)
+ continue;
+
+ return CAIRO_STATUS_WRITE_ERROR;
+ }
+
+ data += written;
+ length -= written;
+ }
+
+ return CAIRO_STATUS_SUCCESS;
+}
+
+static void
+close_preview (void *data)
+{
+ gint fd = GPOINTER_TO_INT (data);
+
+ close (fd);
+}
+