--- IO-AIO/AIO.xs 2011/10/01 10:53:47 1.205 +++ IO-AIO/AIO.xs 2012/04/01 17:46:02 1.209 @@ -64,6 +64,9 @@ #undef abort #undef pipe + #define EIO_STRUCT_STAT struct _stati64 + #define EIO_STRUCT_STATI64 + #else #include @@ -72,9 +75,9 @@ #include #include -#endif + #define EIO_STRUCT_STAT Stat_t -#define EIO_STRUCT_STAT Stat_t +#endif /* use NV for 32 bit perls as it allows larger offsets */ #if IVSIZE >= 8 @@ -637,6 +640,10 @@ PUSHs (sv_result); break; + case EIO_SEEK: + PUSHs (req->result ? sv_result : sv_2mortal (newSVval64 (req->offs))); + break; + case EIO_READ: { SvCUR_set (req->sv2, req->stroffset + (req->result > 0 ? req->result : 0)); @@ -866,7 +873,7 @@ } else if (SvTYPE (rv) == SVt_PVMG && SvSTASH (rv) == aio_wd_stash) { - *wd = SvIVX (rv); + *wd = (aio_wd)(long)SvIVX (rv); *wdsv = SvREFCNT_inc_NN (rv); *ptr = "."; return; /* path set to "." */ @@ -1001,6 +1008,10 @@ const_iv (MAP_POPULATE) const_iv (MAP_NONBLOCK) + const_eio (SEEK_SET) + const_eio (SEEK_CUR) + const_eio (SEEK_END) + const_eio (MCL_FUTURE) const_eio (MCL_CURRENT) @@ -1132,7 +1143,7 @@ req->sv1 = newSVsv (fh); req->int1 = fd; - REQ_SEND (req); + REQ_SEND; } void @@ -1149,7 +1160,7 @@ req->size = nbytes; req->int2 = flags; - REQ_SEND (req); + REQ_SEND; } void @@ -1166,7 +1177,7 @@ req->offs = offset; req->size = len; - REQ_SEND (req); + REQ_SEND; } void @@ -1200,7 +1211,24 @@ req->sv2 = newSVsv (fh); req->int2 = fd; - REQ_SEND (req); + REQ_SEND; +} + +void +aio_seek (SV *fh, SV *offset, int whence, SV *callback=&PL_sv_undef) + PPCODE: +{ + STRLEN svlen; + int fd = s_fileno_croak (fh, 0); + dREQ; + + req->type = EIO_SEEK; + req->sv1 = newSVsv (fh); + req->int1 = fd; + req->offs = SvVAL64 (offset); + req->int2 = whence; + + REQ_SEND; } void @@ -1441,8 +1469,8 @@ aio_rename = EIO_RENAME PPCODE: { - dREQ; eio_wd wd2 = 0; + dREQ; req->type = ix; req_set_path1 (req, oldpath);