annotate lib/savewd.c @ 17463:203c036eb0c6

bootstrap: support checksum utils without a --status option * build-aux/bootstrap: Only look for sha1sum if updating po files. Add sha1 to the list of supported checksum utils since it's now supported through adjustments below. (update_po_files): Remove the use of --status in a way that will suppress all error messages, but since this is only used to minimize updates, it shouldn't cause an issue. Exit early if there is a problem updating the po file checksums. (find_tool): Remove the check for --version support as this is optional as per commit 86186b17. Don't even check for the presence of the command as if that is needed, it's supported through configuring prerequisites in bootstrap.conf. Prompt that when a tool isn't found, one can define an environment variable to add to the hardcoded search list.
author Pádraig Brady <P@draigBrady.com>
date Thu, 08 Aug 2013 11:08:49 +0100
parents e542fd46ad6f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
1 /* Save and restore the working directory, possibly using a child process.
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
2
17249
e542fd46ad6f maint: update all copyright year number ranges
Eric Blake <eblake@redhat.com>
parents: 17181
diff changeset
3 Copyright (C) 2006-2007, 2009-2013 Free Software Foundation, Inc.
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
4
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 9216
diff changeset
5 This program is free software: you can redistribute it and/or modify
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
6 it under the terms of the GNU General Public License as published by
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 9216
diff changeset
7 the Free Software Foundation; either version 3 of the License, or
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 9216
diff changeset
8 (at your option) any later version.
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
9
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
10 This program is distributed in the hope that it will be useful,
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
13 GNU General Public License for more details.
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
14
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 9216
diff changeset
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
17
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
18 /* Written by Paul Eggert. */
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
19
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
20 #include <config.h>
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
21
17181
a80e4b259d9b chdir-long, cycle-check, savewd: better 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents: 16201
diff changeset
22 #define SAVEWD_INLINE _GL_EXTERN_INLINE
a80e4b259d9b chdir-long, cycle-check, savewd: better 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents: 16201
diff changeset
23
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
24 #include "savewd.h"
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
25
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
26 #include <assert.h>
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
27 #include <errno.h>
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
28 #include <fcntl.h>
7375
4a6efdc58ddb [ChangeLog]
Paul Eggert <eggert@cs.ucla.edu>
parents: 7317
diff changeset
29 #include <signal.h>
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
30 #include <stdbool.h>
8196
5166dec344af exit.h is replaced with stdlib.h.
Bruno Haible <bruno@clisp.org>
parents: 7408
diff changeset
31 #include <stdlib.h>
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
32 #include <sys/types.h>
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
33 #include <sys/wait.h>
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
34 #include <unistd.h>
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
35
14393
9f47f8c334f2 dirname: move m4/dos.m4 functionality into lib/dosname.h
Paul Eggert <eggert@cs.ucla.edu>
parents: 14079
diff changeset
36 #include "dosname.h"
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
37 #include "fcntl-safer.h"
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
38
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
39 /* Save the working directory into *WD, if it hasn't been saved
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
40 already. Return true if a child has been forked to do the real
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
41 work. */
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
42 static bool
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
43 savewd_save (struct savewd *wd)
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
44 {
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
45 switch (wd->state)
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
46 {
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
47 case INITIAL_STATE:
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
48 /* Save the working directory, or prepare to fall back if possible. */
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
49 {
13616
acc972b5da60 fcntl-h, etc.: prefer O_SEARCH to O_RDONLY when applicable
Paul Eggert <eggert@cs.ucla.edu>
parents: 12559
diff changeset
50 int fd = open_safer (".", O_SEARCH);
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
51 if (0 <= fd)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
52 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
53 wd->state = FD_STATE;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
54 wd->val.fd = fd;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
55 break;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
56 }
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
57 if (errno != EACCES && errno != ESTALE)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
58 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
59 wd->state = ERROR_STATE;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
60 wd->val.errnum = errno;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
61 break;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
62 }
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
63 }
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
64 wd->state = FORKING_STATE;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
65 wd->val.child = -1;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
66 /* Fall through. */
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
67 case FORKING_STATE:
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
68 if (wd->val.child < 0)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
69 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
70 /* "Save" the initial working directory by forking a new
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
71 subprocess that will attempt all the work from the chdir
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
72 until until the next savewd_restore. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
73 wd->val.child = fork ();
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
74 if (wd->val.child != 0)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
75 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
76 if (0 < wd->val.child)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
77 return true;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
78 wd->state = ERROR_STATE;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
79 wd->val.errnum = errno;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
80 }
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
81 }
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
82 break;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
83
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
84 case FD_STATE:
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
85 case FD_POST_CHDIR_STATE:
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
86 case ERROR_STATE:
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
87 case FINAL_STATE:
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
88 break;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
89
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
90 default:
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
91 assert (false);
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
92 }
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
93
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
94 return false;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
95 }
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
96
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
97 int
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
98 savewd_chdir (struct savewd *wd, char const *dir, int options,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
99 int open_result[2])
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
100 {
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
101 int fd = -1;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
102 int result = 0;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
103
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
104 /* Open the directory if requested, or if avoiding a race condition
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
105 is requested and possible. */
7408
e23b1333a117 [lib/ChangeLog]
Paul Eggert <eggert@cs.ucla.edu>
parents: 7375
diff changeset
106 if (open_result
e23b1333a117 [lib/ChangeLog]
Paul Eggert <eggert@cs.ucla.edu>
parents: 7375
diff changeset
107 || (options & (HAVE_WORKING_O_NOFOLLOW ? SAVEWD_CHDIR_NOFOLLOW : 0)))
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
108 {
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
109 fd = open (dir,
13616
acc972b5da60 fcntl-h, etc.: prefer O_SEARCH to O_RDONLY when applicable
Paul Eggert <eggert@cs.ucla.edu>
parents: 12559
diff changeset
110 (O_SEARCH | O_DIRECTORY | O_NOCTTY | O_NONBLOCK
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
111 | (options & SAVEWD_CHDIR_NOFOLLOW ? O_NOFOLLOW : 0)));
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
112
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
113 if (open_result)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
114 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
115 open_result[0] = fd;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
116 open_result[1] = errno;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
117 }
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
118
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
119 if (fd < 0 && (errno != EACCES || (options & SAVEWD_CHDIR_READABLE)))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
120 result = -1;
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
121 }
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
122
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
123 if (result == 0 && ! (0 <= fd && options & SAVEWD_CHDIR_SKIP_READABLE))
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
124 {
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
125 if (savewd_save (wd))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
126 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
127 open_result = NULL;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
128 result = -2;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
129 }
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
130 else
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
131 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
132 result = (fd < 0 ? chdir (dir) : fchdir (fd));
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
133
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
134 if (result == 0)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
135 switch (wd->state)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
136 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
137 case FD_STATE:
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
138 wd->state = FD_POST_CHDIR_STATE;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
139 break;
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
140
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
141 case ERROR_STATE:
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
142 case FD_POST_CHDIR_STATE:
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
143 case FINAL_STATE:
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
144 break;
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
145
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
146 case FORKING_STATE:
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
147 assert (wd->val.child == 0);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
148 break;
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
149
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
150 default:
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
151 assert (false);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
152 }
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
153 }
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
154 }
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
155
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
156 if (0 <= fd && ! open_result)
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
157 {
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
158 int e = errno;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
159 close (fd);
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
160 errno = e;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
161 }
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
162
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
163 return result;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
164 }
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
165
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
166 int
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
167 savewd_restore (struct savewd *wd, int status)
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
168 {
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
169 switch (wd->state)
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
170 {
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
171 case INITIAL_STATE:
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
172 case FD_STATE:
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
173 /* The working directory is the desired directory, so there's no
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
174 work to do. */
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
175 break;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
176
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
177 case FD_POST_CHDIR_STATE:
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
178 /* Restore the working directory using fchdir. */
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
179 if (fchdir (wd->val.fd) == 0)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
180 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
181 wd->state = FD_STATE;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
182 break;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
183 }
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
184 else
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
185 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
186 int chdir_errno = errno;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
187 close (wd->val.fd);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
188 wd->state = ERROR_STATE;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
189 wd->val.errnum = chdir_errno;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
190 }
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
191 /* Fall through. */
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
192 case ERROR_STATE:
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
193 /* Report an error if asked to restore the working directory. */
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
194 errno = wd->val.errnum;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
195 return -1;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
196
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
197 case FORKING_STATE:
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
198 /* "Restore" the working directory by waiting for the subprocess
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
199 to finish. */
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
200 {
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
201 pid_t child = wd->val.child;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
202 if (child == 0)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
203 _exit (status);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
204 if (0 < child)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
205 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
206 int child_status;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
207 while (waitpid (child, &child_status, 0) < 0)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
208 assert (errno == EINTR);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
209 wd->val.child = -1;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
210 if (! WIFEXITED (child_status))
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
211 raise (WTERMSIG (child_status));
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
212 return WEXITSTATUS (child_status);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
213 }
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
214 }
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
215 break;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
216
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
217 default:
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
218 assert (false);
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
219 }
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
220
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
221 return 0;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
222 }
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
223
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
224 void
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
225 savewd_finish (struct savewd *wd)
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
226 {
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
227 switch (wd->state)
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
228 {
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
229 case INITIAL_STATE:
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
230 case ERROR_STATE:
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
231 break;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
232
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
233 case FD_STATE:
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
234 case FD_POST_CHDIR_STATE:
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
235 close (wd->val.fd);
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
236 break;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
237
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
238 case FORKING_STATE:
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
239 assert (wd->val.child < 0);
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
240 break;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
241
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
242 default:
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
243 assert (false);
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
244 }
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
245
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
246 wd->state = FINAL_STATE;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
247 }
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
248
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
249 /* Return true if the actual work is currently being done by a
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
250 subprocess.
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
251
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
252 A true return means that the caller and the subprocess should
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
253 resynchronize later with savewd_restore, using only their own
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
254 memory to decide when to resynchronize; they should not consult the
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
255 file system to decide, because that might lead to race conditions.
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
256 This is why savewd_chdir is broken out into another function;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
257 savewd_chdir's callers _can_ inspect the file system to decide
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
258 whether to call savewd_chdir. */
17181
a80e4b259d9b chdir-long, cycle-check, savewd: better 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents: 16201
diff changeset
259 static bool
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
260 savewd_delegating (struct savewd const *wd)
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
261 {
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
262 return wd->state == FORKING_STATE && 0 < wd->val.child;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
263 }
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
264
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
265 int
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
266 savewd_process_files (int n_files, char **file,
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
267 int (*act) (char *, struct savewd *, void *),
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
268 void *options)
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
269 {
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
270 int i = 0;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
271 int last_relative;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
272 int exit_status = EXIT_SUCCESS;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
273 struct savewd wd;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
274 savewd_init (&wd);
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
275
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
276 for (last_relative = n_files - 1; 0 <= last_relative; last_relative--)
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
277 if (! IS_ABSOLUTE_FILE_NAME (file[last_relative]))
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
278 break;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
279
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
280 for (; i < last_relative; i++)
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
281 {
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
282 if (! savewd_delegating (&wd))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
283 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
284 int s = act (file[i], &wd, options);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
285 if (exit_status < s)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
286 exit_status = s;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
287 }
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
288
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
289 if (! IS_ABSOLUTE_FILE_NAME (file[i + 1]))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
290 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
291 int r = savewd_restore (&wd, exit_status);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
292 if (exit_status < r)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
293 exit_status = r;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
294 }
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
295 }
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
296
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
297 savewd_finish (&wd);
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
298
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
299 for (; i < n_files; i++)
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
300 {
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
301 int s = act (file[i], &wd, options);
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
302 if (exit_status < s)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 11941
diff changeset
303 exit_status = s;
7315
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
304 }
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
305
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
306 return exit_status;
f3ddfeb5dff9 Initial revision.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
307 }