… | |
… | |
228 | SV *rv = &PL_sv_undef; |
228 | SV *rv = &PL_sv_undef; |
229 | |
229 | |
230 | if (req->result >= 0) |
230 | if (req->result >= 0) |
231 | { |
231 | { |
232 | int i; |
232 | int i; |
233 | char *buf = req->ptr2; |
233 | char *names = (char *)req->ptr2; |
|
|
234 | eio_dirent *ent = (eio_dirent *)req->ptr1; /* might be 0 */ |
234 | AV *av = newAV (); |
235 | AV *av = newAV (); |
235 | |
236 | |
236 | av_extend (av, req->result - 1); |
237 | av_extend (av, req->result - 1); |
237 | |
238 | |
238 | for (i = 0; i < req->result; ++i) |
239 | for (i = 0; i < req->result; ++i) |
239 | { |
240 | { |
240 | if (req->int1 & EIO_READDIR_DENTS) |
241 | if (req->int1 & EIO_READDIR_DENTS) |
241 | { |
242 | { |
242 | eio_dirent *ent = (eio_dirent *)buf; |
|
|
243 | SV *namesv = newSVpvn (ent->name, ent->namelen); |
243 | SV *namesv = newSVpvn (names + ent->nameofs, ent->namelen); |
244 | |
244 | |
245 | if (req->int1 & EIO_READDIR_CUSTOM2) |
245 | if (req->int1 & EIO_READDIR_CUSTOM2) |
246 | { |
246 | { |
247 | static SV *sv_type [EIO_DT_MAX + 1]; /* type sv cache */ |
247 | static SV *sv_type [EIO_DT_MAX + 1]; /* type sv cache */ |
248 | AV *avent = newAV (); |
248 | AV *avent = newAV (); |
… | |
… | |
262 | av_store (av, i, newRV_noinc ((SV *)avent)); |
262 | av_store (av, i, newRV_noinc ((SV *)avent)); |
263 | } |
263 | } |
264 | else |
264 | else |
265 | av_store (av, i, namesv); |
265 | av_store (av, i, namesv); |
266 | |
266 | |
267 | buf += sizeof (eio_dirent); |
267 | ++ent; |
268 | } |
268 | } |
269 | else |
269 | else |
270 | { |
270 | { |
271 | SV *name = newSVpv (buf, 0); |
271 | SV *name = newSVpv (names, 0); |
272 | av_store (av, i, name); |
272 | av_store (av, i, name); |
273 | buf += SvCUR (name) + 1; |
273 | names += SvCUR (name) + 1; |
274 | } |
274 | } |
275 | } |
275 | } |
276 | |
276 | |
277 | rv = sv_2mortal (newRV_noinc ((SV *)av)); |
277 | rv = sv_2mortal (newRV_noinc ((SV *)av)); |
278 | } |
278 | } |