| 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 |