aboutsummaryrefslogtreecommitdiff
path: root/stream.c
diff options
context:
space:
mode:
Diffstat (limited to 'stream.c')
-rw-r--r--stream.c65
1 files changed, 57 insertions, 8 deletions
diff --git a/stream.c b/stream.c
index 2055f12..97a1351 100644
--- a/stream.c
+++ b/stream.c
@@ -21,6 +21,23 @@
int batchmode = 0;
+void limitSizeToOffT(size_t *len, mt_off_t maxLen)
+{
+#if SIZEOF_SIZE_T >= SIZEOF_MT_OFF_T
+ if(*len > (size_t) maxLen)
+#else
+ if(*len > maxLen)
+#endif
+ *len = (size_t) maxLen;
+}
+
+void init_head(Stream_t *Stream, struct Class_t *Class, Stream_t *Next)
+{
+ Stream->Class = Class;
+ Stream->refs = 1;
+ Stream->Next = Next;
+}
+
int flush_stream(Stream_t *Stream)
{
int ret=0;
@@ -54,8 +71,7 @@ int free_stream(Stream_t **Stream)
if((*Stream)->Next)
ret |= free_stream(&(*Stream)->Next);
Free(*Stream);
- } else if ( (*Stream)->Next )
- ret |= flush_stream((*Stream)->Next);
+ }
*Stream = NULL;
return ret;
}
@@ -64,24 +80,57 @@ int free_stream(Stream_t **Stream)
#define GET_DATA(stream, date, size, type, address) \
(stream)->Class->get_data( (stream), (date), (size), (type), (address) )
+int set_geom_pass_through(Stream_t *Stream, device_t *dev, device_t *orig_dev)
+{
+ return SET_GEOM(Stream->Next, dev, orig_dev);
+}
-int get_data_pass_through(Stream_t *Stream, time_t *date, mt_size_t *size,
- int *type, int *address)
+int set_geom_noop(Stream_t *Stream UNUSEDP,
+ device_t *dev UNUSEDP,
+ device_t *orig_dev UNUSEDP)
+{
+ return 0;
+}
+
+int get_data_pass_through(Stream_t *Stream, time_t *date, mt_off_t *size,
+ int *type, uint32_t *address)
{
return GET_DATA(Stream->Next, date, size, type, address);
}
-int read_pass_through(Stream_t *Stream, char *buf, mt_off_t start, size_t len)
+ssize_t pread_pass_through(Stream_t *Stream, char *buf,
+ mt_off_t start, size_t len)
{
- return READS(Stream->Next, buf, start, len);
+ return PREADS(Stream->Next, buf, start, len);
}
-int write_pass_through(Stream_t *Stream, char *buf, mt_off_t start, size_t len)
+ssize_t pwrite_pass_through(Stream_t *Stream, char *buf,
+ mt_off_t start, size_t len)
{
- return WRITES(Stream->Next, buf, start, len);
+ return PWRITES(Stream->Next, buf, start, len);
}
doscp_t *get_dosConvert_pass_through(Stream_t *Stream)
{
return GET_DOSCONVERT(Stream->Next);
}
+
+/*
+ * Adjust number of total sectors by given offset in bytes
+ */
+int adjust_tot_sectors(struct device *dev, mt_off_t offset, char *errmsg)
+{
+ if(!dev->tot_sectors)
+ /* tot_sectors not set, do nothing */
+ return 0;
+
+ mt_off_t offs_sectors = offset /
+ (dev->sector_size ? dev->sector_size : 512);
+ if(offs_sectors > 0 && dev->tot_sectors < (smt_off_t) offs_sectors) {
+ if(errmsg)
+ sprintf(errmsg,"init: Offset bigger than base image");
+ return -1;
+ }
+ dev->tot_sectors -= (uint32_t) offs_sectors;
+ return 0;
+}