Mercurial > hg > octave-kai > gnulib-hg
annotate lib/savedir.c @ 6163:bba2240c9260
* iconvme.h: Add prototype for iconv_alloc.
author | Simon Josefsson <simon@josefsson.org> |
---|---|
date | Tue, 30 Aug 2005 07:38:53 +0000 |
parents | c47674a83a78 |
children | 96c32553b4c6 |
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 |
5907 | 3 Copyright 1990, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005 Free |
5159 | 4 Software Foundation, Inc. |
5 | 5 |
6 This program is free software; you can redistribute it and/or modify | |
7 it under the terms of the GNU General Public License as published by | |
8 the Free Software Foundation; either version 2, or (at your option) | |
9 any later version. | |
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 | |
650
b4ef1c1a0171
update FSF address in copyright
Jim Meyering <jim@meyering.net>
parents:
335
diff
changeset
|
17 along with this program; if not, write to the Free Software Foundation, |
5848
a48fb0e98c8c
*** empty log message ***
Paul Eggert <eggert@cs.ucla.edu>
parents:
5159
diff
changeset
|
18 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ |
5 | 19 |
285 | 20 /* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */ |
21 | |
1278
9ad625a30b7d
Use #if, not #ifdef with HAVE_ macros
Jim Meyering <jim@meyering.net>
parents:
1182
diff
changeset
|
22 #if HAVE_CONFIG_H |
1051
af67c42d555a
(savedir): Declare DIR parameter to be const.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
23 # include <config.h> |
285 | 24 #endif |
5 | 25 |
4665 | 26 #include "savedir.h" |
27 | |
5 | 28 #include <sys/types.h> |
285 | 29 |
2658
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
30 #include <errno.h> |
285 | 31 |
329 | 32 #if HAVE_DIRENT_H |
33 # include <dirent.h> | |
34 #else | |
35 # define dirent direct | |
36 # if HAVE_SYS_NDIR_H | |
37 # include <sys/ndir.h> | |
38 # endif | |
39 # if HAVE_SYS_DIR_H | |
40 # include <sys/dir.h> | |
41 # endif | |
42 # if HAVE_NDIR_H | |
43 # include <ndir.h> | |
44 # endif | |
45 #endif | |
5 | 46 |
314 | 47 #ifdef CLOSEDIR_VOID |
5 | 48 /* Fake a return value. */ |
1051
af67c42d555a
(savedir): Declare DIR parameter to be const.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
49 # define CLOSEDIR(d) (closedir (d), 0) |
5 | 50 #else |
1051
af67c42d555a
(savedir): Declare DIR parameter to be const.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
51 # define CLOSEDIR(d) closedir (d) |
5 | 52 #endif |
53 | |
4333 | 54 #include <stddef.h> |
4665 | 55 #include <stdlib.h> |
56 #include <string.h> | |
5 | 57 |
2658
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
58 #include "xalloc.h" |
1051
af67c42d555a
(savedir): Declare DIR parameter to be const.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
59 |
5907 | 60 /* Return a freshly allocated string containing the file names |
5 | 61 in directory DIR, separated by '\0' characters; |
62 the end is marked by two '\0' characters in a row. | |
2658
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
63 Return NULL (setting errno) if DIR cannot be opened, read, or closed. */ |
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
64 |
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
65 #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
|
66 # 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
|
67 #endif |
5 | 68 |
69 char * | |
3417
31622ae708da
(savedir): Remove size parameter, as POSIX says that
Jim Meyering <jim@meyering.net>
parents:
2658
diff
changeset
|
70 savedir (const char *dir) |
5 | 71 { |
72 DIR *dirp; | |
285 | 73 struct dirent *dp; |
5 | 74 char *name_space; |
3417
31622ae708da
(savedir): Remove size parameter, as POSIX says that
Jim Meyering <jim@meyering.net>
parents:
2658
diff
changeset
|
75 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
|
76 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
|
77 int save_errno; |
5 | 78 |
79 dirp = opendir (dir); | |
80 if (dirp == NULL) | |
81 return NULL; | |
82 | |
2658
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
83 name_space = xmalloc (allocated); |
5 | 84 |
2658
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
85 errno = 0; |
5 | 86 while ((dp = readdir (dirp)) != NULL) |
87 { | |
2658
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
88 /* Skip "", ".", and "..". "" is returned by at least one buggy |
5159 | 89 implementation: Solaris 2.4 readdir on NFS file systems. */ |
2658
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
90 char const *entry = dp->d_name; |
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
91 if (entry[entry[0] != '.' ? 0 : entry[1] != '.' ? 1 : 2] != '\0') |
5 | 92 { |
2658
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
93 size_t entry_size = strlen (entry) + 1; |
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
94 if (used + entry_size < used) |
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
95 xalloc_die (); |
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
96 if (allocated <= used + entry_size) |
5 | 97 { |
2658
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
98 do |
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
99 { |
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
100 if (2 * allocated < allocated) |
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
101 xalloc_die (); |
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
102 allocated *= 2; |
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
103 } |
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
104 while (allocated <= used + entry_size); |
5 | 105 |
2658
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
106 name_space = xrealloc (name_space, allocated); |
5 | 107 } |
2658
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
108 memcpy (name_space + used, entry, entry_size); |
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
109 used += entry_size; |
5 | 110 } |
111 } | |
2658
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
112 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
|
113 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
|
114 if (CLOSEDIR (dirp) != 0) |
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
115 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
|
116 if (save_errno != 0) |
5 | 117 { |
118 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
|
119 errno = save_errno; |
5 | 120 return NULL; |
121 } | |
122 return name_space; | |
123 } |