/* Save and restore the working directory, possibly using a subprocess.
- Copyright (C) 2006 Free Software Foundation, Inc.
+ Copyright (C) 2006, 2009-2013 Free Software Foundation, Inc.
- This program is free software; you can redistribute it and/or modify
+ This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* Written by Paul Eggert. */
#include <stdbool.h>
#include <sys/types.h>
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef SAVEWD_INLINE
+# define SAVEWD_INLINE _GL_INLINE
+#endif
+
/* A saved working directory. The member names and constants defined
by this structure are private to the savewd module. */
struct savewd
enum
{
/* This object has been created but does not yet represent
- the working directory. */
+ the working directory. */
INITIAL_STATE,
/* val.fd is the original working directory's file descriptor.
- It is still the working directory. */
+ It is still the working directory. */
FD_STATE,
/* Like FD_STATE, but the working directory has changed, so
- restoring it will require a fchdir. */
+ restoring it will require a fchdir. */
FD_POST_CHDIR_STATE,
/* Fork and let the subprocess do the work. val.child is 0 in a
- child, negative in a childless parent, and the child process
- ID in a parent with a child. */
+ child, negative in a childless parent, and the child process
+ ID in a parent with a child. */
FORKING_STATE,
/* A serious problem argues against further efforts. val.errnum
- contains the error number (e.g., EIO). */
+ contains the error number (e.g., EIO). */
ERROR_STATE,
/* savewd_finish has been called, so the application no longer
- cares whether the working directory is saved, and there is no
- more work to do. */
+ cares whether the working directory is saved, and there is no
+ more work to do. */
FINAL_STATE
} state;
};
/* Initialize a saved working directory object. */
-static inline void
+SAVEWD_INLINE void
savewd_init (struct savewd *wd)
{
wd->state = INITIAL_STATE;
Return -2 if a subprocess was spun off to do the real work, -1
(setting errno) if unsuccessful, 0 if successful. */
int savewd_chdir (struct savewd *wd, char const *dir, int options,
- int open_result[2]);
+ int open_result[2]);
/* Restore the working directory from *WD. STATUS indicates the exit
status corresponding to the work done since the last save; this is
int savewd_restore (struct savewd *wd, int status);
/* Return WD's error number, or 0 if WD is not in an error state. */
-static inline int
+SAVEWD_INLINE int
savewd_errno (struct savewd const *wd)
{
return (wd->state == ERROR_STATE ? wd->val.errnum : 0);
/* Process N_FILES file names, FILE[0] through FILE[N_FILES - 1].
For each file name F, call ACT (F, WD, OPTIONS); ACT should invoke
savewd_chdir as needed, and should return an exit status. WD
- represents thw working directory; it may be in an error state when
+ represents the working directory; it may be in an error state when
ACT is called.
Save and restore the working directory as needed by the file name
Return the maximum exit status that any call to ACT returned, or
EXIT_SUCCESS (i.e., 0) if no calls were made. */
int savewd_process_files (int n_files, char **file,
- int (*act) (char *, struct savewd *, void *),
- void *options);
+ int (*act) (char *, struct savewd *, void *),
+ void *options);
+
+_GL_INLINE_HEADER_END
#endif