xref: /dflybsd-src/lib/libc/gen/wordexp.3 (revision a31d362788e8f158ecc861d1247b0648ccd22f9a)
1c6ddf9d0SSascha Wildner.\"
2c6ddf9d0SSascha Wildner.\" Copyright (c) 2002 Tim J. Robbins
3c6ddf9d0SSascha Wildner.\" All rights reserved.
4c6ddf9d0SSascha Wildner.\"
5c6ddf9d0SSascha Wildner.\" Redistribution and use in source and binary forms, with or without
6c6ddf9d0SSascha Wildner.\" modification, are permitted provided that the following conditions
7c6ddf9d0SSascha Wildner.\" are met:
8c6ddf9d0SSascha Wildner.\" 1. Redistributions of source code must retain the above copyright
9c6ddf9d0SSascha Wildner.\"    notice, this list of conditions and the following disclaimer.
10c6ddf9d0SSascha Wildner.\" 2. Redistributions in binary form must reproduce the above copyright
11c6ddf9d0SSascha Wildner.\"    notice, this list of conditions and the following disclaimer in the
12c6ddf9d0SSascha Wildner.\"    documentation and/or other materials provided with the distribution.
13c6ddf9d0SSascha Wildner.\"
14c6ddf9d0SSascha Wildner.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15c6ddf9d0SSascha Wildner.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16c6ddf9d0SSascha Wildner.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17c6ddf9d0SSascha Wildner.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18c6ddf9d0SSascha Wildner.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19c6ddf9d0SSascha Wildner.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20c6ddf9d0SSascha Wildner.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21c6ddf9d0SSascha Wildner.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22c6ddf9d0SSascha Wildner.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23c6ddf9d0SSascha Wildner.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24c6ddf9d0SSascha Wildner.\" SUCH DAMAGE.
25c6ddf9d0SSascha Wildner.\"
26*a31d3627SSascha Wildner.\" $FreeBSD: head/lib/libc/gen/wordexp.3 288430 2015-09-30 21:32:29Z jilles $
27c6ddf9d0SSascha Wildner.\"
28*a31d3627SSascha Wildner.Dd October 9, 2020
29c6ddf9d0SSascha Wildner.Dt WORDEXP 3
30c6ddf9d0SSascha Wildner.Os
31c6ddf9d0SSascha Wildner.Sh NAME
32c6ddf9d0SSascha Wildner.Nm wordexp
33c6ddf9d0SSascha Wildner.Nd "perform shell-style word expansions"
34c6ddf9d0SSascha Wildner.Sh LIBRARY
35c6ddf9d0SSascha Wildner.Lb libc
36c6ddf9d0SSascha Wildner.Sh SYNOPSIS
37c6ddf9d0SSascha Wildner.In wordexp.h
38c6ddf9d0SSascha Wildner.Ft int
39c6ddf9d0SSascha Wildner.Fn wordexp "const char * restrict words" "wordexp_t * restrict we" "int flags"
40c6ddf9d0SSascha Wildner.Ft void
41c6ddf9d0SSascha Wildner.Fn wordfree "wordexp_t *we"
42c6ddf9d0SSascha Wildner.Sh DESCRIPTION
43c6ddf9d0SSascha WildnerThe
44c6ddf9d0SSascha Wildner.Fn wordexp
45c6ddf9d0SSascha Wildnerfunction performs shell-style word expansion on
46c6ddf9d0SSascha Wildner.Fa words
47c6ddf9d0SSascha Wildnerand places the list of words into the
48c6ddf9d0SSascha Wildner.Va we_wordv
49c6ddf9d0SSascha Wildnermember of
50c6ddf9d0SSascha Wildner.Fa we ,
51c6ddf9d0SSascha Wildnerand the number of words into
52c6ddf9d0SSascha Wildner.Va we_wordc .
53c6ddf9d0SSascha Wildner.Pp
54c6ddf9d0SSascha WildnerThe
55c6ddf9d0SSascha Wildner.Fa flags
56c6ddf9d0SSascha Wildnerargument is the bitwise inclusive OR of any of the following constants:
57c6ddf9d0SSascha Wildner.Bl -tag -width ".Dv WRDE_SHOWERR"
58c6ddf9d0SSascha Wildner.It Dv WRDE_APPEND
59c6ddf9d0SSascha WildnerAppend the words to those generated by a previous call to
60c6ddf9d0SSascha Wildner.Fn wordexp .
61c6ddf9d0SSascha Wildner.It Dv WRDE_DOOFFS
62c6ddf9d0SSascha WildnerAs many
63c6ddf9d0SSascha Wildner.Dv NULL
64c6ddf9d0SSascha Wildnerpointers as are specified by the
65c6ddf9d0SSascha Wildner.Va we_offs
66c6ddf9d0SSascha Wildnermember of
67c6ddf9d0SSascha Wildner.Fa we
68c6ddf9d0SSascha Wildnerare added to the front of
69c6ddf9d0SSascha Wildner.Va we_wordv .
70c6ddf9d0SSascha Wildner.It Dv WRDE_NOCMD
71c6ddf9d0SSascha WildnerDisallow command substitution in
72c6ddf9d0SSascha Wildner.Fa words .
73c6ddf9d0SSascha WildnerSee the note in
74c6ddf9d0SSascha Wildner.Sx BUGS
75c6ddf9d0SSascha Wildnerbefore using this.
76c6ddf9d0SSascha Wildner.It Dv WRDE_REUSE
77c6ddf9d0SSascha WildnerThe
78c6ddf9d0SSascha Wildner.Fa we
79c6ddf9d0SSascha Wildnerargument was passed to a previous successful call to
80c6ddf9d0SSascha Wildner.Fn wordexp
81c6ddf9d0SSascha Wildnerbut has not been passed to
82c6ddf9d0SSascha Wildner.Fn wordfree .
83c6ddf9d0SSascha WildnerThe implementation may reuse the space allocated to it.
84c6ddf9d0SSascha Wildner.It Dv WRDE_SHOWERR
85c6ddf9d0SSascha WildnerDo not redirect shell error messages to
86c6ddf9d0SSascha Wildner.Pa /dev/null .
87c6ddf9d0SSascha Wildner.It Dv WRDE_UNDEF
88c6ddf9d0SSascha WildnerReport error on an attempt to expand an undefined shell variable.
89c6ddf9d0SSascha Wildner.El
90c6ddf9d0SSascha Wildner.Pp
91c6ddf9d0SSascha WildnerThe
92c6ddf9d0SSascha Wildner.Vt wordexp_t
93c6ddf9d0SSascha Wildnerstructure is defined in
94c6ddf9d0SSascha Wildner.In wordexp.h
95c6ddf9d0SSascha Wildneras:
96c6ddf9d0SSascha Wildner.Bd -literal -offset indent
97c6ddf9d0SSascha Wildnertypedef struct {
98c6ddf9d0SSascha Wildner	size_t	we_wordc;	/* count of words matched */
99c6ddf9d0SSascha Wildner	char	**we_wordv;	/* pointer to list of words */
100c6ddf9d0SSascha Wildner	size_t	we_offs;	/* slots to reserve in we_wordv */
101c6ddf9d0SSascha Wildner} wordexp_t;
102c6ddf9d0SSascha Wildner.Ed
103c6ddf9d0SSascha Wildner.Pp
104c6ddf9d0SSascha WildnerThe
105c6ddf9d0SSascha Wildner.Fn wordfree
106c6ddf9d0SSascha Wildnerfunction frees the memory allocated by
107c6ddf9d0SSascha Wildner.Fn wordexp .
108c6ddf9d0SSascha Wildner.Sh IMPLEMENTATION NOTES
109c6ddf9d0SSascha WildnerThe
110c6ddf9d0SSascha Wildner.Fn wordexp
111*a31d3627SSascha Wildnerfunction is implemented using the undocumented
112*a31d3627SSascha Wildner.Ic wordexp2
113c6ddf9d0SSascha Wildnershell built-in command.
114c6ddf9d0SSascha Wildner.Sh RETURN VALUES
115c6ddf9d0SSascha WildnerThe
116c6ddf9d0SSascha Wildner.Fn wordexp
117c6ddf9d0SSascha Wildnerfunction returns zero if successful, otherwise it returns one of the following
118c6ddf9d0SSascha Wildnererror codes:
119c6ddf9d0SSascha Wildner.Bl -tag -width ".Dv WRDE_NOSPACE"
120c6ddf9d0SSascha Wildner.It Dv WRDE_BADCHAR
121c6ddf9d0SSascha WildnerThe
122c6ddf9d0SSascha Wildner.Fa words
123c6ddf9d0SSascha Wildnerargument contains one of the following unquoted characters:
124c6ddf9d0SSascha Wildner.Aq newline ,
125c6ddf9d0SSascha Wildner.Ql | ,
126c6ddf9d0SSascha Wildner.Ql & ,
127c6ddf9d0SSascha Wildner.Ql \&; ,
128c6ddf9d0SSascha Wildner.Ql < ,
129c6ddf9d0SSascha Wildner.Ql > ,
130c6ddf9d0SSascha Wildner.Ql \&( ,
131c6ddf9d0SSascha Wildner.Ql \&) ,
132c6ddf9d0SSascha Wildner.Ql { ,
133c6ddf9d0SSascha Wildner.Ql } .
134c6ddf9d0SSascha Wildner.It Dv WRDE_BADVAL
135*a31d3627SSascha WildnerAn error after successful parsing,
136*a31d3627SSascha Wildnersuch as an attempt to expand an undefined shell variable with
137c6ddf9d0SSascha Wildner.Dv WRDE_UNDEF
138*a31d3627SSascha Wildnerset in
139c6ddf9d0SSascha Wildner.Fa flags .
140c6ddf9d0SSascha Wildner.It Dv WRDE_CMDSUB
141c6ddf9d0SSascha WildnerAn attempt was made to use command substitution and
142c6ddf9d0SSascha Wildner.Dv WRDE_NOCMD
143c6ddf9d0SSascha Wildneris set in
144c6ddf9d0SSascha Wildner.Fa flags .
145c6ddf9d0SSascha Wildner.It Dv WRDE_NOSPACE
146*a31d3627SSascha WildnerNot enough memory to store the result or
147*a31d3627SSascha Wildneran error during
148*a31d3627SSascha Wildner.Xr fork 2 .
149c6ddf9d0SSascha Wildner.It Dv WRDE_SYNTAX
150c6ddf9d0SSascha WildnerShell syntax error in
151c6ddf9d0SSascha Wildner.Fa words .
152c6ddf9d0SSascha Wildner.El
153c6ddf9d0SSascha Wildner.Pp
154c6ddf9d0SSascha WildnerThe
155c6ddf9d0SSascha Wildner.Fn wordfree
156c6ddf9d0SSascha Wildnerfunction returns no value.
157c6ddf9d0SSascha Wildner.Sh ENVIRONMENT
158c6ddf9d0SSascha Wildner.Bl -tag -width ".Ev IFS"
159c6ddf9d0SSascha Wildner.It Ev IFS
160c6ddf9d0SSascha WildnerField separator.
161c6ddf9d0SSascha Wildner.El
162c6ddf9d0SSascha Wildner.Sh EXAMPLES
163c6ddf9d0SSascha WildnerInvoke the editor on all
164c6ddf9d0SSascha Wildner.Pa .c
165c6ddf9d0SSascha Wildnerfiles in the current directory
166c6ddf9d0SSascha Wildnerand
167c6ddf9d0SSascha Wildner.Pa /etc/motd
168c6ddf9d0SSascha Wildner(error checking omitted):
169c6ddf9d0SSascha Wildner.Bd -literal -offset indent
170c6ddf9d0SSascha Wildnerwordexp_t we;
171c6ddf9d0SSascha Wildner
172c6ddf9d0SSascha Wildnerwordexp("${EDITOR:-vi} *.c /etc/motd", &we, 0);
173c6ddf9d0SSascha Wildnerexecvp(we.we_wordv[0], we.we_wordv);
174c6ddf9d0SSascha Wildner.Ed
175c6ddf9d0SSascha Wildner.Sh DIAGNOSTICS
176c6ddf9d0SSascha WildnerDiagnostic messages from the shell are written to the standard error output
177c6ddf9d0SSascha Wildnerif
178c6ddf9d0SSascha Wildner.Dv WRDE_SHOWERR
179c6ddf9d0SSascha Wildneris set in
180c6ddf9d0SSascha Wildner.Fa flags .
181c6ddf9d0SSascha Wildner.Sh SEE ALSO
182c6ddf9d0SSascha Wildner.Xr sh 1 ,
183c6ddf9d0SSascha Wildner.Xr fnmatch 3 ,
184c6ddf9d0SSascha Wildner.Xr glob 3 ,
185c6ddf9d0SSascha Wildner.Xr popen 3 ,
186c6ddf9d0SSascha Wildner.Xr system 3
187c6ddf9d0SSascha Wildner.Sh STANDARDS
188c6ddf9d0SSascha WildnerThe
189c6ddf9d0SSascha Wildner.Fn wordexp
190c6ddf9d0SSascha Wildnerand
191c6ddf9d0SSascha Wildner.Fn wordfree
192c6ddf9d0SSascha Wildnerfunctions conform to
193c6ddf9d0SSascha Wildner.St -p1003.1-2001 .
194c6ddf9d0SSascha Wildner.Sh BUGS
195c6ddf9d0SSascha WildnerThe current
196c6ddf9d0SSascha Wildner.Fn wordexp
197*a31d3627SSascha Wildnerimplementation does not recognize multibyte characters other than UTF-8, since
198*a31d3627SSascha Wildnerthe shell (which it invokes to perform expansions) does not.
199*a31d3627SSascha Wildner.Sh SECURITY CONSIDERATIONS
200*a31d3627SSascha WildnerPathname generation may create output that is exponentially larger than the
201*a31d3627SSascha Wildnerinput size.
202*a31d3627SSascha Wildner.Pp
203*a31d3627SSascha WildnerAlthough this implementation detects command substitution reliably for
204*a31d3627SSascha Wildner.Dv WRDE_NOCMD ,
205*a31d3627SSascha Wildnerthe attack surface remains fairly large.
206*a31d3627SSascha WildnerAlso, some other implementations
207*a31d3627SSascha Wildner(such as older versions of this one)
208*a31d3627SSascha Wildnermay execute command substitutions even if
209*a31d3627SSascha Wildner.Dv WRDE_NOCMD
210*a31d3627SSascha Wildneris set.
211