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