Bladeren bron

[dav] seek boundaries

cgars 7 jaren geleden
bovenliggende
commit
6f789e71b6
1 gewijzigde bestanden met toevoegingen van 23 en 14 verwijderingen
  1. 23 14
      pkg/dav/dav.go

+ 23 - 14
pkg/dav/dav.go

@@ -113,23 +113,32 @@ func (f *GinFile) Read(p []byte) (n int, err error) {
 }
 }
 
 
 func (f *GinFile) Seek(offset int64, whence int) (int64, error) {
 func (f *GinFile) Seek(offset int64, whence int) (int64, error) {
-	//todo: boundaries
+	st, err := f.Stat()
+	if err != nil {
+		return f.seekoset, err
+	}
 	switch whence {
 	switch whence {
-	case 0:
+	case io.SeekStart:
+		if offset > st.Size() || offset < 0 {
+			return 0, fmt.Errorf("Cannot seek to %f, only %f big", offset, st.Size())
+		}
 		f.seekoset = offset
 		f.seekoset = offset
-		return offset, nil
-	case 1:
-		f.seekoset = f.seekoset + offset
-		return offset, nil
-	case 2:
-		fstat, err := f.Stat()
-		if err != nil {
-			return -1, err
+		return f.seekoset, nil
+	case io.SeekCurrent:
+		noffset := f.seekoset + offset
+		if noffset > st.Size() || noffset < 0 {
+			return 0, fmt.Errorf("Cannot seek to %f, only %f big", offset, st.Size())
+		}
+		f.seekoset = noffset
+		return f.seekoset, nil
+	case io.SeekEnd:
+		fsize := st.Size()
+		noffset := fsize - offset
+		if noffset > fsize || noffset < 0 {
+			return 0, fmt.Errorf("Cannot seek to %f, only %f big", offset, st.Size())
 		}
 		}
-		fsize := fstat.Size()
-		change := fsize - offset - f.seekoset
-		f.seekoset = fsize - offset
-		return change, nil
+		f.seekoset = noffset
+		return f.seekoset, nil
 	}
 	}
 	return 0, nil
 	return 0, nil
 }
 }