OpenCoverage

save-cwd.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/coreutils/src/gnulib/lib/save-cwd.c
Source codeSwitch to Preprocessed file
LineSourceCount
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-
61int-
62save_cwd (struct saved_cwd *cwd)-
63{-
64 cwd->name = NULL;-
65-
66 cwd->desc = open (".", O_SEARCH | O_CLOEXEC);-
67 if (!GNULIB_FCNTL_SAFER)
!1Description
TRUEnever evaluated
FALSEevaluated 6 times by 2 tests
Evaluated by:
  • df
  • stat
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)
cwd->desc < 0Description
TRUEnever evaluated
FALSEevaluated 6 times by 2 tests
Evaluated by:
  • df
  • stat
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:
  • df
  • stat
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-
82int-
83restore_cwd (const struct saved_cwd *cwd)-
84{-
85 if (0 <= cwd->desc)
0 <= cwd->descDescription
TRUEevaluated 6 times by 2 tests
Evaluated by:
  • df
  • stat
FALSEnever evaluated
0-6
86 return fchdir (cwd->desc);
executed 6 times by 2 tests: return fchdir (cwd->desc);
Executed by:
  • df
  • stat
6
87 else-
88 return chdir_long (cwd->name);
never executed: return chdir_long (cwd->name);
0
89}-
90-
91void-
92free_cwd (struct saved_cwd *cwd)-
93{-
94 if (cwd->desc >= 0)
cwd->desc >= 0Description
TRUEevaluated 6 times by 2 tests
Evaluated by:
  • df
  • stat
FALSEnever evaluated
0-6
95 close (cwd->desc);
executed 6 times by 2 tests: close (cwd->desc);
Executed by:
  • df
  • stat
6
96 free (cwd->name);-
97}
executed 6 times by 2 tests: end of block
Executed by:
  • df
  • stat
6
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2