Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes #46 - Wrong file modes for read methods; refactored C fd open code #48

Merged
merged 1 commit into from Aug 31, 2015
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
47 changes: 35 additions & 12 deletions imagick/magick_wand_image.go
Expand Up @@ -14,6 +14,7 @@ import (
"fmt"
"os"
"reflect"
"syscall"
"unsafe"
)

Expand Down Expand Up @@ -1984,9 +1985,10 @@ func (mw *MagickWand) PingImageBlob(blob []byte) error {

// Pings an image or image sequence from an open file descriptor.
func (mw *MagickWand) PingImageFile(img *os.File) error {
cmode := C.CString("w+")
defer C.free(unsafe.Pointer(cmode))
file := C.fdopen(C.int(img.Fd()), cmode)
file, err := cfdopen(img, "rb")
if err != nil {
return err
}
defer C.fclose(file)
C.MagickPingImageFile(mw.mw, file)
return mw.GetLastError()
Expand Down Expand Up @@ -2174,9 +2176,10 @@ func (mw *MagickWand) ReadImageBlob(blob []byte) error {

// Reads an image or image sequence from an open file descriptor.
func (mw *MagickWand) ReadImageFile(img *os.File) error {
cmode := C.CString("w+")
defer C.free(unsafe.Pointer(cmode))
file := C.fdopen(C.int(img.Fd()), cmode)
file, err := cfdopen(img, "rb")
if err != nil {
return err
}
defer C.fclose(file)
C.MagickReadImageFile(mw.mw, file)
return mw.GetLastError()
Expand Down Expand Up @@ -3107,9 +3110,10 @@ func (mw *MagickWand) WriteImage(filename string) error {

// Writes an image to an open file descriptor.
func (mw *MagickWand) WriteImageFile(out *os.File) error {
cmode := C.CString("w+")
defer C.free(unsafe.Pointer(cmode))
file := C.fdopen(C.int(out.Fd()), cmode)
file, err := cfdopen(out, "w")
if err != nil {
return err
}
defer C.fclose(file)
C.MagickWriteImageFile(mw.mw, file)
return mw.GetLastError()
Expand All @@ -3125,10 +3129,29 @@ func (mw *MagickWand) WriteImages(filename string, adjoin bool) error {

// Writes an image sequence to an open file descriptor.
func (mw *MagickWand) WriteImagesFile(out *os.File) error {
cmode := C.CString("w+")
defer C.free(unsafe.Pointer(cmode))
file := C.fdopen(C.int(out.Fd()), cmode)
file, err := cfdopen(out, "w")
if err != nil {
return err
}
defer C.fclose(file)
C.MagickWriteImagesFile(mw.mw, file)
return mw.GetLastError()
}

// cfdopen returns a C-level FILE*. mode should be as described in fdopen(3).
// Caller is responsible for closing the file when successfully returned,
// via C.fclose()
func cfdopen(file *os.File, mode string) (*C.FILE, error) {
cmode := C.CString(mode)
defer C.free(unsafe.Pointer(cmode))

cfile, err := C.fdopen(C.int(file.Fd()), cmode)
if err != nil {
return nil, err
}
if cfile == nil {
return nil, syscall.EINVAL
}

return cfile, nil
}