1 .\" Copyright (c) Michael Smith
2 .\" All rights reserved.
4 .\" Redistribution and use in source and binary forms, with or without
5 .\" modification, are permitted provided that the following conditions
7 .\" 1. Redistributions of source code must retain the above copyright
8 .\" notice, this list of conditions and the following disclaimer.
9 .\" 2. Redistributions in binary form must reproduce the above copyright
10 .\" notice, this list of conditions and the following disclaimer in the
11 .\" documentation and/or other materials provided with the distribution.
13 .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 .\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 .Nd support library for standalone executables
38 library provides a set of supporting functions for standalone
39 applications, mimicking where possible the standard
43 The following sections group these functions by kind.
44 Unless specifically described here, see the corresponding section 3
45 manpages for the given functions.
47 String functions are available as documented in
55 .Fn malloc "size_t size"
60 bytes of memory from the heap using a best-fit algorithm.
66 Free the allocated object at
70 .Fn setheap "void *start" "void *limit"
74 This function must be called before calling
81 will be used for the heap; attempting to allocate beyond this will result
88 Provides the behaviour of
90 i.e., returns the highest point that the heap has reached.
92 be used during testing to determine the actual heap usage.
98 A set of functions are provided for manipulating a flat variable space similar
99 to the traditional shell-supported environment.
100 Major enhancements are support
101 for set/unset hook functions.
105 .Fn getenv "const char *name"
109 .Fn setenv "const char *name" "const char *value" "int overwrite"
113 .Fn putenv "char *string"
117 .Fn unsetenv "const char *name"
120 These functions behave similarly to their standard library counterparts.
122 .Ft "struct env_var *"
123 .Fn env_getenv "const char *name"
126 Looks up a variable in the environment and returns its entire
130 .Fn env_setenv "const char *name" "int flags" "const void *value" "ev_sethook_t sethook" "ev_unsethook_t unsethook"
133 Creates a new or sets an existing environment variable called
135 If creating a new variable, the
139 arguments may be specified.
141 The set hook is invoked whenever an attempt
142 is made to set the variable, unless the EV_NOHOOK flag is set.
144 a set hook will validate the
146 argument, and then call
148 again with EV_NOHOOK set to actually save the value.
149 The predefined function
151 may be specified to refuse all attempts to set a variable.
153 The unset hook is invoked when an attempt is made to unset a variable.
155 returns zero, the variable will be unset.
156 The predefined function
158 may be used to prevent a variable being unset.
160 .Sh STANDARD LIBRARY SUPPORT
168 .Fn getopt "int argc" "char * const *argv" "const char *optstring"
172 .Fn strtol "const char *nptr" "char **endptr" "int base"
176 .Fn strtoll "const char *nptr" "char **endptr" "int base"
180 .Fn strtoul "const char *nptr" "char **endptr" "int base"
184 .Fn strtoull "const char *nptr" "char **endptr" "int base"
188 .Fn srandom "unsigned int seed"
196 .Fn strerror "int error"
199 Returns error messages for the subset of errno values supported by
201 .It Fn assert expression
207 .Fn setjmp "jmp_buf env"
211 .Fn longjmp "jmp_buf env" "int val"
218 respectively as there is no signal state to manipulate.
229 Read characters from the console into
231 All of the standard cautions apply to this function.
234 .Fn ngets "char *buf" "int size"
239 - 1 characters from the console into
243 is less than 1, the function's behaviour is as for
247 .Fn fgetstr "char *buf" "int size" "int fd"
250 Read a line of at most
254 Line terminating characters are stripped, and the buffer is always
257 Returns the number of characters in
259 if successful, or -1 if a read error occurs.
262 .Fn printf "const char *fmt" "..."
266 .Fn vprintf "const char *fmt" "va_list ap"
270 .Fn sprintf "char *buf" "const char *fmt" "..."
274 .Fn vsprintf "char *buf" "const char *fmt" "va_list ap"
277 The *printf functions implement a subset of the standard
279 family functionality and some extensions.
280 The following standard conversions
281 are supported: c,d,n,o,p,s,u,x.
282 The following modifiers are supported:
283 +,-,#,*,0,field width,precision,l.
287 conversion is provided to decode error registers.
289 .Bd -ragged -offset indent
297 where <base> is the output expressed as a control character, e.g.\& \e10 gives
298 octal, \e20 gives hex.
299 Each <arg> is a sequence of characters, the first of
300 which gives the bit number to be inspected (origin 1) and the next characters
301 (up to a character less than 32) give the text to be displayed if the bit is set.
303 .Bd -ragged -offset indent
307 .Qq \e10\e2BITTWO\e1BITONE
311 would give the output
312 .Bd -ragged -offset indent
318 conversion provides a hexdump facility, e.g.
319 .Bd -ragged -offset indent
325 .Qq XX:XX:XX:XX:XX:XX
327 .Bd -ragged -offset indent
337 .Sh CHARACTER TESTS AND CONVERSIONS
396 .Fn open "const char *path" "int flags"
399 Similar to the behaviour as specified in
401 except that file creation is not supported, so the mode parameter is not
405 argument may be one of O_RDONLY, O_WRONLY and O_RDWR.
406 Only UFS currently supports writing.
416 Close all open files.
419 .Fn read "int fd" "void *buf" "size_t len"
423 .Fn write "int fd" "void *buf" "size_t len"
426 (No file systems currently support writing.)
429 .Fn lseek "int fd" "off_t offset" "int whence"
432 Files being automatically uncompressed during reading cannot seek backwards
433 from the current point.
436 .Fn stat "const char *path" "struct stat *sb"
440 .Fn fstat "int fd" "struct stat *sb"
447 functions only fill out the following fields in the
449 structure: st_mode,st_nlink,st_uid,st_gid,st_size.
452 file system cannot provide meaningful values for this call, and the
454 file system always reports files having uid/gid of zero.
459 library supplies a simple internal pager to ease reading the output of large
467 Initialises the pager and tells it that the next line output will be the top of the
469 The environment variable LINES is consulted to determine the number of
470 lines to be displayed before pausing.
479 .Fn pager_output "const char *lines"
482 Sends the lines in the
484 -terminated buffer at
487 Newline characters are counted in order to determine the number
488 of lines being output (wrapped lines are not accounted for).
491 function will return zero when all of the lines have been output, or nonzero
492 if the display was paused and the user elected to quit.
495 .Fn pager_file "const char *fname"
498 Attempts to open and display the file
500 Returns -1 on error, 0 at EOF, or 1 if the user elects to quit while reading.
506 .Fn devformat "struct devdesc *"
509 Format the specified device as a string.
515 Successive calls emit the characters in the sequence |,/,-,\\ followed by a
516 backspace in order to provide reassurance to the user.
518 .Sh REQUIRED LOW-LEVEL SUPPORT
519 The following resources are consumed by
521 - stack, heap, console and devices.
523 The stack must be established before
525 functions can be invoked.
526 Stack requirements vary depending on the functions
527 and file systems used by the consumer and the support layer functions detailed
530 The heap must be established before calling
536 Heap usage will vary depending on the number of simultaneously open files,
537 as well as client behaviour.
538 Automatic decompression will allocate more
539 than 64K of data per open file.
541 Console access is performed via the
546 functions detailed below.
548 Device access is initiated via
550 and is performed through the
555 functions in the device switch structure that
559 The consumer must provide the following support functions:
566 Return a character from the console, used by
575 Returns nonzero if a character is waiting from the console.
581 Write a character to the console, used by
588 and thus by many other functions for debugging and informational output.
591 .Fn devopen "struct open_file *of" "const char *name" "const char **file"
594 Open the appropriate device for the file named in
598 a pointer to the remaining body of
600 which does not refer to the device.
605 will be set to point to the
607 structure for the opened device if successful.
608 Device identifiers must
609 always precede the path component, but may otherwise be arbitrarily formatted.
612 and thus for all device-related I/O.
615 .Fn devclose "struct open_file *of"
618 Close the device allocated for
620 The device driver itself will already have been called for the close; this call
621 should clean up any allocation made by devopen only.
632 .Fn panic "const char *msg" "..."
635 Signal a fatal and unrecoverable error condition.
641 .Sh INTERNAL FILE SYSTEMS
642 Internal file systems are enabled by the consumer exporting the array
643 .Vt struct fs_ops *file_system[] ,
644 which should be initialised with pointers
648 The following file system handlers are supplied by
650 the consumer may supply other file systems of their own:
651 .Bl -hang -width ".Va cd9660_fsops"
657 Linux ext2fs file system.
659 File access via TFTP.
663 ISO 9660 (CD-ROM) file system.
665 Stacked file system supporting gzipped files.
666 When trying the gzipfs file system,
670 to the end of the filename, and then tries to locate the file using the other
672 Placement of this file system in the
674 array determines whether gzipped files will be opened in preference to non-gzipped
676 It is only possible to seek a gzipped file forwards, and
680 on gzipped files will report an invalid length.
685 .Xr bzip2 1 Ns -compressed
691 pointers should be terminated with a NULL.
693 Devices are exported by the supporting code via the array
694 .Vt struct devsw *devsw[]
695 which is a NULL terminated array of pointers to device switch structures.
697 The driver needs to provide a common set of entry points that are
700 to interface with the device.
703 const char dv_name[DEV_NAMLEN];
705 int (*dv_init)(void);
706 int (*dv_strategy)(void *devdata, int rw, daddr_t blk,
707 size_t size, char *buf, size_t *rsize);
708 int (*dv_open)(struct open_file *f, ...);
709 int (*dv_close)(struct open_file *f);
710 int (*dv_ioctl)(struct open_file *f, u_long cmd, void *data);
711 int (*dv_print)(int verbose);
712 void (*dv_cleanup)(void);
713 void (*dv_fmtdev)(struct devdesc *);
716 .Bl -tag -width ".Fn dv_strategy"
721 The supported types are:
722 .Bl -tag -width "DEVT_NONE"
730 Each type may have its own associated (struct type_devdesc),
731 which has the generic (struct devdesc) as its first member.
733 Driver initialization routine.
734 This routine should probe for available units.
735 Drivers are responsible for maintaining lists of units for later enumeration.
736 No other driver routines may be called before
740 The driver open routine.
742 The driver close routine.
744 The driver ioctl routine.
746 Prints information about the available devices.
747 Information should be presented with
750 Cleans up any memory used by the device before the next stage is run.
752 Converts the specified devdesc to the canonical string representation
758 library contains contributions from many sources, including:
773 .An Matthew Dillon Aq Mt dillon@backplane.com
776 The reorganisation and port to
778 the environment functions and this manpage were written by
779 .An Mike Smith Aq Mt msmith@FreeBSD.org .
781 The lack of detailed memory usage data is unhelpful.