Index: uspace/lib/riff/src/chunk.c
===================================================================
--- uspace/lib/riff/src/chunk.c	(revision aaf962e6b6b4ce31f98624e6c289f5d564a6aa86)
+++ uspace/lib/riff/src/chunk.c	(revision efca2e48da9fdf40325200492096839a3eab0673)
@@ -393,4 +393,44 @@
 }
 
+/** Seek to position in chunk.
+ *
+ * @param rchunk RIFF chunk
+ * @param offset Offset
+ * @param whence SEEK_SET, SEEK_CUR or SEEK_END
+ * @return EOK on success or an error code
+ */
+errno_t riff_rchunk_seek(riff_rchunk_t *rchunk, long offset, int whence)
+{
+	long pos;
+	long dest;
+	int rv;
+
+	switch (whence) {
+	case SEEK_SET:
+		dest = rchunk->ckstart + offset;
+		break;
+	case SEEK_END:
+		dest = rchunk->ckstart + rchunk->cksize + offset;
+		break;
+	case SEEK_CUR:
+		pos = ftell(rchunk->riffr->f);
+		if (pos < 0)
+			return EIO;
+		dest = pos + offset;
+		break;
+	default:
+		return EINVAL;
+	}
+
+	if (dest < rchunk->ckstart || dest > rchunk->ckstart + rchunk->cksize)
+		return ELIMIT;
+
+	rv = fseek(rchunk->riffr->f, dest, SEEK_SET);
+	if (rv < 0)
+		return EIO;
+
+	return EOK;
+}
+
 /** Return chunk data size.
  *
@@ -431,5 +471,6 @@
 /** Finish reading RIFF chunk.
  *
- * Seek to the first byte after end of chunk.
+ * Seek to the first byte after end of chunk. It is allowed, though,
+ * to return to the chunk later, e.g. using riff_rchunk_seek(@a rchunk, ..).
  *
  * @param rchunk Chunk structure
@@ -444,5 +485,4 @@
 		return EIO;
 
-	rchunk->riffr = NULL;
 	return EOK;
 }
