1 .fp 5 CW 2 .TH SHELL 3 "28 Feb 2003" 3 .PP 4 .SH NAME 5 .PP 6 \fBshell\fR \- a \f5ksh\fP library interface 7 .PP 8 .SH SYNOPSIS 9 .ta .8i 1.6i 2.4i 3.2i 4.0i 4.8i 5.6i 10 .SS "HEADERS/LIBRARIES" 11 .nf 12 .ft 5 13 #include <shell.h> 14 libshell.a -lshell 15 .ft R 16 .fi 17 .SS "DATA TYPES" 18 .nf 19 .ft 5 20 Shell_t; 21 Shopt_t; 22 Shscope_t; 23 Shbltin_t; 24 Shbltin_f; 25 Shinit_f; 26 Shwait_f; 27 .ft R 28 .fi 29 .SS "FUNCTIONS" 30 .nf 31 .ft 5 32 int sh_main(int \fIargc\fP, char *\fIargv\fP[], Sh_init \fIfn\fP); 33 Shell_t *sh_init(int \fIargc\fP, char *\fIargv\fP[]); 34 Shell_t *sh_getinterp(void); 35 36 Namval_t *sh_addbuiltin(const char *\fIname\fP,Sh_bltin_f \fIfn\fP,void *\fIarg\fP); 37 38 unsigned int sh_isoption(int \fIoption\fP); 39 unsigned int sh_onoption(int \fIoption\fP); 40 unsigned int sh_offoption(int \fIoption\fP); 41 42 void *sh_parse(Shell_t *\fIshp\fP, Sfio_t *\fIsp\fP, int \fIflags\fP); 43 int sh_trap(const char *\fIstring\fP, int \fImode\fP); 44 int sh_run(int \fIargc\fP, char *\fIargv\fP[]); 45 int sh_eval(Sfio_t *\fIsp\fP,int \fImode\fP); 46 int sh_fun(Namval_t *\fIfunnode\fP, Namval_t *\fIvarnode\fP, char *\fIargv\fP[]); 47 int sh_funscope(int \fIargc\fP,char *\fIargv\fP[],int(*\fIfn\fP)(void*),void *\fIarg\fP,int \fIflags\fP); 48 Shscope_t *sh_getscope(int \fIindex\fP,int \fIwhence\fP); 49 Shscope_t *sh_setscope(Shscope_t *\fIscope\fP); 50 51 int (*sh_fdnotify(int(*\fIfn\fP)(int,int)))(int,int); 52 char *sh_fmtq(const char *\fIstring\fP); 53 void *sh_waitnotify(Shwait_f \fIfn\fP); 54 void sh_delay(double \fIsec\fP); 55 Sfio_t *sh_iogetiop(int \fIfd\fP, int \fImode\fP); 56 int sh_sigcheck(void); 57 .ft R 58 .fi 59 .PP 60 .SH DESCRIPTION 61 .PP 62 The \fIShell\fP library is a set of functions used for 63 writing extensions to \f5ksh\fP or writing commands 64 that embed shell command processing. 65 The include file \f5<shell.h>\fP contains the type definitions, 66 function prototypes and symbolic constants defined by 67 this interface. It also defines replacement definitions for 68 the standard library functions 69 \f5access()\fP, 70 \f5close()\fP, 71 \f5dup()\fP, 72 \f5exit()\fP, 73 \f5fcntl()\fP, 74 \f5lseek()\fP, 75 \f5open()\fP, 76 \f5pipe()\fP, 77 \f5read()\fP, 78 and 79 \f5write()\fP 80 that must be used 81 with all code 82 intended to be compiled as built-in commands. 83 .P 84 The \f5<shell.h>\fP header includes \f5<ast.h>\fP which 85 in turn includes the standard include files, \f5<stddef.h>\fP, 86 \f5<stdlib.h>\fP, \f5<stdarg.h>\fP, \f5<limits.h>\fP, 87 \f5<stdio.h>\fP, \f5<string.h>\fP, \f5<unistd.h>\fP, 88 \f5<sys/types.h>\fP, \f5<fcntl.h>\fP, and \f5<locale.h>\fP. 89 The \f5<shell.h>\fP header also includes the headers 90 \f5<cdt.h>\fP, 91 \f5<cmd.h>\fP, 92 \f5<sfio.h>\fP, 93 \f5<nval.h>\fP, 94 \f5<stk.h>\fP, 95 and \f5<error.h>\fP 96 so that in most cases, programs only require the single 97 header \f5<shell.h>\fP. 98 .PP 99 Programs can use this library in one of the following ways: 100 .PD 0 101 .TP 102 .B 1 103 To write builtin commands and/or other code that will be loaded 104 into the shell by loading dynamic libraries 105 at run time using the \f5builtin\fP(1) command. 106 In this case the shell will look for a function named \f5lib_init\fP 107 in your library and, if found, will execute this function with 108 two arguments. The first 109 argument will be an \f5int\P with value \f50\fP when the library is loaded. 110 The second argument will contain a pointer to a structure of type 111 \f5Shbltin_t\fP. 112 In addition, for each argument named on the \f5builtin\fP 113 command line, it will look for a function named \f5b_\fP\fIname\fP\f5()\fP 114 in your library and will \fIname\fP as a built-in. 115 .TP 116 .B 2 117 To build separate a separate command that uses the shell as a 118 library at compile or run time. 119 In this case the \f5sh_init()\fP function must be called to 120 initialize this library before any other commands in this library 121 are invoked. 122 The arguments \fIargc\fP and \fIargv\fP are the number 123 of arguments and the vector of arguments as supplied by the shell. 124 It returns a pointer the \f5Shell_t\fP. 125 .TP 126 .B 3 127 To build a new version of \f5ksh\fP with extended capabilities, 128 for example \f5tksh\fP(1). 129 In this case, the user writes a \f5main()\fP function that 130 calls \f5sh_main()\fP with the \fIargc\fP and \fIargv\fP arguments 131 from \f5main\fP and pointer to function, \fIfn\fP as a third 132 argument.. The function \fIfn\fP will 133 be invoked with argument \f50\fP after \f5ksh\fP has done initialization, 134 but before \f5ksh\fP has processed any start up files or executed 135 any commands. The function \fIfn\fP 136 will be invoked with an argument of \f51\fP before \f5ksh\fP 137 begins to execute a script that has been invoked by name 138 since \f5ksh\fP cleans up memory and long jumps back to 139 the beginning of the shell in this case. 140 The function \fIfn\fP will be called with argument \f5-1\fP before 141 the shell exits. 142 .PD 143 .PP 144 The \f5Shell_t\fP structure contains the following fields: 145 .nf 146 .ft 5 147 Shopt_t \fIoptions\fP; \fR/* set -o options */\fP 148 Dt_t *\fIvar_tree\fP; \fR/* shell variable dictionary */\fP 149 Dt_t *\fIfun_tree\fP; \fR/* shell function dictionary */\fP 150 Dt_t *\fIalias_tree\fP; \fR/* shell alias dictionary */\fP 151 Dt_t *\fIbltin_tree\fP; \fR/* shell built-in dictionary */\fP 152 Shscope_t *\fItopscope\fP; \fR/* pointer to top-level scope */\fP 153 char *\fIinfile_name\fP; \fR/* path name of current input file*/\fP 154 int \fIinlineno\fP; \fR/* line number of current input file*/\fP 155 int \fIexitval\fP; \fR/* most recent exit value*/\fP 156 .ft R 157 .fi 158 This structure is returned by \f5sh_init()\fP but can also be retrieved 159 by a call to \f5sh_getinterp()\fP. 160 .PP 161 All built-in commands to the shell are invoked with 162 three arguments. The first two arguments give the 163 number of arguments and the argument list 164 and uses the same conventions as the \f5main()\fP function 165 of a program. The third argument is a pointer to a structure 166 of type \f5Shbltin_t\fP. This structure contains \f5shp\P which is a pointer 167 to the shell interpreter, and \f5ptr\fP which is a pointer that 168 can be associated with each built-in. 169 The \f5sh_addbuiltin()\fP function is used to add, replace or delete 170 built-in commands. 171 It takes the name of the built-in, \fIname\fP, a pointer 172 to the function that implements the built-in, \fIfn\fP, and 173 a pointer that will be passed to the function in the \f5ptr\fP field when 174 it is invoked. 175 If, \fIfn\fP is non-\f5NULL\fP the built-in command 176 is added or replaced. Otherwise, \f5sh_addbuiltin()\fP will 177 return a pointer to the built-in if it exists or \f5NULL\fP otherwise. 178 If \fIarg\fP is \f5(void*)1\fP the built-in will be deleted. 179 The \fIname\fP argument can be in the format of a pathname. 180 It cannot be the name of any of the special built-in commands. 181 If \fIname\fP contains a \f5/\fP, the built-in is the basename of 182 the pathname and the built-in will only be executed 183 if the given pathname is encountered when performing 184 a path search. 185 When adding or replacing a built-in, 186 \f5sh_addbuiltin()\fP function returns a pointer to 187 the name-value pair corresponding to the built-in on success and \f5NULL\fP 188 if it is unable to add or replace the built-in. 189 When deleting a built-in, \f5NULL\fP is returned on success or 190 if not found, and the name-value pair pointer is returned if the built-in 191 cannot be deleted. 192 .PP 193 The functions \f5sh_onoption()\fP, \f5sh_offoption()\fP, \f5sh_isoption()\fP 194 are used to set, unset, and test for shell options respectively. 195 The \fIoption\fP argument can be any one of the following: 196 .IP 197 \f5SH_ALLEXPORT\fP: 198 The \f5NV_EXPORT\fP attribute is given to each variable whose 199 name is an identifier when a value is assigned. 200 .IP 201 \f5SH_BGNICE\fP: 202 Each background process is run at a lower priority. 203 .IP 204 \f5SH_ERREXIT\fP: 205 Causes a non-interactive shell to exit when a command, 206 other than a conditional command, returns non-zero. 207 .IP 208 \f5SH_EMACS\fP: 209 The emacs editing mode. 210 .IP 211 \f5SH_GMACS\fP: 212 Same as the emacs editing mode except for the behavior of CONTROL-T. 213 .IP 214 \f5SH_HISTORY\fP: 215 Indicates that the history file has been created and that 216 commands can be logged. 217 .IP 218 \f5SH_IGNOREEOF\fP: 219 Do not treat end-of-file as exit. 220 .IP 221 \f5SH_INTERACTIVE\fP: 222 .IP 223 Set for interactive shells. 224 Do not set or unset this option. 225 \f5SH_MARKDIRS\fP: 226 A \fB/\fP is added to the end of each directory generated by pathname 227 expansion. 228 .IP 229 \f5SH_MONITOR\fP: 230 Indicates that the monitor option is enabled for job control. 231 .IP 232 \f5SH_NOCLOBBER\fP: 233 The \fB>\fP redirection will fail if the file exists. Each file 234 created with \fB>\fP will have the \f5O_EXCL\fP bit set as described 235 in \f5<fcntl.h>\fP 236 .IP 237 \f5SH_NOGLOB\fP: 238 Do not perform pathname expansion. 239 .IP 240 \f5SH_NOLOG\fP: 241 Do not save function definitions in the history file. 242 .IP 243 \f5SH_NOTIFY\fP: 244 Cause a message to be generated as soon as each background job completes. 245 .IP 246 \f5SH_NOUNSET\fP: 247 Cause the shell to fail with an error of an unset variable is 248 referenced. 249 .IP 250 \f5SH_PRIVILEGED\fP: 251 .IP 252 \f5SH_VERBOSE\fP: 253 Cause each line to be echoed as it is read by the parser. 254 .IP 255 \f5SH_XTRACE\fP: 256 Cause each command to be displayed after all expansions, but 257 before execution. 258 .IP 259 \f5SH_VI\fP: 260 The vi edit mode. 261 .IP 262 \f5SH_VIRAW\fP: 263 Read character at a time rather than line at a time when 264 in vi edit mode. 265 .IP 266 .PP 267 The \f5sh_trap()\fP function can be used to compile and execute 268 a string or file. 269 A value of \f50\fP for \fImode\fP indicates that \fIname\fP 270 refers to a string. A value of \f51\fP for \fImode\fP 271 indicates that \fIname\fP is an \f5Sfio_t*\fP to an open stream. 272 A value of \f52\fP for \fImode\fP indicates that \fIname\fP 273 points to a parse tree that has been returned by \f5sh_parse()\fP. 274 The complete file associated with the string or file 275 is compiled and then executed so that aliases defined 276 within the string or file will not take effect until 277 the next command is executed. 278 .PP 279 The \f5sh_run()\fP function will run the command given by 280 by the argument list \fIargv\fP containing \fIargc\fP elements. 281 If \fIargv\fP\f5[0]\fP does not contain a \f5/\fP, it will 282 be checked to see if it is a built-in or function before 283 performing a path search. 284 .PP 285 The \f5sh_eval()\fP function executes a string or file 286 stream \fIsp\fP. 287 If \fImode\fP is non-zero and the history file has 288 been created, the stream defined by \fIsp\fP 289 will be appended to the history file as a command. 290 .PP 291 The \f5sh_parse()\fP function takes a pointer to the 292 shell interpreter \fIshp\fP, a pointer to a string or file stream 293 \fIsp\fP, and compilation flags, and returns a pointer 294 to a parse tree of the compiled stream. This pointer can 295 be used in subsequent calls to \f5sh_trap()\fP. 296 The compilation flags can be zero or more of the following: 297 .IP 298 \f5SH_NL\fP: 299 Treat new-lines as \fB;\fP. 300 .IP 301 \f5SH_EOF\fP: 302 An end of file causes syntax error. By default it will 303 be treated as a new-line. 304 .PP 305 \f5ksh\fP executes each function defined with the \f5function\fP 306 reserved word in a separate scope. The \f5Shscope_t\fP type 307 provides an interface to some of the information that 308 is available on each scope. The structure contains 309 the following public members: 310 .nf 311 \f5Sh_scope_t *par_scope;\fP 312 \f5int argc;\fP 313 \f5char **argv;\fP 314 \f5char *cmdname;\fP 315 \f5Dt_t *var_tree;\fP 316 .fi 317 The \f5sh_getscope()\fP function can be used to the the 318 scope information associated with existing scope. 319 Scopes are numbered from \f50\fP for the global scope 320 up to the current scope level. The \fIwhence\fP 321 argument uses the symbolic constants associated with \f5lseek()\fP 322 to indicate whether the \f5Iscope\fP argument is absolute, 323 relative to the current scope, or relative to the topmost scope. 324 The\f5sh_setscope()\fP function can be used to make a 325 a known scope the current scope. It returns a pointer to the 326 old current scope. 327 .PP 328 The \f5sh_funscope()\fP function can be used to run a function 329 in a new scope. The arguments \fIargc\fP and \fIargv\fP 330 are the number of arguments and the list of arguments 331 respectively. If \fIfn\fP is non-\f5NULL\fP, then 332 this function is invoked with \fIargc\fP, \fIargv\fP, and \fIarg\fP 333 as arguments. 334 .PP 335 The \f5sh_fun()\fP function can be called within a 336 discipline function or built-in extension to execute a 337 discipline function script. 338 The argument \fIfunnode\fP is a pointer to the shell function 339 or built-in to execute. 340 The argument \fIvarnode\fP is a pointer to the name 341 value pair that has defined this discipline. 342 The array \fIargv\fP is a \f5NULL\fP terminated list of 343 arguments that are passed to the function. 344 .PP 345 By default, \f5ksh\fP only records but does not act 346 on signals when running a built-in command. 347 If a built-in takes a substantial amount of time 348 to execute, then it should check for interrupts 349 periodically by calling \f5sh_sigcheck()\fP. 350 If a signal is pending, \f5sh_sigcheck()\fP will exit 351 the function you are calling and return to the point 352 where the most recent built-in was invoked, or where 353 \f5sh_eval()\fP or \f5sh_trap()\fP was called. 354 .PP 355 The \f5sh_delay()\fP function is used to cause the 356 shell to sleep for a period of time defined by \fIsec\fP. 357 .PP 358 The \f5sh_fmtq()\fP function can be used to convert a string 359 into a string that is quoted so that it can be reinput 360 to the shell. The quoted string returned by \f5sh_fmtq\fP 361 may be returned on the current stack, so that it 362 must be saved or copied. 363 .PP 364 The \f5sh_fdnotify()\fP function causes the function \fIfn\fP 365 to be called whenever the shell duplicates or closes a file. 366 It is provided for extensions that need to keep track of 367 file descriptors that could be changed by shell commands. 368 The function \fIfn\fP is called with two arguments. 369 The first argument is the original file descriptor. The 370 second argument is the new file descriptor for duplicating 371 files, and \f5SH_FDCLOSE\fP when a file has been closed. 372 The previously installed \f5sh_fdnotify()\fP function pointer 373 is returned. 374 .PP 375 The \f5sh_waitnotify()\fP function causes the function \fIfn\fP 376 to be called whenever the shell is waiting for input from 377 a slow device or waiting for a process to complete. 378 This function can process events and run shell commands 379 until there is input, the timer is reached or a signal arises. 380 It is called with three arguments. The first is the file 381 descriptor from which the shell trying to read or \f5\-1\fP 382 if the shell is waiting for a process to complete. 383 The second is a timeout in milliseconds. 384 A value of \f5\-1\fP for the timeout means that 385 no timeout should be set. 386 The third argument is 0 for input file descriptors 387 and 1 for output file descriptor. 388 The function needs to return a value \f5>0\fP if there 389 is input on the file descriptor, and a value \f5<0\fP 390 if the timeout is reached or a signal has occurred. 391 A value of \f50\fP indicates 392 that the function has returned without processing and that the shell 393 should wait for input or process completion. 394 The previous installed \f5sh_waitnotify()\fP function pointer is returned. 395 .PP 396 The \f5sh_iogetiop()\fP function returns a pointer to the 397 Sfio stream corresponding to file descriptor number \fIfd\fP 398 and the given mode \fImode\fP. The mode can be either 399 \f5SF_READ\fP or \f5SF_WRITE\fP. 400 The \fIfd\fP argument can the number of an open file descriptor or 401 one of the following symbolic constants: 402 .IP 403 \f5SH_IOCOPROCESS\fP: 404 The stream corresponding to the most recent co-process. 405 .IP 406 \f5SH_IOHISTFILE\fP: 407 The stream corresponding to the history file. 408 If no stream exists corresponding to \fIfd\fP or the stream 409 can not be accessed in the specified mode, \f5NULL\fP is returned. 410 .PP 411 .SH SEE ALSO 412 builtin(1) 413 cdt(3) 414 error(3) 415 nval(3) 416 sfio(3) 417 stk(3) 418 tksh(1) 419 .PP 420 .SH AUTHOR 421 David G. Korn (dgk (a] research.att.com). 422 423