Mercurial > gnulib
annotate lib/savedir.c @ 40186:8964917f9574
autoupdate
author | Karl Berry <karl@freefriends.org> |
---|---|
date | Mon, 18 Feb 2019 08:02:49 -0800 |
parents | b06060465f09 |
children |
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 |
40057
b06060465f09
maint: Run 'make update-copyright'
Paul Eggert <eggert@cs.ucla.edu>
parents:
19484
diff
changeset
|
3 Copyright (C) 1990, 1997-2001, 2003-2006, 2009-2019 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 | |
19190 | 17 along with this program. If not, see <https://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 |
17611
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
40 typedef struct |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
41 { |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
42 char *name; |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
43 #if D_INO_IN_DIRENT |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
44 ino_t ino; |
2658
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
45 #endif |
17611
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
46 } direntry_t; |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
47 |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
48 /* Compare the names of two directory entries */ |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
49 |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
50 static int |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
51 direntry_cmp_name (void const *a, void const *b) |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
52 { |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
53 direntry_t const *dea = a; |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
54 direntry_t const *deb = b; |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
55 |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
56 return strcmp (dea->name, deb->name); |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
57 } |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
58 |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
59 #if D_INO_IN_DIRENT |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
60 /* Compare the inode numbers of two directory entries */ |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
61 |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
62 static int |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
63 direntry_cmp_inode (void const *a, void const *b) |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
64 { |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
65 direntry_t const *dea = a; |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
66 direntry_t const *deb = b; |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
67 |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
68 return dea->ino < deb->ino ? -1 : dea->ino > deb->ino; |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
69 } |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
70 #endif |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
71 |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
72 typedef int (*comparison_function) (void const *, void const *); |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
73 |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
74 static comparison_function const comparison_function_table[] = |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
75 { |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
76 0, |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
77 direntry_cmp_name |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
78 #if D_INO_IN_DIRENT |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
79 , direntry_cmp_inode |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
80 #endif |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
81 }; |
5 | 82 |
6458
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
83 /* 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
|
84 in directory DIRP, separated by '\0' characters; |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
85 the end is marked by two '\0' characters in a row. |
17611
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
86 Returned values are sorted according to OPTION. |
13670
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
87 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
|
88 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
|
89 |
13670
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
90 char * |
17611
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
91 streamsavedir (DIR *dirp, enum savedir_option option) |
5 | 92 { |
17611
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
93 char *name_space = NULL; |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
94 size_t allocated = 0; |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
95 direntry_t *entries = NULL; |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
96 size_t entries_allocated = 0; |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
97 size_t entries_used = 0; |
2658
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
98 size_t used = 0; |
17611
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
99 int readdir_errno; |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
100 comparison_function cmp = comparison_function_table[option]; |
5 | 101 |
102 if (dirp == NULL) | |
103 return NULL; | |
104 | |
6437
12eea1649f15
* savedir.c (savedir): Don't assume that xrealloc etc. leave
Paul Eggert <eggert@cs.ucla.edu>
parents:
6259
diff
changeset
|
105 for (;;) |
5 | 106 { |
6437
12eea1649f15
* savedir.c (savedir): Don't assume that xrealloc etc. leave
Paul Eggert <eggert@cs.ucla.edu>
parents:
6259
diff
changeset
|
107 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
|
108 char const *entry; |
12eea1649f15
* savedir.c (savedir): Don't assume that xrealloc etc. leave
Paul Eggert <eggert@cs.ucla.edu>
parents:
6259
diff
changeset
|
109 |
12eea1649f15
* savedir.c (savedir): Don't assume that xrealloc etc. leave
Paul Eggert <eggert@cs.ucla.edu>
parents:
6259
diff
changeset
|
110 errno = 0; |
12eea1649f15
* savedir.c (savedir): Don't assume that xrealloc etc. leave
Paul Eggert <eggert@cs.ucla.edu>
parents:
6259
diff
changeset
|
111 dp = readdir (dirp); |
12eea1649f15
* savedir.c (savedir): Don't assume that xrealloc etc. leave
Paul Eggert <eggert@cs.ucla.edu>
parents:
6259
diff
changeset
|
112 if (! dp) |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
113 break; |
6437
12eea1649f15
* savedir.c (savedir): Don't assume that xrealloc etc. leave
Paul Eggert <eggert@cs.ucla.edu>
parents:
6259
diff
changeset
|
114 |
2658
eea9e16a185f
savedir now sets errno on failure and invokes xmalloc to get memory.
Jim Meyering <jim@meyering.net>
parents:
2342
diff
changeset
|
115 /* Skip "", ".", and "..". "" is returned by at least one buggy |
5159 | 116 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
|
117 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
|
118 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
|
119 { |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
120 size_t entry_size = _D_EXACT_NAMLEN (dp) + 1; |
17611
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
121 if (cmp) |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
122 { |
17611
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
123 if (entries_allocated == entries_used) |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
124 { |
17611
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
125 size_t n = entries_allocated; |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
126 entries = x2nrealloc (entries, &n, sizeof *entries); |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
127 entries_allocated = n; |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
128 } |
17611
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
129 entries[entries_used].name = xstrdup (entry); |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
130 #if D_INO_IN_DIRENT |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
131 entries[entries_used].ino = dp->d_ino; |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
132 #endif |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
133 entries_used++; |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
134 } |
17618
4941d0da6e24
savedir: simplify by using stpcpy
Paul Eggert <eggert@cs.ucla.edu>
parents:
17611
diff
changeset
|
135 else |
4941d0da6e24
savedir: simplify by using stpcpy
Paul Eggert <eggert@cs.ucla.edu>
parents:
17611
diff
changeset
|
136 { |
4941d0da6e24
savedir: simplify by using stpcpy
Paul Eggert <eggert@cs.ucla.edu>
parents:
17611
diff
changeset
|
137 if (allocated - used <= entry_size) |
4941d0da6e24
savedir: simplify by using stpcpy
Paul Eggert <eggert@cs.ucla.edu>
parents:
17611
diff
changeset
|
138 { |
4941d0da6e24
savedir: simplify by using stpcpy
Paul Eggert <eggert@cs.ucla.edu>
parents:
17611
diff
changeset
|
139 size_t n = used + entry_size; |
4941d0da6e24
savedir: simplify by using stpcpy
Paul Eggert <eggert@cs.ucla.edu>
parents:
17611
diff
changeset
|
140 if (n < used) |
4941d0da6e24
savedir: simplify by using stpcpy
Paul Eggert <eggert@cs.ucla.edu>
parents:
17611
diff
changeset
|
141 xalloc_die (); |
4941d0da6e24
savedir: simplify by using stpcpy
Paul Eggert <eggert@cs.ucla.edu>
parents:
17611
diff
changeset
|
142 name_space = x2nrealloc (name_space, &n, 1); |
4941d0da6e24
savedir: simplify by using stpcpy
Paul Eggert <eggert@cs.ucla.edu>
parents:
17611
diff
changeset
|
143 allocated = n; |
4941d0da6e24
savedir: simplify by using stpcpy
Paul Eggert <eggert@cs.ucla.edu>
parents:
17611
diff
changeset
|
144 } |
4941d0da6e24
savedir: simplify by using stpcpy
Paul Eggert <eggert@cs.ucla.edu>
parents:
17611
diff
changeset
|
145 memcpy (name_space + used, entry, entry_size); |
4941d0da6e24
savedir: simplify by using stpcpy
Paul Eggert <eggert@cs.ucla.edu>
parents:
17611
diff
changeset
|
146 } |
4941d0da6e24
savedir: simplify by using stpcpy
Paul Eggert <eggert@cs.ucla.edu>
parents:
17611
diff
changeset
|
147 used += entry_size; |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11938
diff
changeset
|
148 } |
5 | 149 } |
17611
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
150 |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
151 readdir_errno = errno; |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
152 if (readdir_errno != 0) |
5 | 153 { |
17611
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
154 free (entries); |
5 | 155 free (name_space); |
17611
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
156 errno = readdir_errno; |
5 | 157 return NULL; |
158 } | |
6458
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
159 |
17611
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
160 if (cmp) |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
161 { |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
162 size_t i; |
13670
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
163 |
18025
5201cc72e203
savedir: avoid undefined behavior in qsort call
Pádraig Brady <P@draigBrady.com>
parents:
17848
diff
changeset
|
164 if (entries_used) |
5201cc72e203
savedir: avoid undefined behavior in qsort call
Pádraig Brady <P@draigBrady.com>
parents:
17848
diff
changeset
|
165 qsort (entries, entries_used, sizeof *entries, cmp); |
17611
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
166 name_space = xmalloc (used + 1); |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
167 used = 0; |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
168 for (i = 0; i < entries_used; i++) |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
169 { |
17618
4941d0da6e24
savedir: simplify by using stpcpy
Paul Eggert <eggert@cs.ucla.edu>
parents:
17611
diff
changeset
|
170 char *dest = name_space + used; |
4941d0da6e24
savedir: simplify by using stpcpy
Paul Eggert <eggert@cs.ucla.edu>
parents:
17611
diff
changeset
|
171 used += stpcpy (dest, entries[i].name) - dest + 1; |
4941d0da6e24
savedir: simplify by using stpcpy
Paul Eggert <eggert@cs.ucla.edu>
parents:
17611
diff
changeset
|
172 free (entries[i].name); |
17611
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
173 } |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
174 free (entries); |
13670
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
175 } |
17611
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
176 else if (used == allocated) |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
177 name_space = xrealloc (name_space, used + 1); |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
178 |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
179 name_space[used] = '\0'; |
13670
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
180 return name_space; |
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
181 } |
a930c356f503
savedir: add streamsavedir, deprecate fdsavedir
Paul Eggert <eggert@cs.ucla.edu>
parents:
12559
diff
changeset
|
182 |
6458
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
183 /* 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
|
184 in directory DIR, separated by '\0' characters; |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
185 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
|
186 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
|
187 |
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
188 char * |
17611
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
189 savedir (char const *dir, enum savedir_option option) |
6458
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
190 { |
17611
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
191 DIR *dirp = opendir (dir); |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
192 if (! dirp) |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
193 return NULL; |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
194 else |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
195 { |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
196 char *name_space = streamsavedir (dirp, option); |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
197 if (closedir (dirp) != 0) |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
198 { |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
199 int closedir_errno = errno; |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
200 free (name_space); |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
201 errno = closedir_errno; |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
202 return NULL; |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
203 } |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
204 return name_space; |
71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
17576
diff
changeset
|
205 } |
6458
eaa31dc34937
* modules/savedir (Depends-on): Add openat.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6437
diff
changeset
|
206 } |