Lines Matching refs:data
207 ftw_allocate (struct ftw_data *data, size_t newsize) in ftw_allocate() argument
209 void *newp = realloc (data->dirstreams, data->maxdir in ftw_allocate()
214 data->dirstreams = newp; in ftw_allocate()
215 data->dirbufsize = newsize; in ftw_allocate()
216 data->dirbuf = (char *) data->dirstreams in ftw_allocate()
217 + data->maxdir * sizeof (struct dir_data *); in ftw_allocate()
235 static int ftw_dir (struct ftw_data *data, struct STRUCT_STAT *st,
255 add_object (struct ftw_data *data, struct STRUCT_STAT *st) in add_object() argument
262 return __tsearch (newp, &data->known_objects, object_compare) ? 0 : -1; in add_object()
267 find_object (struct ftw_data *data, struct STRUCT_STAT *st) in find_object() argument
272 return __tfind (&obj, &data->known_objects, object_compare) != NULL; in find_object()
278 open_dir_stream (int *dfdp, struct ftw_data *data, struct dir_data *dirp) in open_dir_stream() argument
282 if (data->dirstreams[data->actdir] != NULL) in open_dir_stream()
294 DIR *st = data->dirstreams[data->actdir]->stream; in open_dir_stream()
326 data->dirstreams[data->actdir]->content = realloc (buf, actsize); in open_dir_stream()
327 if (data->dirstreams[data->actdir]->content == NULL) in open_dir_stream()
337 data->dirstreams[data->actdir]->stream = NULL; in open_dir_stream()
338 data->dirstreams[data->actdir]->streamfd = -1; in open_dir_stream()
339 data->dirstreams[data->actdir] = NULL; in open_dir_stream()
347 assert (data->dirstreams[data->actdir] == NULL); in open_dir_stream()
351 int fd = __openat64_nocancel (*dfdp, data->dirbuf + data->ftw.base, in open_dir_stream()
361 if (data->flags & FTW_CHDIR) in open_dir_stream()
363 name = data->dirbuf + data->ftw.base; in open_dir_stream()
368 name = data->dirbuf; in open_dir_stream()
379 data->dirstreams[data->actdir] = dirp; in open_dir_stream()
381 if (++data->actdir == data->maxdir) in open_dir_stream()
382 data->actdir = 0; in open_dir_stream()
391 process_entry (struct ftw_data *data, struct dir_data *dir, const char *name, in process_entry() argument
404 new_buflen = data->ftw.base + namlen + 2; in process_entry()
405 if (data->dirbufsize < new_buflen in process_entry()
406 && !ftw_allocate (data, 2 * new_buflen)) in process_entry()
409 *((char *) __mempcpy (data->dirbuf + data->ftw.base, name, namlen)) = '\0'; in process_entry()
414 (data->flags & FTW_PHYS) ? AT_SYMLINK_NOFOLLOW : 0); in process_entry()
417 if ((data->flags & FTW_CHDIR) == 0) in process_entry()
418 name = data->dirbuf; in process_entry()
420 statres = ((data->flags & FTW_PHYS) in process_entry()
429 else if (data->flags & FTW_PHYS) in process_entry()
460 || !(data->flags & FTW_MOUNT) || st.st_dev == data->dev)) in process_entry()
464 if ((data->flags & FTW_PHYS) in process_entry()
465 || (!find_object (data, &st) in process_entry()
467 && (result = add_object (data, &st)) == 0)) in process_entry()
468 result = ftw_dir (data, &st, dir); in process_entry()
471 result = (*data->func) (data->dirbuf, &st, data->cvt_arr[flag], in process_entry()
472 &data->ftw); in process_entry()
475 if ((data->flags & FTW_ACTIONRETVAL) && result == FTW_SKIP_SUBTREE) in process_entry()
484 ftw_dir (struct ftw_data *data, struct STRUCT_STAT *st, struct dir_data *old_dir) in ftw_dir() argument
488 int previous_base = data->ftw.base; in ftw_dir()
495 data, &dir); in ftw_dir()
500 result = (*data->func) (data->dirbuf, st, FTW_DNR, &data->ftw); in ftw_dir()
506 if (!(data->flags & FTW_DEPTH)) in ftw_dir()
508 result = (*data->func) (data->dirbuf, st, FTW_D, &data->ftw); in ftw_dir()
518 if (data->actdir-- == 0) in ftw_dir()
519 data->actdir = data->maxdir - 1; in ftw_dir()
520 data->dirstreams[data->actdir] = NULL; in ftw_dir()
526 if (data->flags & FTW_CHDIR) in ftw_dir()
536 ++data->ftw.level; in ftw_dir()
537 startp = __rawmemchr (data->dirbuf, '\0'); in ftw_dir()
539 assert (startp != data->dirbuf); in ftw_dir()
542 data->ftw.base = startp - data->dirbuf; in ftw_dir()
550 result = process_entry (data, &dir, d->d_name, NAMLEN (d), d_type); in ftw_dir()
567 if (data->actdir-- == 0) in ftw_dir()
568 data->actdir = data->maxdir - 1; in ftw_dir()
569 data->dirstreams[data->actdir] = NULL; in ftw_dir()
581 result = process_entry (data, &dir, runp, endp - runp, DT_UNKNOWN); in ftw_dir()
591 if ((data->flags & FTW_ACTIONRETVAL) && result == FTW_SKIP_SIBLINGS) in ftw_dir()
595 data->dirbuf[data->ftw.base - 1] = '\0'; in ftw_dir()
596 --data->ftw.level; in ftw_dir()
597 data->ftw.base = previous_base; in ftw_dir()
600 if (result == 0 && (data->flags & FTW_DEPTH)) in ftw_dir()
601 result = (*data->func) (data->dirbuf, st, FTW_DP, &data->ftw); in ftw_dir()
604 && (data->flags & FTW_CHDIR) in ftw_dir()
606 || ((data->flags & FTW_ACTIONRETVAL) in ftw_dir()
617 if (data->ftw.base == 1) in ftw_dir()
637 struct ftw_data data = { .dirstreams = NULL }; in ftw_startup() local
652 data.maxdir = descriptors < 1 ? 1 : descriptors; in ftw_startup()
653 data.actdir = 0; in ftw_startup()
655 if (!ftw_allocate (&data, MAX (2 * strlen (dir), PATH_MAX))) in ftw_startup()
657 memset (data.dirstreams, '\0', data.maxdir * sizeof (struct dir_data *)); in ftw_startup()
658 cp = __stpcpy (data.dirbuf, dir); in ftw_startup()
660 while (cp > data.dirbuf + 1 && cp[-1] == '/') in ftw_startup()
664 data.ftw.level = 0; in ftw_startup()
667 while (cp > data.dirbuf && cp[-1] != '/') in ftw_startup()
669 data.ftw.base = cp - data.dirbuf; in ftw_startup()
671 data.flags = flags; in ftw_startup()
679 data.func = (NFTW_FUNC_T) func; in ftw_startup()
683 data.cvt_arr = is_nftw ? nftw_arr : ftw_arr; in ftw_startup()
686 data.known_objects = NULL; in ftw_startup()
706 else if (data.maxdir > 1) in ftw_startup()
708 --data.maxdir; in ftw_startup()
710 if (data.ftw.base > 0) in ftw_startup()
715 if (data.ftw.base == 1) in ftw_startup()
720 char ch = data.dirbuf[data.ftw.base - 1]; in ftw_startup()
721 data.dirbuf[data.ftw.base - 1] = '\0'; in ftw_startup()
722 result = __chdir (data.dirbuf); in ftw_startup()
723 data.dirbuf[data.ftw.base - 1] = ch; in ftw_startup()
733 if (data.flags & FTW_CHDIR) in ftw_startup()
735 name = data.dirbuf + data.ftw.base; in ftw_startup()
740 name = data.dirbuf; in ftw_startup()
750 result = (*data.func) (data.dirbuf, &st, data.cvt_arr[FTW_SLN], in ftw_startup()
751 &data.ftw); in ftw_startup()
763 data.dev = st.st_dev; in ftw_startup()
767 result = add_object (&data, &st); in ftw_startup()
770 result = ftw_dir (&data, &st, NULL); in ftw_startup()
776 result = (*data.func) (data.dirbuf, &st, data.cvt_arr[flag], in ftw_startup()
777 &data.ftw); in ftw_startup()
805 __tdestroy (data.known_objects, free); in ftw_startup()
806 free (data.dirstreams); in ftw_startup()