Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
GNU CVS
Manage
Activity
Members
Code
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Model registry
Analyze
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
mirabilos
GNU CVS
Commits
6b333da9
Commit
6b333da9
authored
29 years ago
by
meyering
Browse files
Options
Downloads
Patches
Plain Diff
New file.
parent
8b221838
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
lib/save-cwd.c
+133
-0
133 additions, 0 deletions
lib/save-cwd.c
lib/save-cwd.h
+22
-0
22 additions, 0 deletions
lib/save-cwd.h
with
155 additions
and
0 deletions
lib/save-cwd.c
0 → 100644
+
133
−
0
View file @
6b333da9
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include
<stdio.h>
#ifdef STDC_HEADERS
# include <stdlib.h>
#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
#ifdef HAVE_FCNTL_H
# include <fcntl.h>
#else
# include <sys/file.h>
#endif
#include
<errno.h>
# ifndef errno
extern
int
errno
;
#endif
#include
"save-cwd.h"
#include
"error.h"
char
*
xgetwd
__P
((
void
));
/* Record the location of the current working directory in CWD so that
the program may change to other directories and later use restore_cwd
to return to the recorded location. This function may allocate
space using malloc (via xgetwd) or leave a file descriptor open;
use free_cwd to perform the necessary free or close. Upon failure,
no memory is allocated, any locally opened file descriptors are
closed; return non-zero -- in that case, free_cwd need not be
called, but doing so is ok. Otherwise, return zero. */
int
save_cwd
(
cwd
)
struct
saved_cwd
*
cwd
;
{
static
int
have_working_fchdir
=
1
;
cwd
->
desc
=
-
1
;
cwd
->
name
=
NULL
;
if
(
have_working_fchdir
)
{
#ifdef HAVE_FCHDIR
cwd
->
desc
=
open
(
"."
,
O_RDONLY
);
if
(
cwd
->
desc
<
0
)
{
error
(
0
,
errno
,
"cannot open current directory"
);
return
1
;
}
# if __sun__ || sun
/* On SunOS 4, fchdir returns EINVAL if accounting is enabled,
so we have to fall back to chdir. */
if
(
fchdir
(
cwd
->
desc
))
{
if
(
errno
==
EINVAL
)
{
close
(
cwd
->
desc
);
cwd
->
desc
=
-
1
;
have_working_fchdir
=
0
;
}
else
{
error
(
0
,
errno
,
"current directory"
);
close
(
cwd
->
desc
);
cwd
->
desc
=
-
1
;
return
1
;
}
}
# endif
/* __sun__ || sun */
#else
#define fchdir(x) (abort (), 0)
have_working_fchdir
=
0
;
#endif
}
if
(
!
have_working_fchdir
)
{
cwd
->
name
=
xgetwd
();
if
(
cwd
->
name
==
NULL
)
{
error
(
0
,
errno
,
"cannot get current directory"
);
return
1
;
}
}
return
0
;
}
/* Change to recorded location, CWD, in directory hierarchy.
If "saved working directory", NULL))
*/
int
restore_cwd
(
cwd
,
dest
)
const
struct
saved_cwd
*
cwd
;
const
char
*
dest
;
{
int
fail
=
0
;
if
(
cwd
->
desc
>=
0
)
{
if
(
fchdir
(
cwd
->
desc
))
{
error
(
0
,
errno
,
"cannot return to %s"
,
(
dest
?
dest
:
"saved working directory"
));
fail
=
1
;
}
}
else
if
(
chdir
(
cwd
->
name
)
<
0
)
{
error
(
0
,
errno
,
"%s"
,
cwd
->
name
);
fail
=
1
;
}
return
fail
;
}
void
free_cwd
(
cwd
)
struct
saved_cwd
*
cwd
;
{
if
(
cwd
->
desc
>=
0
)
close
(
cwd
->
desc
);
if
(
cwd
->
name
)
free
(
cwd
->
name
);
}
This diff is collapsed.
Click to expand it.
lib/save-cwd.h
0 → 100644
+
22
−
0
View file @
6b333da9
#ifndef SAVE_CWD_H
#define SAVE_CWD_H 1
struct
saved_cwd
{
int
desc
;
char
*
name
;
};
#ifndef __P
#if defined (__GNUC__) || (defined (__STDC__) && __STDC__)
#define __P(args) args
#else
#define __P(args) ()
#endif
/* GCC. */
#endif
/* Not __P. */
int
save_cwd
__P
((
struct
saved_cwd
*
cwd
));
int
restore_cwd
__P
((
const
struct
saved_cwd
*
cwd
,
const
char
*
dest
));
void
free_cwd
__P
((
struct
saved_cwd
*
cwd
));
#endif
/* SAVE_CWD_H */
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment