annotate lib/getcwd-lgpl.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 744044c581c4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
17249
e542fd46ad6f maint: update all copyright year number ranges
Eric Blake <eblake@redhat.com>
parents: 16235
diff changeset
1 /* Copyright (C) 2011-2013 Free Software Foundation, Inc.
14629
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
2 This file is part of gnulib.
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
3
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
4 This program is free software: you can redistribute it and/or modify
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
6 the Free Software Foundation; either version 3 of the License, or
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
7 (at your option) any later version.
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
8
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
12 GNU General Public License for more details.
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
13
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
16
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
17 #include <config.h>
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
18
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
19 /* Specification */
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
20 #include <unistd.h>
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
21
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
22 #include <errno.h>
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
23 #include <string.h>
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
24
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
25 #if GNULIB_GETCWD
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
26 /* Favor GPL getcwd.c if both getcwd and getcwd-lgpl modules are in use. */
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
27 typedef int dummy;
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
28 #else
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
29
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
30 /* Get the name of the current working directory, and put it in SIZE
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
31 bytes of BUF. Returns NULL if the directory couldn't be determined
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
32 (perhaps because the absolute name was longer than PATH_MAX, or
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
33 because of missing read/search permissions on parent directories)
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
34 or SIZE was too small. If successful, returns BUF. If BUF is
16235
18a38c9615f0 In commentary, do not use ` to quote.
Paul Eggert <eggert@cs.ucla.edu>
parents: 16201
diff changeset
35 NULL, an array is allocated with 'malloc'; the array is SIZE bytes
14629
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
36 long, unless SIZE == 0, in which case it is as big as
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
37 necessary. */
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
38
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
39 # undef getcwd
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
40 char *
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
41 rpl_getcwd (char *buf, size_t size)
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
42 {
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
43 char *ptr;
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
44 char *result;
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
45
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
46 /* Handle single size operations. */
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
47 if (buf)
14826
a57aca916cfd getcwd: work around mingw bug
Eric Blake <eblake@redhat.com>
parents: 14641
diff changeset
48 {
a57aca916cfd getcwd: work around mingw bug
Eric Blake <eblake@redhat.com>
parents: 14641
diff changeset
49 if (!size)
a57aca916cfd getcwd: work around mingw bug
Eric Blake <eblake@redhat.com>
parents: 14641
diff changeset
50 {
a57aca916cfd getcwd: work around mingw bug
Eric Blake <eblake@redhat.com>
parents: 14641
diff changeset
51 errno = EINVAL;
a57aca916cfd getcwd: work around mingw bug
Eric Blake <eblake@redhat.com>
parents: 14641
diff changeset
52 return NULL;
a57aca916cfd getcwd: work around mingw bug
Eric Blake <eblake@redhat.com>
parents: 14641
diff changeset
53 }
a57aca916cfd getcwd: work around mingw bug
Eric Blake <eblake@redhat.com>
parents: 14641
diff changeset
54 return getcwd (buf, size);
a57aca916cfd getcwd: work around mingw bug
Eric Blake <eblake@redhat.com>
parents: 14641
diff changeset
55 }
14629
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
56
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
57 if (size)
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
58 {
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
59 buf = malloc (size);
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
60 if (!buf)
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
61 {
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
62 errno = ENOMEM;
14641
9a3f3761a941 getcwd: fix mingw bugs
Eric Blake <eblake@redhat.com>
parents: 14629
diff changeset
63 return NULL;
14629
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
64 }
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
65 result = getcwd (buf, size);
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
66 if (!result)
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
67 {
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
68 int saved_errno = errno;
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
69 free (buf);
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
70 errno = saved_errno;
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
71 }
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
72 return result;
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
73 }
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
74
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
75 /* Flexible sizing requested. Avoid over-allocation for the common
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
76 case of a name that fits within a 4k page, minus some space for
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
77 local variables, to be sure we don't skip over a guard page. */
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
78 {
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
79 char tmp[4032];
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
80 size = sizeof tmp;
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
81 ptr = getcwd (tmp, size);
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
82 if (ptr)
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
83 {
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
84 result = strdup (ptr);
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
85 if (!result)
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
86 errno = ENOMEM;
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
87 return result;
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
88 }
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
89 if (errno != ERANGE)
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
90 return NULL;
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
91 }
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
92
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
93 /* My what a large directory name we have. */
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
94 do
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
95 {
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
96 size <<= 1;
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
97 ptr = realloc (buf, size);
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
98 if (ptr == NULL)
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
99 {
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
100 free (buf);
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
101 errno = ENOMEM;
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
102 return NULL;
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
103 }
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
104 buf = ptr;
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
105 result = getcwd (buf, size);
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
106 }
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
107 while (!result && errno == ERANGE);
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
108
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
109 if (!result)
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
110 {
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
111 int saved_errno = errno;
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
112 free (buf);
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
113 errno = saved_errno;
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
114 }
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
115 else
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
116 {
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
117 /* Trim to fit, if possible. */
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
118 result = realloc (buf, strlen (buf) + 1);
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
119 if (!result)
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
120 result = buf;
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
121 }
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
122 return result;
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
123 }
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
124
7a493fbc787a getcwd-lgpl: new module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
125 #endif