1 /* dirfd.c -- return the file descriptor associated with an open DIR*
3 Copyright (C) 2001, 2006, 2008-2018 Free Software Foundation, Inc.
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <https://www.gnu.org/licenses/>. */
18 /* Written by Jim Meyering. */
29 static struct dirp_fd_list
33 struct dirp_fd_list
*next
;
34 } *dirp_fd_start
= NULL
;
36 /* Register fd associated with dirp to dirp_fd_list. */
38 _gl_register_dirp_fd (int fd
, DIR *dirp
)
40 struct dirp_fd_list
*new_dirp_fd
= malloc (sizeof *new_dirp_fd
);
44 new_dirp_fd
->dirp
= dirp
;
46 new_dirp_fd
->next
= dirp_fd_start
;
48 dirp_fd_start
= new_dirp_fd
;
53 /* Unregister fd from dirp_fd_list with closing it */
55 _gl_unregister_dirp_fd (int fd
)
57 struct dirp_fd_list
*dirp_fd
;
58 struct dirp_fd_list
*dirp_fd_prev
;
60 for (dirp_fd_prev
= NULL
, dirp_fd
= dirp_fd_start
; dirp_fd
;
61 dirp_fd_prev
= dirp_fd
, dirp_fd
= dirp_fd
->next
)
63 if (dirp_fd
->fd
== fd
)
66 dirp_fd_prev
->next
= dirp_fd
->next
;
67 else /* dirp_fd == dirp_fd_start */
68 dirp_fd_start
= dirp_fd_start
->next
;
81 int fd
= DIR_TO_FD (dir_p
);
87 struct dirp_fd_list
*dirp_fd
;
89 for (dirp_fd
= dirp_fd_start
; dirp_fd
; dirp_fd
= dirp_fd
->next
)
90 if (dirp_fd
->dirp
== dir_p
)