annotate lib/findprog.c @ 17363:5a51fb7777a9

sys_select, sys_time: port 2013-01-30 Solaris 2.6 fix to Cygwin Problem reported by Marco Atzeri in <http://lists.gnu.org/archive/html/bug-gnulib/2013-03/msg00000.html>. * lib/sys_select.in.h [HAVE_SYS_SELECT_H && _CYGWIN_SYS_TIME_H]: Simply delegate to the system <sys/select.h> in this case too. Also, pay attention to _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TIME_H only if OSF/1, since otherwise Cygwin breaks, and it doesn't seem to be needed on Solaris either. * lib/sys_time.in.h [_CYGWIN_SYS_TIME_H]: Simply delgate to the system <sys/time.h> in this case.
author Paul Eggert <eggert@cs.ucla.edu>
date Tue, 19 Mar 2013 09:08:47 -0700
parents e542fd46ad6f
children 344018b6e5d7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4294
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1 /* Locating a program in PATH.
17249
e542fd46ad6f maint: update all copyright year number ranges
Eric Blake <eblake@redhat.com>
parents: 16214
diff changeset
2 Copyright (C) 2001-2004, 2006-2013 Free Software Foundation, Inc.
4294
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
3 Written by Bruno Haible <haible@clisp.cons.org>, 2001.
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
4
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 8251
diff changeset
5 This program is free software: you can redistribute it and/or modify
4294
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
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: 8251
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: 8251
diff changeset
8 (at your option) any later version.
4294
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
9
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
10 This program is distributed in the hope that it will be useful,
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
13 GNU General Public License for more details.
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
14
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
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: 8251
diff changeset
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
4294
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
17
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
18
7304
1c4ed7637c24 Include <config.h> unconditionally.
Bruno Haible <bruno@clisp.org>
parents: 6751
diff changeset
19 #include <config.h>
4294
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
20
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
21 /* Specification. */
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
22 #include "findprog.h"
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
23
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
24 #include <stdbool.h>
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
25 #include <stdlib.h>
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
26 #include <string.h>
6751
1b0092424a44 Include <unistd.h> unconditionally.
Bruno Haible <bruno@clisp.org>
parents: 6259
diff changeset
27 #include <unistd.h>
4294
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
28
10392
dd1c6e77ee94 New module 'findprog-lgpl'.
Bruno Haible <bruno@clisp.org>
parents: 10391
diff changeset
29 /* Avoid collision between findprog.c and findprog-lgpl.c. */
dd1c6e77ee94 New module 'findprog-lgpl'.
Bruno Haible <bruno@clisp.org>
parents: 10391
diff changeset
30 #if IN_FINDPROG_LGPL || ! GNULIB_FINDPROG_LGPL
dd1c6e77ee94 New module 'findprog-lgpl'.
Bruno Haible <bruno@clisp.org>
parents: 10391
diff changeset
31
dd1c6e77ee94 New module 'findprog-lgpl'.
Bruno Haible <bruno@clisp.org>
parents: 10391
diff changeset
32 #if !IN_FINDPROG_LGPL
dd1c6e77ee94 New module 'findprog-lgpl'.
Bruno Haible <bruno@clisp.org>
parents: 10391
diff changeset
33 # include "xalloc.h"
dd1c6e77ee94 New module 'findprog-lgpl'.
Bruno Haible <bruno@clisp.org>
parents: 10391
diff changeset
34 #endif
10391
f0a681493fa6 New module 'xconcat-filename', split off from module 'concat-filename'.
Bruno Haible <bruno@clisp.org>
parents: 9309
diff changeset
35 #include "concat-filename.h"
4294
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
36
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
37
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
38 const char *
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
39 find_in_path (const char *progname)
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
40 {
5053
eebff8c51a9b Treat Cygwin like Windows regarding pathname syntax.
Bruno Haible <bruno@clisp.org>
parents: 4294
diff changeset
41 #if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
16214
ec738d6aeef5 Talk about "native Windows API", not "Win32".
Bruno Haible <bruno@clisp.org>
parents: 16201
diff changeset
42 /* Native Windows, Cygwin, OS/2, DOS */
4294
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
43 /* The searching rules with .COM, .EXE, .BAT, .CMD etc. suffixes are
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
44 too complicated. Leave it to the OS. */
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
45 return progname;
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
46 #else
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
47 /* Unix */
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
48 char *path;
7527
c15258519e7c Avoid a gcc warning.
Bruno Haible <bruno@clisp.org>
parents: 7304
diff changeset
49 char *path_rest;
4294
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
50 char *cp;
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
51
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
52 if (strchr (progname, '/') != NULL)
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
53 /* If progname contains a slash, it is either absolute or relative to
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
54 the current directory. PATH is not used. */
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
55 return progname;
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
56
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
57 path = getenv ("PATH");
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
58 if (path == NULL || *path == '\0')
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
59 /* If PATH is not set, the default search path is implementation
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
60 dependent. */
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
61 return progname;
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
62
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
63 /* Make a copy, to prepare for destructive modifications. */
10392
dd1c6e77ee94 New module 'findprog-lgpl'.
Bruno Haible <bruno@clisp.org>
parents: 10391
diff changeset
64 # if !IN_FINDPROG_LGPL
4294
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
65 path = xstrdup (path);
10392
dd1c6e77ee94 New module 'findprog-lgpl'.
Bruno Haible <bruno@clisp.org>
parents: 10391
diff changeset
66 # else
dd1c6e77ee94 New module 'findprog-lgpl'.
Bruno Haible <bruno@clisp.org>
parents: 10391
diff changeset
67 path = strdup (path);
dd1c6e77ee94 New module 'findprog-lgpl'.
Bruno Haible <bruno@clisp.org>
parents: 10391
diff changeset
68 if (path == NULL)
dd1c6e77ee94 New module 'findprog-lgpl'.
Bruno Haible <bruno@clisp.org>
parents: 10391
diff changeset
69 /* Out of memory. */
dd1c6e77ee94 New module 'findprog-lgpl'.
Bruno Haible <bruno@clisp.org>
parents: 10391
diff changeset
70 return progname;
dd1c6e77ee94 New module 'findprog-lgpl'.
Bruno Haible <bruno@clisp.org>
parents: 10391
diff changeset
71 # endif
7527
c15258519e7c Avoid a gcc warning.
Bruno Haible <bruno@clisp.org>
parents: 7304
diff changeset
72 for (path_rest = path; ; path_rest = cp + 1)
4294
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
73 {
7527
c15258519e7c Avoid a gcc warning.
Bruno Haible <bruno@clisp.org>
parents: 7304
diff changeset
74 const char *dir;
4294
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
75 bool last;
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
76 char *progpathname;
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
77
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
78 /* Extract next directory in PATH. */
7527
c15258519e7c Avoid a gcc warning.
Bruno Haible <bruno@clisp.org>
parents: 7304
diff changeset
79 dir = path_rest;
c15258519e7c Avoid a gcc warning.
Bruno Haible <bruno@clisp.org>
parents: 7304
diff changeset
80 for (cp = path_rest; *cp != '\0' && *cp != ':'; cp++)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
81 ;
4294
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
82 last = (*cp == '\0');
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
83 *cp = '\0';
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
84
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
85 /* Empty PATH components designate the current directory. */
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
86 if (dir == cp)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
87 dir = ".";
4294
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
88
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
89 /* Concatenate dir and progname. */
10392
dd1c6e77ee94 New module 'findprog-lgpl'.
Bruno Haible <bruno@clisp.org>
parents: 10391
diff changeset
90 # if !IN_FINDPROG_LGPL
10391
f0a681493fa6 New module 'xconcat-filename', split off from module 'concat-filename'.
Bruno Haible <bruno@clisp.org>
parents: 9309
diff changeset
91 progpathname = xconcatenated_filename (dir, progname, NULL);
10392
dd1c6e77ee94 New module 'findprog-lgpl'.
Bruno Haible <bruno@clisp.org>
parents: 10391
diff changeset
92 # else
dd1c6e77ee94 New module 'findprog-lgpl'.
Bruno Haible <bruno@clisp.org>
parents: 10391
diff changeset
93 progpathname = concatenated_filename (dir, progname, NULL);
dd1c6e77ee94 New module 'findprog-lgpl'.
Bruno Haible <bruno@clisp.org>
parents: 10391
diff changeset
94 if (progpathname == NULL)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
95 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
96 /* Out of memory. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
97 free (path);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
98 return progname;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
99 }
10392
dd1c6e77ee94 New module 'findprog-lgpl'.
Bruno Haible <bruno@clisp.org>
parents: 10391
diff changeset
100 # endif
4294
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
101
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
102 /* On systems which have the eaccess() system call, let's use it.
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
103 On other systems, let's hope that this program is not installed
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
104 setuid or setgid, so that it is ok to call access() despite its
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
105 design flaw. */
4294
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
106 if (eaccess (progpathname, X_OK) == 0)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
107 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
108 /* Found! */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
109 if (strcmp (progpathname, progname) == 0)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
110 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
111 free (progpathname);
4294
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
112
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
113 /* Add the "./" prefix for real, that xconcatenated_filename()
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
114 optimized away. This avoids a second PATH search when the
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
115 caller uses execlp/execvp. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
116 progpathname = XNMALLOC (2 + strlen (progname) + 1, char);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
117 progpathname[0] = '.';
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
118 progpathname[1] = '/';
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
119 memcpy (progpathname + 2, progname, strlen (progname) + 1);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
120 }
4294
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
121
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
122 free (path);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
123 return progpathname;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
124 }
4294
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
125
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
126 free (progpathname);
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
127
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
128 if (last)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10392
diff changeset
129 break;
4294
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
130 }
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
131
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
132 /* Not found in PATH. An error will be signalled at the first call. */
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
133 free (path);
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
134 return progname;
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
135 #endif
f292c9f75051 New module 'findprog'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
136 }
10392
dd1c6e77ee94 New module 'findprog-lgpl'.
Bruno Haible <bruno@clisp.org>
parents: 10391
diff changeset
137
dd1c6e77ee94 New module 'findprog-lgpl'.
Bruno Haible <bruno@clisp.org>
parents: 10391
diff changeset
138 #endif