… | |
… | |
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; |
… | |
… | |
520 | BOOT: |
524 | BOOT: |
521 | { |
525 | { |
522 | stash = gv_stashpv ("IO::AIO", 1); |
526 | stash = gv_stashpv ("IO::AIO", 1); |
523 | |
527 | |
524 | newCONSTSUB (stash, "EXDEV", newSViv (EXDEV)); |
528 | newCONSTSUB (stash, "EXDEV", newSViv (EXDEV)); |
|
|
529 | newCONSTSUB (stash, "ENOSYS", newSViv (ENOSYS)); |
525 | newCONSTSUB (stash, "O_RDONLY", newSViv (O_RDONLY)); |
530 | newCONSTSUB (stash, "O_RDONLY", newSViv (O_RDONLY)); |
526 | newCONSTSUB (stash, "O_WRONLY", newSViv (O_WRONLY)); |
531 | newCONSTSUB (stash, "O_WRONLY", newSViv (O_WRONLY)); |
527 | newCONSTSUB (stash, "O_CREAT", newSViv (O_CREAT)); |
532 | newCONSTSUB (stash, "O_CREAT", newSViv (O_CREAT)); |
528 | newCONSTSUB (stash, "O_TRUNC", newSViv (O_TRUNC)); |
533 | newCONSTSUB (stash, "O_TRUNC", newSViv (O_TRUNC)); |
529 | #ifndef _WIN32 |
534 | #ifndef _WIN32 |
… | |
… | |
667 | aio_write = EIO_WRITE |
672 | aio_write = EIO_WRITE |
668 | PROTOTYPE: $$$$$;$ |
673 | PROTOTYPE: $$$$$;$ |
669 | PPCODE: |
674 | PPCODE: |
670 | { |
675 | { |
671 | STRLEN svlen; |
676 | STRLEN svlen; |
|
|
677 | int fd = extract_fd (fh, ix == EIO_WRITE); |
672 | char *svptr = SvPVbyte (data, svlen); |
678 | char *svptr = SvPVbyte (data, svlen); |
673 | UV len = SvUV (length); |
679 | UV len = SvUV (length); |
674 | int fd; |
|
|
675 | |
|
|
676 | if (SvTYPE (data) > SVt_PVMG) |
|
|
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 | |
680 | |
682 | if (dataoffset < 0) |
681 | if (dataoffset < 0) |
683 | dataoffset += svlen; |
682 | dataoffset += svlen; |
684 | |
683 | |
685 | if (dataoffset < 0 || dataoffset > svlen) |
684 | if (dataoffset < 0 || dataoffset > svlen) |
… | |
… | |
691 | if (!SvOK (length) || len + dataoffset > svlen) |
690 | if (!SvOK (length) || len + dataoffset > svlen) |
692 | len = svlen - dataoffset; |
691 | len = svlen - dataoffset; |
693 | } |
692 | } |
694 | else |
693 | else |
695 | { |
694 | { |
696 | /* read: grow scalar as necessary */ |
695 | /* read: check type and grow scalar as necessary */ |
|
|
696 | SvUPGRADE (data, SVt_PV); |
697 | svptr = SvGROW (data, len + dataoffset + 1); |
697 | svptr = SvGROW (data, len + dataoffset + 1); |
698 | } |
698 | } |
699 | |
|
|
700 | if (len < 0) |
|
|
701 | croak ("length must not be negative"); |
|
|
702 | |
|
|
703 | fd = extract_fd (fh, ix == EIO_WRITE); |
|
|
704 | |
699 | |
705 | { |
700 | { |
706 | dREQ; |
701 | dREQ; |
707 | |
702 | |
708 | req->type = ix; |
703 | req->type = ix; |