| 241 | } |
| 242 | |
| 243 | void dir_iterator_free(struct dir_iterator *dir_iterator) |
| 244 | { |
| 245 | struct dir_iterator_int *iter = (struct dir_iterator_int *)dir_iterator; |
| 246 | |
| 247 | if (!iter) |
| 248 | return; |
| 249 | |
| 250 | for (; iter->levels_nr; iter->levels_nr--) { |
| 251 | struct dir_iterator_level *level = |
| 252 | &iter->levels[iter->levels_nr - 1]; |
| 253 | |
| 254 | if (level->dir && closedir(level->dir)) { |
| 255 | int saved_errno = errno; |
| 256 | strbuf_setlen(&iter->base.path, level->prefix_len); |
| 257 | errno = saved_errno; |
| 258 | warning_errno("error closing directory '%s'", |
| 259 | iter->base.path.buf); |
| 260 | } |
| 261 | |
| 262 | string_list_clear(&level->entries, 0); |
| 263 | } |
| 264 | |
| 265 | free(iter->levels); |
| 266 | strbuf_release(&iter->base.path); |
| 267 | free(iter); |
| 268 | } |
| 269 | |
| 270 | struct dir_iterator *dir_iterator_begin(const char *path, unsigned int flags) |
| 271 | { |