… | |
… | |
1421 | |
1421 | |
1422 | REQ_SEND (req); |
1422 | REQ_SEND (req); |
1423 | } |
1423 | } |
1424 | |
1424 | |
1425 | void |
1425 | void |
1426 | aio_read (SV *fh, SV *offset, UV length, SV8 *data, UV dataoffset, SV *callback=&PL_sv_undef) |
1426 | aio_read (SV *fh, SV *offset, SV *length, SV8 *data, IV dataoffset, SV *callback=&PL_sv_undef) |
1427 | ALIAS: |
1427 | ALIAS: |
1428 | aio_read = REQ_READ |
1428 | aio_read = REQ_READ |
1429 | aio_write = REQ_WRITE |
1429 | aio_write = REQ_WRITE |
1430 | PROTOTYPE: $$$$$;$ |
1430 | PROTOTYPE: $$$$$;$ |
1431 | PPCODE: |
1431 | PPCODE: |
1432 | { |
1432 | { |
1433 | STRLEN svlen; |
1433 | STRLEN svlen; |
1434 | char *svptr = SvPVbyte (data, svlen); |
1434 | char *svptr = SvPVbyte (data, svlen); |
|
|
1435 | UV len = SvUV (length); |
1435 | |
1436 | |
1436 | SvUPGRADE (data, SVt_PV); |
1437 | SvUPGRADE (data, SVt_PV); |
1437 | SvPOK_on (data); |
1438 | SvPOK_on (data); |
1438 | |
1439 | |
1439 | if (dataoffset < 0) |
1440 | if (dataoffset < 0) |
1440 | dataoffset += svlen; |
1441 | dataoffset += svlen; |
1441 | |
1442 | |
1442 | if (dataoffset < 0 || dataoffset > svlen) |
1443 | if (dataoffset < 0 || dataoffset > svlen) |
1443 | croak ("data offset outside of string"); |
1444 | croak ("dataoffset outside of data scalar"); |
1444 | |
1445 | |
1445 | if (ix == REQ_WRITE) |
1446 | if (ix == REQ_WRITE) |
1446 | { |
1447 | { |
1447 | /* write: check length and adjust. */ |
1448 | /* write: check length and adjust. */ |
1448 | if (length < 0 || length + dataoffset > svlen) |
1449 | if (!SvOK (length) || len + dataoffset > svlen) |
1449 | length = svlen - dataoffset; |
1450 | len = svlen - dataoffset; |
1450 | } |
1451 | } |
1451 | else |
1452 | else |
1452 | { |
1453 | { |
1453 | /* read: grow scalar as necessary */ |
1454 | /* read: grow scalar as necessary */ |
1454 | svptr = SvGROW (data, length + dataoffset + 1); |
1455 | svptr = SvGROW (data, len + dataoffset + 1); |
1455 | } |
1456 | } |
1456 | |
1457 | |
1457 | if (length < 0) |
1458 | if (len < 0) |
1458 | croak ("length must not be negative"); |
1459 | croak ("length must not be negative"); |
1459 | |
1460 | |
1460 | { |
1461 | { |
1461 | dREQ; |
1462 | dREQ; |
1462 | |
1463 | |
1463 | req->type = ix; |
1464 | req->type = ix; |
1464 | req->sv1 = newSVsv (fh); |
1465 | req->sv1 = newSVsv (fh); |
1465 | req->int1 = PerlIO_fileno (ix == REQ_READ ? IoIFP (sv_2io (fh)) |
1466 | req->int1 = PerlIO_fileno (ix == REQ_READ ? IoIFP (sv_2io (fh)) |
1466 | : IoOFP (sv_2io (fh))); |
1467 | : IoOFP (sv_2io (fh))); |
1467 | req->offs = SvOK (offset) ? SvVAL64 (offset) : -1; |
1468 | req->offs = SvOK (offset) ? SvVAL64 (offset) : -1; |
1468 | req->size = length; |
1469 | req->size = len; |
1469 | req->sv2 = SvREFCNT_inc (data); |
1470 | req->sv2 = SvREFCNT_inc (data); |
1470 | req->ptr1 = (char *)svptr + dataoffset; |
1471 | req->ptr1 = (char *)svptr + dataoffset; |
1471 | req->stroffset = dataoffset; |
1472 | req->stroffset = dataoffset; |
1472 | |
1473 | |
1473 | if (!SvREADONLY (data)) |
1474 | if (!SvREADONLY (data)) |