Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/coreutils/src/gnulib/lib/save-cwd.c |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||
---|---|---|---|---|---|---|---|---|
1 | /* save-cwd.c -- Save and restore current working directory. | - | ||||||
2 | - | |||||||
3 | Copyright (C) 1995, 1997-1998, 2003-2006, 2009-2018 Free Software | - | ||||||
4 | Foundation, Inc. | - | ||||||
5 | - | |||||||
6 | This program is free software: you can redistribute it and/or modify | - | ||||||
7 | it under the terms of the GNU General Public License as published by | - | ||||||
8 | the Free Software Foundation; either version 3 of the License, or | - | ||||||
9 | (at your option) any later version. | - | ||||||
10 | - | |||||||
11 | This program is distributed in the hope that it will be useful, | - | ||||||
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | - | ||||||
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | - | ||||||
14 | GNU General Public License for more details. | - | ||||||
15 | - | |||||||
16 | You should have received a copy of the GNU General Public License | - | ||||||
17 | along with this program. If not, see <https://www.gnu.org/licenses/>. */ | - | ||||||
18 | - | |||||||
19 | /* Written by Jim Meyering. */ | - | ||||||
20 | - | |||||||
21 | #include <config.h> | - | ||||||
22 | - | |||||||
23 | #include "save-cwd.h" | - | ||||||
24 | - | |||||||
25 | #include <errno.h> | - | ||||||
26 | #include <fcntl.h> | - | ||||||
27 | #include <stdbool.h> | - | ||||||
28 | #include <stdio.h> | - | ||||||
29 | #include <stdlib.h> | - | ||||||
30 | - | |||||||
31 | #include "chdir-long.h" | - | ||||||
32 | #include "unistd--.h" | - | ||||||
33 | - | |||||||
34 | #if GNULIB_FCNTL_SAFER | - | ||||||
35 | # include "fcntl--.h" | - | ||||||
36 | #else | - | ||||||
37 | # define GNULIB_FCNTL_SAFER 0 | - | ||||||
38 | #endif | - | ||||||
39 | - | |||||||
40 | /* Record the location of the current working directory in CWD so that | - | ||||||
41 | the program may change to other directories and later use restore_cwd | - | ||||||
42 | to return to the recorded location. This function may allocate | - | ||||||
43 | space using malloc (via getcwd) or leave a file descriptor open; | - | ||||||
44 | use free_cwd to perform the necessary free or close. Upon failure, | - | ||||||
45 | no memory is allocated, any locally opened file descriptors are | - | ||||||
46 | closed; return non-zero -- in that case, free_cwd need not be | - | ||||||
47 | called, but doing so is ok. Otherwise, return zero. | - | ||||||
48 | - | |||||||
49 | The _raison d'etre_ for this interface is that the working directory | - | ||||||
50 | is sometimes inaccessible, and getcwd is not robust or as efficient. | - | ||||||
51 | So, we prefer to use the open/fchdir approach, but fall back on | - | ||||||
52 | getcwd if necessary. This module works for most cases with just | - | ||||||
53 | the getcwd-lgpl module, but to be truly robust, use the getcwd module. | - | ||||||
54 | - | |||||||
55 | Some systems lack fchdir altogether: e.g., OS/2, pre-2001 Cygwin, | - | ||||||
56 | SCO Xenix. Also, SunOS 4 and Irix 5.3 provide the function, yet it | - | ||||||
57 | doesn't work for partitions on which auditing is enabled. If | - | ||||||
58 | you're still using an obsolete system with these problems, please | - | ||||||
59 | send email to the maintainer of this code. */ | - | ||||||
60 | - | |||||||
61 | int | - | ||||||
62 | save_cwd (struct saved_cwd *cwd) | - | ||||||
63 | { | - | ||||||
64 | cwd->name = NULL; | - | ||||||
65 | - | |||||||
66 | cwd->desc = open (".", O_SEARCH | O_CLOEXEC); | - | ||||||
67 | if (!GNULIB_FCNTL_SAFER)
dead code: cwd->desc = fd_safer_flag (cwd->desc, 02000000 ); | - | ||||||
68 | cwd->desc = fd_safer_flag (cwd->desc, O_CLOEXEC); dead code: cwd->desc = fd_safer_flag (cwd->desc, 02000000 ); | - | ||||||
69 | if (cwd->desc < 0)
| 0-6 | ||||||
70 | { | - | ||||||
71 | cwd->name = getcwd (NULL, 0); | - | ||||||
72 | return cwd->name ? 0 : -1; never executed: return cwd->name ? 0 : -1; | 0 | ||||||
73 | } | - | ||||||
74 | - | |||||||
75 | return 0; executed 6 times by 2 tests: return 0; Executed by:
| 6 | ||||||
76 | } | - | ||||||
77 | - | |||||||
78 | /* Change to recorded location, CWD, in directory hierarchy. | - | ||||||
79 | Upon failure, return -1 (errno is set by chdir or fchdir). | - | ||||||
80 | Upon success, return zero. */ | - | ||||||
81 | - | |||||||
82 | int | - | ||||||
83 | restore_cwd (const struct saved_cwd *cwd) | - | ||||||
84 | { | - | ||||||
85 | if (0 <= cwd->desc)
| 0-6 | ||||||
86 | return fchdir (cwd->desc); executed 6 times by 2 tests: return fchdir (cwd->desc); Executed by:
| 6 | ||||||
87 | else | - | ||||||
88 | return chdir_long (cwd->name); never executed: return chdir_long (cwd->name); | 0 | ||||||
89 | } | - | ||||||
90 | - | |||||||
91 | void | - | ||||||
92 | free_cwd (struct saved_cwd *cwd) | - | ||||||
93 | { | - | ||||||
94 | if (cwd->desc >= 0)
| 0-6 | ||||||
95 | close (cwd->desc); executed 6 times by 2 tests: close (cwd->desc); Executed by:
| 6 | ||||||
96 | free (cwd->name); | - | ||||||
97 | } executed 6 times by 2 tests: end of block Executed by:
| 6 | ||||||
Source code | Switch to Preprocessed file |