xref: /freebsd/lib/libc/gen/glob.3 (revision aa1a8ff2d6dbc51ef058f46f3db5a8bb77967145)
1.\" Copyright (c) 1989, 1991, 1993, 1994
2.\"	The Regents of the University of California.  All rights reserved.
3.\"
4.\" This code is derived from software contributed to Berkeley by
5.\" Guido van Rossum.
6.\" Redistribution and use in source and binary forms, with or without
7.\" modification, are permitted provided that the following conditions
8.\" are met:
9.\" 1. Redistributions of source code must retain the above copyright
10.\"    notice, this list of conditions and the following disclaimer.
11.\" 2. Redistributions in binary form must reproduce the above copyright
12.\"    notice, this list of conditions and the following disclaimer in the
13.\"    documentation and/or other materials provided with the distribution.
14.\" 3. Neither the name of the University nor the names of its contributors
15.\"    may be used to endorse or promote products derived from this software
16.\"    without specific prior written permission.
17.\"
18.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
19.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
22.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28.\" SUCH DAMAGE.
29.\"
30.Dd December 20, 2011
31.Dt GLOB 3
32.Os
33.Sh NAME
34.Nm glob ,
35.Nm globfree
36.Nd generate pathnames matching a pattern
37.Sh LIBRARY
38.Lb libc
39.Sh SYNOPSIS
40.In glob.h
41.Ft int
42.Fn glob "const char * restrict pattern" "int flags" "int (*errfunc)(const char *, int)" "glob_t * restrict pglob"
43.Ft void
44.Fn globfree "glob_t *pglob"
45.Sh DESCRIPTION
46The
47.Fn glob
48function
49is a pathname generator that implements the rules for file name pattern
50matching used by the shell.
51.Pp
52The include file
53.In glob.h
54defines the structure type
55.Fa glob_t ,
56which contains at least the following fields:
57.Bd -literal
58typedef struct {
59	size_t gl_pathc;	/* count of total paths so far */
60	size_t gl_matchc;	/* count of paths matching pattern */
61	size_t gl_offs;		/* reserved at beginning of gl_pathv */
62	int gl_flags;		/* returned flags */
63	char **gl_pathv;	/* list of paths matching pattern */
64} glob_t;
65.Ed
66.Pp
67The argument
68.Fa pattern
69is a pointer to a pathname pattern to be expanded.
70The
71.Fn glob
72argument
73matches all accessible pathnames against the pattern and creates
74a list of the pathnames that match.
75In order to have access to a pathname,
76.Fn glob
77requires search permission on every component of a path except the last
78and read permission on each directory of any filename component of
79.Fa pattern
80that contains any of the special characters
81.Ql * ,
82.Ql ?\&
83or
84.Ql \&[ .
85.Pp
86The
87.Fn glob
88argument
89stores the number of matched pathnames into the
90.Fa gl_pathc
91field, and a pointer to a list of pointers to pathnames into the
92.Fa gl_pathv
93field.
94The first pointer after the last pathname is
95.Dv NULL .
96If the pattern does not match any pathnames, the returned number of
97matched paths is set to zero.
98.Pp
99It is the caller's responsibility to create the structure pointed to by
100.Fa pglob .
101The
102.Fn glob
103function allocates other space as needed, including the memory pointed
104to by
105.Fa gl_pathv .
106.Pp
107The argument
108.Fa flags
109is used to modify the behavior of
110.Fn glob .
111The value of
112.Fa flags
113is the bitwise inclusive
114.Tn OR
115of any of the following
116values defined in
117.In glob.h :
118.Bl -tag -width GLOB_ALTDIRFUNC
119.It Dv GLOB_APPEND
120Append pathnames generated to the ones from a previous call (or calls)
121to
122.Fn glob .
123The value of
124.Fa gl_pathc
125will be the total matches found by this call and the previous call(s).
126The pathnames are appended to, not merged with the pathnames returned by
127the previous call(s).
128Between calls, the caller must not change the setting of the
129.Dv GLOB_DOOFFS
130flag, nor change the value of
131.Fa gl_offs
132when
133.Dv GLOB_DOOFFS
134is set, nor (obviously) call
135.Fn globfree
136for
137.Fa pglob .
138.It Dv GLOB_DOOFFS
139Make use of the
140.Fa gl_offs
141field.
142If this flag is set,
143.Fa gl_offs
144is used to specify how many
145.Dv NULL
146pointers to prepend to the beginning
147of the
148.Fa gl_pathv
149field.
150In other words,
151.Fa gl_pathv
152will point to
153.Fa gl_offs
154.Dv NULL
155pointers,
156followed by
157.Fa gl_pathc
158pathname pointers, followed by a
159.Dv NULL
160pointer.
161.It Dv GLOB_ERR
162Causes
163.Fn glob
164to return when it encounters a directory that it cannot open or read.
165Ordinarily,
166.Fn glob
167continues to find matches.
168.It Dv GLOB_MARK
169Each pathname that is a directory that matches
170.Fa pattern
171has a slash
172appended.
173.It Dv GLOB_NOCHECK
174If
175.Fa pattern
176does not match any pathname, then
177.Fn glob
178returns a list
179consisting of only
180.Fa pattern ,
181with the number of total pathnames set to 1, and the number of matched
182pathnames set to 0.
183The effect of backslash escaping is present in the pattern returned.
184.It Dv GLOB_NOESCAPE
185By default, a backslash
186.Pq Ql \e
187character is used to escape the following character in the pattern,
188avoiding any special interpretation of the character.
189If
190.Dv GLOB_NOESCAPE
191is set, backslash escaping is disabled.
192.It Dv GLOB_NOSORT
193By default, the pathnames are sorted in ascending
194collation
195order;
196this flag prevents that sorting (speeding up
197.Fn glob ) .
198.El
199.Pp
200The following values may also be included in
201.Fa flags ,
202however, they are non-standard extensions to
203.St -p1003.2 .
204.Bl -tag -width GLOB_ALTDIRFUNC
205.It Dv GLOB_ALTDIRFUNC
206The following additional fields in the pglob structure have been
207initialized with alternate functions for glob to use to open, read,
208and close directories and to get stat information on names found
209in those directories.
210.Bd -literal
211void *(*gl_opendir)(const char * name);
212struct dirent *(*gl_readdir)(void *);
213void (*gl_closedir)(void *);
214int (*gl_lstat)(const char *name, struct stat *st);
215int (*gl_stat)(const char *name, struct stat *st);
216.Ed
217.Pp
218This extension is provided to allow programs such as
219.Xr restore 8
220to provide globbing from directories stored on tape.
221.It Dv GLOB_BRACE
222Pre-process the pattern string to expand
223.Ql {pat,pat,...}
224strings like
225.Xr csh 1 .
226The pattern
227.Ql {}
228is left unexpanded for historical reasons (and
229.Xr csh 1
230does the same thing to
231ease typing
232of
233.Xr find 1
234patterns).
235.It Dv GLOB_MAGCHAR
236Set by the
237.Fn glob
238function if the pattern included globbing characters.
239See the description of the usage of the
240.Fa gl_matchc
241structure member for more details.
242.It Dv GLOB_NOMAGIC
243Is the same as
244.Dv GLOB_NOCHECK
245but it only appends the
246.Fa pattern
247if it does not contain any of the special characters ``*'', ``?'' or ``[''.
248.Dv GLOB_NOMAGIC
249is provided to simplify implementing the historic
250.Xr csh 1
251globbing behavior and should probably not be used anywhere else.
252.It Dv GLOB_TILDE
253Expand patterns that start with
254.Ql ~
255to user name home directories.
256.It Dv GLOB_LIMIT
257Limit the total number of returned pathnames to the value provided in
258.Fa gl_matchc
259(default
260.Dv ARG_MAX ) .
261This option should be set for programs
262that can be coerced into a denial of service attack
263via patterns that expand to a very large number of matches,
264such as a long string of
265.Ql */../*/.. .
266.El
267.Pp
268If, during the search, a directory is encountered that cannot be opened
269or read and
270.Fa errfunc
271is
272.Pf non- Dv NULL ,
273.Fn glob
274calls
275.Fa \*(lp*errfunc\*(rp Ns ( Fa path , errno ) ,
276however, the
277.Dv GLOB_ERR
278flag will cause an immediate
279return when this happens.
280.Pp
281If
282.Fa errfunc
283returns non-zero,
284.Fn glob
285stops the scan and returns
286.Dv GLOB_ABORTED
287after setting
288.Fa gl_pathc
289and
290.Fa gl_pathv
291to reflect any paths already matched.
292This also happens if an error is encountered and
293.Dv GLOB_ERR
294is set in
295.Fa flags ,
296regardless of the return value of
297.Fa errfunc ,
298if called.
299If
300.Dv GLOB_ERR
301is not set and either
302.Fa errfunc
303is
304.Dv NULL
305or
306.Fa errfunc
307returns zero, the error is ignored.
308.Pp
309The
310.Fn globfree
311function frees any space associated with
312.Fa pglob
313from a previous call(s) to
314.Fn glob .
315.Sh RETURN VALUES
316On successful completion,
317.Fn glob
318returns zero.
319In addition the fields of
320.Fa pglob
321contain the values described below:
322.Bl -tag -width GLOB_NOCHECK
323.It Fa gl_pathc
324contains the total number of matched pathnames so far.
325This includes other matches from previous invocations of
326.Fn glob
327if
328.Dv GLOB_APPEND
329was specified.
330.It Fa gl_matchc
331contains the number of matched pathnames in the current invocation of
332.Fn glob .
333.It Fa gl_flags
334contains a copy of the
335.Fa flags
336argument with the bit
337.Dv GLOB_MAGCHAR
338set if
339.Fa pattern
340contained any of the special characters ``*'', ``?'' or ``['', cleared
341if not.
342.It Fa gl_pathv
343contains a pointer to a
344.Dv NULL Ns -terminated
345list of matched pathnames.
346However, if
347.Fa gl_pathc
348is zero, the contents of
349.Fa gl_pathv
350are undefined.
351.El
352.Pp
353If
354.Fn glob
355terminates due to an error, it sets errno and returns one of the
356following non-zero constants, which are defined in the include
357file
358.In glob.h :
359.Bl -tag -width GLOB_NOCHECK
360.It Dv GLOB_NOSPACE
361An attempt to allocate memory failed, or if
362.Fa errno
363was E2BIG,
364.Dv GLOB_LIMIT
365was specified in the flags and
366.Fa pglob\->gl_matchc
367or more patterns were matched.
368.It Dv GLOB_ABORTED
369The scan was stopped because an error was encountered and either
370.Dv GLOB_ERR
371was set or
372.Fa \*(lp*errfunc\*(rp\*(lp\*(rp
373returned non-zero.
374.It Dv GLOB_NOMATCH
375The pattern did not match a pathname and
376.Dv GLOB_NOCHECK
377was not set.
378.El
379.Pp
380The arguments
381.Fa pglob\->gl_pathc
382and
383.Fa pglob\->gl_pathv
384are still set as specified above.
385.Sh EXAMPLES
386A rough equivalent of
387.Ql "ls -l *.c *.h"
388can be obtained with the
389following code:
390.Bd -literal -offset indent
391glob_t g;
392
393g.gl_offs = 2;
394glob("*.c", GLOB_DOOFFS, NULL, &g);
395glob("*.h", GLOB_DOOFFS | GLOB_APPEND, NULL, &g);
396g.gl_pathv[0] = "ls";
397g.gl_pathv[1] = "-l";
398execvp("ls", g.gl_pathv);
399.Ed
400.Sh SEE ALSO
401.Xr sh 1 ,
402.Xr fnmatch 3 ,
403.Xr regex 3
404.Sh STANDARDS
405The current implementation of the
406.Fn glob
407function
408.Em does not
409conform to
410.St -p1003.2 .
411Collating symbol expressions, equivalence class expressions and
412character class expressions are not supported.
413.Pp
414The flags
415.Dv GLOB_ALTDIRFUNC ,
416.Dv GLOB_BRACE ,
417.Dv GLOB_LIMIT ,
418.Dv GLOB_MAGCHAR ,
419.Dv GLOB_NOMAGIC ,
420and
421.Dv GLOB_TILDE ,
422and the fields
423.Fa gl_matchc
424and
425.Fa gl_flags
426are extensions to the
427.Tn POSIX
428standard and
429should not be used by applications striving for strict
430conformance.
431.Sh HISTORY
432The
433.Fn glob
434and
435.Fn globfree
436functions first appeared in
437.Bx 4.4 .
438.Sh BUGS
439Patterns longer than
440.Dv MAXPATHLEN
441may cause unchecked errors.
442.Pp
443The
444.Fn glob
445argument
446may fail and set errno for any of the errors specified for the
447library routines
448.Xr stat 2 ,
449.Xr closedir 3 ,
450.Xr opendir 3 ,
451.Xr readdir 3 ,
452.Xr malloc 3 ,
453and
454.Xr free 3 .
455