… | |
… | |
312 | PL_statcache = *(EIO_STRUCT_STAT *)(req->ptr2); |
312 | PL_statcache = *(EIO_STRUCT_STAT *)(req->ptr2); |
313 | PUSHs (sv_2mortal (newSViv (req->result))); |
313 | PUSHs (sv_2mortal (newSViv (req->result))); |
314 | break; |
314 | break; |
315 | |
315 | |
316 | case EIO_READ: |
316 | case EIO_READ: |
|
|
317 | { |
317 | SvCUR_set (req->sv2, req->stroffset + (req->result > 0 ? req->result : 0)); |
318 | SvCUR_set (req->sv2, req->stroffset + (req->result > 0 ? req->result : 0)); |
318 | *SvEND (req->sv2) = 0; |
319 | *SvEND (req->sv2) = 0; |
|
|
320 | SvPOK_only (req->sv2); |
|
|
321 | SvSETMAGIC (req->sv2); |
319 | PUSHs (sv_2mortal (newSViv (req->result))); |
322 | PUSHs (sv_2mortal (newSViv (req->result))); |
|
|
323 | } |
320 | break; |
324 | break; |
321 | |
325 | |
322 | case EIO_DUP2: |
326 | case EIO_DUP2: |
323 | if (req->result > 0) |
327 | if (req->result > 0) |
324 | req->result = 0; |
328 | req->result = 0; |
… | |
… | |
671 | STRLEN svlen; |
675 | STRLEN svlen; |
672 | int fd = extract_fd (fh, ix == EIO_WRITE); |
676 | int fd = extract_fd (fh, ix == EIO_WRITE); |
673 | char *svptr = SvPVbyte (data, svlen); |
677 | char *svptr = SvPVbyte (data, svlen); |
674 | UV len = SvUV (length); |
678 | UV len = SvUV (length); |
675 | |
679 | |
676 | if (SvTYPE (data) > SVt_PVMG || SvROK (data)) |
|
|
677 | croak ("illegal data argument '%s', must be plain scalar string", SvPV_nolen (data)); |
|
|
678 | |
|
|
679 | SvUPGRADE (data, SVt_PV); |
|
|
680 | SvPOK_only (data); |
|
|
681 | |
|
|
682 | if (dataoffset < 0) |
680 | if (dataoffset < 0) |
683 | dataoffset += svlen; |
681 | dataoffset += svlen; |
684 | |
682 | |
685 | if (dataoffset < 0 || dataoffset > svlen) |
683 | if (dataoffset < 0 || dataoffset > svlen) |
686 | croak ("dataoffset outside of data scalar"); |
684 | croak ("dataoffset outside of data scalar"); |
… | |
… | |
691 | if (!SvOK (length) || len + dataoffset > svlen) |
689 | if (!SvOK (length) || len + dataoffset > svlen) |
692 | len = svlen - dataoffset; |
690 | len = svlen - dataoffset; |
693 | } |
691 | } |
694 | else |
692 | else |
695 | { |
693 | { |
696 | /* read: grow scalar as necessary */ |
694 | /* read: check type and grow scalar as necessary */ |
|
|
695 | SvUPGRADE (data, SVt_PV); |
697 | svptr = SvGROW (data, len + dataoffset + 1); |
696 | svptr = SvGROW (data, len + dataoffset + 1); |
698 | } |
697 | } |
699 | |
698 | |
700 | if (len < 0) |
699 | if (len < 0) |
701 | croak ("length must not be negative"); |
700 | croak ("length must not be negative"); |