Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/coreutils/src/gnulib/lib/chdir-long.c |
Switch to Source code | Preprocessed file |
Line | Source | Count | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | - | |||||||||||||
2 | - | |||||||||||||
3 | - | |||||||||||||
4 | - | |||||||||||||
5 | struct cd_buf | - | ||||||||||||
6 | { | - | ||||||||||||
7 | int fd; | - | ||||||||||||
8 | }; | - | ||||||||||||
9 | - | |||||||||||||
10 | static void | - | ||||||||||||
11 | cdb_init (struct cd_buf *cdb) | - | ||||||||||||
12 | { | - | ||||||||||||
13 | cdb->fd = | - | ||||||||||||
14 | -100 | - | ||||||||||||
15 | ; | - | ||||||||||||
16 | } never executed: end of block | 0 | ||||||||||||
17 | - | |||||||||||||
18 | static int | - | ||||||||||||
19 | cdb_fchdir (struct cd_buf const *cdb) | - | ||||||||||||
20 | { | - | ||||||||||||
21 | return never executed: fchdir (cdb->fd);return fchdir (cdb->fd); never executed: return fchdir (cdb->fd); | 0 | ||||||||||||
22 | } | - | ||||||||||||
23 | - | |||||||||||||
24 | static void | - | ||||||||||||
25 | cdb_free (struct cd_buf const *cdb) | - | ||||||||||||
26 | { | - | ||||||||||||
27 | if (0 <= cdb->fd
| 0 | ||||||||||||
28 | { | - | ||||||||||||
29 | - | |||||||||||||
30 | _Bool | - | ||||||||||||
31 | close_fail = close (cdb->fd); | - | ||||||||||||
32 | - | |||||||||||||
33 | (( | - | ||||||||||||
34 | ! close_fail | - | ||||||||||||
35 | ) ? (void) (0) : __assert_fail ( | - | ||||||||||||
36 | "! close_fail" | - | ||||||||||||
37 | , "lib/chdir-long.c", 64, __PRETTY_FUNCTION__)) | - | ||||||||||||
38 | ; | - | ||||||||||||
39 | } never executed: end of block | 0 | ||||||||||||
40 | } never executed: end of block | 0 | ||||||||||||
41 | - | |||||||||||||
42 | - | |||||||||||||
43 | - | |||||||||||||
44 | - | |||||||||||||
45 | - | |||||||||||||
46 | static int | - | ||||||||||||
47 | cdb_advance_fd (struct cd_buf *cdb, char const *dir) | - | ||||||||||||
48 | { | - | ||||||||||||
49 | int new_fd = openat (cdb->fd, dir, | - | ||||||||||||
50 | - | |||||||||||||
51 | 00 | - | ||||||||||||
52 | | | - | ||||||||||||
53 | 0200000 | - | ||||||||||||
54 | | | - | ||||||||||||
55 | 0400 | - | ||||||||||||
56 | | | - | ||||||||||||
57 | 04000 | - | ||||||||||||
58 | ); | - | ||||||||||||
59 | if (new_fd < 0
| 0 | ||||||||||||
60 | return never executed: -1;return -1; never executed: return -1; | 0 | ||||||||||||
61 | - | |||||||||||||
62 | cdb_free (cdb); | - | ||||||||||||
63 | cdb->fd = new_fd; | - | ||||||||||||
64 | - | |||||||||||||
65 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||
66 | } | - | ||||||||||||
67 | - | |||||||||||||
68 | - | |||||||||||||
69 | static char * | - | ||||||||||||
70 | __attribute__ ((__pure__)) | - | ||||||||||||
71 | - | |||||||||||||
72 | find_non_slash (char const *s) | - | ||||||||||||
73 | { | - | ||||||||||||
74 | size_t n_slash = | - | ||||||||||||
75 | __builtin_strspn ( | - | ||||||||||||
76 | s | - | ||||||||||||
77 | , | - | ||||||||||||
78 | "/" | - | ||||||||||||
79 | ) | - | ||||||||||||
80 | ; | - | ||||||||||||
81 | return never executed: (char *) s + n_slash;return (char *) s + n_slash; never executed: return (char *) s + n_slash; | 0 | ||||||||||||
82 | } | - | ||||||||||||
83 | int | - | ||||||||||||
84 | chdir_long (char *dir) | - | ||||||||||||
85 | { | - | ||||||||||||
86 | int e = chdir (dir); | - | ||||||||||||
87 | if (e == 0
| 0 | ||||||||||||
88 | (*
| 0 | ||||||||||||
89 | !=
| 0 | ||||||||||||
90 | 36
| 0 | ||||||||||||
91 | ) | - | ||||||||||||
92 | return never executed: e;return e; never executed: return e; | 0 | ||||||||||||
93 | - | |||||||||||||
94 | { | - | ||||||||||||
95 | size_t len = strlen (dir); | - | ||||||||||||
96 | char *dir_end = dir + len; | - | ||||||||||||
97 | struct cd_buf cdb; | - | ||||||||||||
98 | size_t n_leading_slash; | - | ||||||||||||
99 | - | |||||||||||||
100 | cdb_init (&cdb); | - | ||||||||||||
101 | - | |||||||||||||
102 | - | |||||||||||||
103 | - | |||||||||||||
104 | - | |||||||||||||
105 | (( | - | ||||||||||||
106 | 0 < len | - | ||||||||||||
107 | ) ? (void) (0) : __assert_fail ( | - | ||||||||||||
108 | "0 < len" | - | ||||||||||||
109 | , "lib/chdir-long.c", 126, __PRETTY_FUNCTION__)) | - | ||||||||||||
110 | ; | - | ||||||||||||
111 | - | |||||||||||||
112 | ((4096 | - | ||||||||||||
113 | <= len | - | ||||||||||||
114 | ) ? (void) (0) : __assert_fail ( | - | ||||||||||||
115 | "4096 <= len" | - | ||||||||||||
116 | , "lib/chdir-long.c", 127, __PRETTY_FUNCTION__)) | - | ||||||||||||
117 | ; | - | ||||||||||||
118 | - | |||||||||||||
119 | - | |||||||||||||
120 | n_leading_slash = | - | ||||||||||||
121 | __builtin_strspn ( | - | ||||||||||||
122 | dir | - | ||||||||||||
123 | , | - | ||||||||||||
124 | "/" | - | ||||||||||||
125 | ) | - | ||||||||||||
126 | ; | - | ||||||||||||
127 | - | |||||||||||||
128 | - | |||||||||||||
129 | - | |||||||||||||
130 | - | |||||||||||||
131 | - | |||||||||||||
132 | - | |||||||||||||
133 | if (n_leading_slash == 2
| 0 | ||||||||||||
134 | { | - | ||||||||||||
135 | int err; | - | ||||||||||||
136 | - | |||||||||||||
137 | - | |||||||||||||
138 | char *slash = memchr (dir + 3, '/', dir_end - (dir + 3)); | - | ||||||||||||
139 | if (slash ==
| 0 | ||||||||||||
140 | ((void *)0)
| 0 | ||||||||||||
141 | ) | - | ||||||||||||
142 | { | - | ||||||||||||
143 | - | |||||||||||||
144 | (*__errno_location ()) | - | ||||||||||||
145 | = | - | ||||||||||||
146 | 36 | - | ||||||||||||
147 | ; | - | ||||||||||||
148 | return never executed: -1;return -1; never executed: return -1; | 0 | ||||||||||||
149 | } | - | ||||||||||||
150 | *slash = '\0'; | - | ||||||||||||
151 | err = cdb_advance_fd (&cdb, dir); | - | ||||||||||||
152 | *slash = '/'; | - | ||||||||||||
153 | if (err != 0
| 0 | ||||||||||||
154 | goto never executed: Fail;goto Fail; never executed: goto Fail; | 0 | ||||||||||||
155 | dir = find_non_slash (slash + 1); | - | ||||||||||||
156 | } never executed: end of block | 0 | ||||||||||||
157 | else if (n_leading_slash
| 0 | ||||||||||||
158 | { | - | ||||||||||||
159 | if (cdb_advance_fd (&cdb, "/") != 0
| 0 | ||||||||||||
160 | goto never executed: Fail;goto Fail; never executed: goto Fail; | 0 | ||||||||||||
161 | dir += n_leading_slash; | - | ||||||||||||
162 | } never executed: end of block | 0 | ||||||||||||
163 | - | |||||||||||||
164 | - | |||||||||||||
165 | (( | - | ||||||||||||
166 | *dir != '/' | - | ||||||||||||
167 | ) ? (void) (0) : __assert_fail ( | - | ||||||||||||
168 | "*dir != '/'" | - | ||||||||||||
169 | , "lib/chdir-long.c", 162, __PRETTY_FUNCTION__)) | - | ||||||||||||
170 | ; | - | ||||||||||||
171 | - | |||||||||||||
172 | (( | - | ||||||||||||
173 | dir <= dir_end | - | ||||||||||||
174 | ) ? (void) (0) : __assert_fail ( | - | ||||||||||||
175 | "dir <= dir_end" | - | ||||||||||||
176 | , "lib/chdir-long.c", 163, __PRETTY_FUNCTION__)) | - | ||||||||||||
177 | ; | - | ||||||||||||
178 | - | |||||||||||||
179 | while ( | - | ||||||||||||
180 | 4096
| 0 | ||||||||||||
181 | <= dir_end - dir
| 0 | ||||||||||||
182 | { | - | ||||||||||||
183 | int err; | - | ||||||||||||
184 | - | |||||||||||||
185 | - | |||||||||||||
186 | - | |||||||||||||
187 | char *slash = memrchr (dir, '/', | - | ||||||||||||
188 | 4096 | - | ||||||||||||
189 | ); | - | ||||||||||||
190 | if (slash ==
| 0 | ||||||||||||
191 | ((void *)0)
| 0 | ||||||||||||
192 | ) | - | ||||||||||||
193 | { | - | ||||||||||||
194 | - | |||||||||||||
195 | (*__errno_location ()) | - | ||||||||||||
196 | = | - | ||||||||||||
197 | 36 | - | ||||||||||||
198 | ; | - | ||||||||||||
199 | return never executed: -1;return -1; never executed: return -1; | 0 | ||||||||||||
200 | } | - | ||||||||||||
201 | - | |||||||||||||
202 | *slash = '\0'; | - | ||||||||||||
203 | - | |||||||||||||
204 | (( | - | ||||||||||||
205 | slash - dir < | - | ||||||||||||
206 | 4096) ? (void) (0) : __assert_fail ( | - | ||||||||||||
207 | "slash - dir < 4096" | - | ||||||||||||
208 | , "lib/chdir-long.c", 179, __PRETTY_FUNCTION__)) | - | ||||||||||||
209 | ; | - | ||||||||||||
210 | err = cdb_advance_fd (&cdb, dir); | - | ||||||||||||
211 | *slash = '/'; | - | ||||||||||||
212 | if (err != 0
| 0 | ||||||||||||
213 | goto never executed: Fail;goto Fail; never executed: goto Fail; | 0 | ||||||||||||
214 | - | |||||||||||||
215 | dir = find_non_slash (slash + 1); | - | ||||||||||||
216 | } never executed: end of block | 0 | ||||||||||||
217 | - | |||||||||||||
218 | if (dir < dir_end
| 0 | ||||||||||||
219 | { | - | ||||||||||||
220 | if (cdb_advance_fd (&cdb, dir) != 0
| 0 | ||||||||||||
221 | goto never executed: Fail;goto Fail; never executed: goto Fail; | 0 | ||||||||||||
222 | } never executed: end of block | 0 | ||||||||||||
223 | - | |||||||||||||
224 | if (cdb_fchdir (&cdb) != 0
| 0 | ||||||||||||
225 | goto never executed: Fail;goto Fail; never executed: goto Fail; | 0 | ||||||||||||
226 | - | |||||||||||||
227 | cdb_free (&cdb); | - | ||||||||||||
228 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||
229 | - | |||||||||||||
230 | Fail: | - | ||||||||||||
231 | { | - | ||||||||||||
232 | int saved_errno = | - | ||||||||||||
233 | (*__errno_location ()) | - | ||||||||||||
234 | ; | - | ||||||||||||
235 | cdb_free (&cdb); | - | ||||||||||||
236 | - | |||||||||||||
237 | (*__errno_location ()) | - | ||||||||||||
238 | = saved_errno; | - | ||||||||||||
239 | return never executed: -1;return -1; never executed: return -1; | 0 | ||||||||||||
240 | } | - | ||||||||||||
241 | } | - | ||||||||||||
242 | } | - | ||||||||||||
Switch to Source code | Preprocessed file |