Mercurial > hg > octave-shane > gnulib-hg
annotate lib/savedir.c @ 15727:144db791c6fa
Ensure EBADF returns for socket functions on mingw.
* lib/accept.c (rpl_accept): Fail with error EBADF if the file
descriptor is invalid.
* lib/bind.c (rpl_bind): Likewise.
* lib/connect.c (rpl_connect): Likewise.
* lib/getpeername.c (rpl_getpeername): Likewise.
* lib/getsockname.c (rpl_getsockname): Likewise.
* lib/getsockopt.c (rpl_getsockopt): Likewise.
* lib/listen.c (rpl_listen): Likewise.
* lib/recv.c (rpl_recv): Likewise.
* lib/recvfrom.c (rpl_recvfrom): Likewise.
* lib/send.c (rpl_send): Likewise.
* lib/sendto.c (rpl_sendto): Likewise.
* lib/setsockopt.c (rpl_setsockopt): Likewise.
* lib/shutdown.c (rpl_shutdown): Likewise.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Wed, 21 Sep 2011 00:20:59 +0200 |
parents | 97fc9a21a8fb |
children | 8250f2777afc |
rev | line source |
---|---|
5 | 1 /* savedir.c -- save the list of files in a directory in a string |
3417
31622ae708da
(savedir): Remove size parameter, as POSIX says that
Jim Meyering <jim@meyering.net>
parents:
2658
diff
changeset
|
2 |
14079
97fc9a21a8fb
maint: update almost all copyright ranges to include 2011
Jim Meyering <meyering@redhat.com>
parents:
13670
diff
changeset
|
3 Copyright (C) 1990, 1997-2001, 2003-2006, 2009-2011 Free Software |
12559
c2cbabec01dd
update nearly all FSF copyright year lists to include 2010
Jim Meyering <meyering@redhat.com>
parents:
12518
diff
changeset
|
4 Foundation, Inc. |
5 | 5 |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
7863
diff
changeset
|
6 This program is free software: you can redistribute it and/or modify |
5 | 7 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:
7863
diff
changeset
|
8 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:
7863
diff
changeset
|
9 (at your option) any later version. |
5 | 10 |
11 This program is distributed in the hope that it will be useful, | |
12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 GNU General Public License for more details. | |
15 | |
16 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:
7863
diff
changeset
|
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
5 | 18 |
285 | 19 /* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */ |
20 | |
7302
8a1a9361108c
* _fpending.c: Include <config.h> unconditionally, since we no
Paul Eggert <eggert@cs.ucla.edu>
parents:
7151
diff
changeset
|
21 #include <config.h> |
5 | 22 |
4665 | 23 #include "savedir.h" |
24 | |
5 | 25 #include <sys/types.h> |
285 | 26 |
2658
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
27 #include <errno.h> |
285 | 28 |
11938
7cbcde229d97
backupfile, chdir-long, fts, savedir: make safer
Eric Blake <ebb9@byu.net>
parents:
11934
diff
changeset
|
29 #include "dirent--.h" |
6949
96af1224c6fa
* backupfile.c, dirfd.h, fts.c, getcwd.c, glob.c, glob_.h:
Paul Eggert <eggert@cs.ucla.edu>
parents:
6934
diff
changeset
|
30 #ifndef _D_EXACT_NAMLEN |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
31 # define _D_EXACT_NAMLEN(dp) strlen ((dp)->d_name) |
329 | 32 #endif |
5 | 33 |
4333 | 34 #include <stddef.h> |
4665 | 35 #include <stdlib.h> |
36 #include <string.h> | |
5 | 37 |
2658
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
38 #include "xalloc.h" |
1051
af67c42d555a
(savedir): Declare DIR parameter to be const.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
39 |
2658
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
40 #ifndef NAME_SIZE_DEFAULT |
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
41 # define NAME_SIZE_DEFAULT 512 |
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
42 #endif |
5 | 43 |
6458
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
44 /* Return a freshly allocated string containing the file names |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
45 in directory DIRP, separated by '\0' characters; |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
46 the end is marked by two '\0' characters in a row. |
13670
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
47 Return NULL (setting errno) if DIRP cannot be read. |
6458
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
48 If DIRP is NULL, return NULL without affecting errno. */ |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
49 |
13670
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
50 char * |
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
51 streamsavedir (DIR *dirp) |
5 | 52 { |
53 char *name_space; | |
3417
31622ae708da
(savedir): Remove size parameter, as POSIX says that
Jim Meyering <jim@meyering.net>
parents:
2658
diff
changeset
|
54 size_t allocated = NAME_SIZE_DEFAULT; |
2658
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
55 size_t used = 0; |
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
56 int save_errno; |
5 | 57 |
58 if (dirp == NULL) | |
59 return NULL; | |
60 | |
2658
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
61 name_space = xmalloc (allocated); |
5 | 62 |
6437
12eea1649f15
* savedir.c (savedir): Don't assume that xrealloc etc. leave
Paul Eggert <eggert@cs.ucla.edu>
parents:
6259
diff
changeset
|
63 for (;;) |
5 | 64 { |
6437
12eea1649f15
* savedir.c (savedir): Don't assume that xrealloc etc. leave
Paul Eggert <eggert@cs.ucla.edu>
parents:
6259
diff
changeset
|
65 struct dirent const *dp; |
12eea1649f15
* savedir.c (savedir): Don't assume that xrealloc etc. leave
Paul Eggert <eggert@cs.ucla.edu>
parents:
6259
diff
changeset
|
66 char const *entry; |
12eea1649f15
* savedir.c (savedir): Don't assume that xrealloc etc. leave
Paul Eggert <eggert@cs.ucla.edu>
parents:
6259
diff
changeset
|
67 |
12eea1649f15
* savedir.c (savedir): Don't assume that xrealloc etc. leave
Paul Eggert <eggert@cs.ucla.edu>
parents:
6259
diff
changeset
|
68 errno = 0; |
12eea1649f15
* savedir.c (savedir): Don't assume that xrealloc etc. leave
Paul Eggert <eggert@cs.ucla.edu>
parents:
6259
diff
changeset
|
69 dp = readdir (dirp); |
12eea1649f15
* savedir.c (savedir): Don't assume that xrealloc etc. leave
Paul Eggert <eggert@cs.ucla.edu>
parents:
6259
diff
changeset
|
70 if (! dp) |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
71 break; |
6437
12eea1649f15
* savedir.c (savedir): Don't assume that xrealloc etc. leave
Paul Eggert <eggert@cs.ucla.edu>
parents:
6259
diff
changeset
|
72 |
2658
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
73 /* Skip "", ".", and "..". "" is returned by at least one buggy |
5159 | 74 implementation: Solaris 2.4 readdir on NFS file systems. */ |
6437
12eea1649f15
* savedir.c (savedir): Don't assume that xrealloc etc. leave
Paul Eggert <eggert@cs.ucla.edu>
parents:
6259
diff
changeset
|
75 entry = dp->d_name; |
2658
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
76 if (entry[entry[0] != '.' ? 0 : entry[1] != '.' ? 1 : 2] != '\0') |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
77 { |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
78 size_t entry_size = _D_EXACT_NAMLEN (dp) + 1; |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
79 if (used + entry_size < used) |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
80 xalloc_die (); |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
81 if (allocated <= used + entry_size) |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
82 { |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
83 do |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
84 { |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
85 if (2 * allocated < allocated) |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
86 xalloc_die (); |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
87 allocated *= 2; |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
88 } |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
89 while (allocated <= used + entry_size); |
5 | 90 |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
91 name_space = xrealloc (name_space, allocated); |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
92 } |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
93 memcpy (name_space + used, entry, entry_size); |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
94 used += entry_size; |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
95 } |
5 | 96 } |
2658
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
97 name_space[used] = '\0'; |
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
98 save_errno = errno; |
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
99 if (save_errno != 0) |
5 | 100 { |
101 free (name_space); | |
2658
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
102 errno = save_errno; |
5 | 103 return NULL; |
104 } | |
105 return name_space; | |
106 } | |
6458
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
107 |
13670
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
108 /* Like savedirstreamp (DIRP), except also close DIRP. */ |
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
109 |
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
110 static char * |
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
111 savedirstream (DIR *dirp) |
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
112 { |
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
113 char *name_space = streamsavedir (dirp); |
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
114 if (dirp && closedir (dirp) != 0) |
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
115 { |
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
116 int save_errno = errno; |
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
117 free (name_space); |
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
118 errno = save_errno; |
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
119 return NULL; |
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
120 } |
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
121 return name_space; |
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
122 } |
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
123 |
6458
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
124 /* Return a freshly allocated string containing the file names |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
125 in directory DIR, separated by '\0' characters; |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
126 the end is marked by two '\0' characters in a row. |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
127 Return NULL (setting errno) if DIR cannot be opened, read, or closed. */ |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
128 |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
129 char * |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
130 savedir (char const *dir) |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
131 { |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
132 return savedirstream (opendir (dir)); |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
133 } |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
134 |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
135 /* Return a freshly allocated string containing the file names |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
136 in directory FD, separated by '\0' characters; |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
137 the end is marked by two '\0' characters in a row. |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
138 Return NULL (setting errno) if FD cannot be read or closed. */ |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
139 |
13670
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
140 /* deprecated */ |
6458
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
141 char * |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
142 fdsavedir (int fd) |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
143 { |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
144 return savedirstream (fdopendir (fd)); |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
145 } |