NAME
libstand
—
support library for standalone
executables
LIBRARY
library “libstand”
SYNOPSIS
#include
<stand.h>
DESCRIPTION
libstand
provides a set of supporting
functions for standalone applications, mimicking where possible the standard
BSD programming environment. The following sections
group these functions by kind. Unless specifically described here, see the
corresponding section 3 manpages for the given functions.
STRING FUNCTIONS
String functions are available as documented in string(3) and bstring(3).
MEMORY ALLOCATION
- void *
malloc
(size_t size) -
Allocate size bytes of memory from the heap using a best-fit algorithm.
- void
free
(void *ptr) -
Free the allocated object at ptr.
- void
setheap
(void *start, void *limit) -
Initialise the heap. This function must be called before calling
alloc
() for the first time. The region between start and limit will be used for the heap; attempting to allocate beyond this will result in a panic. - char *
sbrk
(intptr_t incr) -
Provides the behaviour of
sbrk
(0), i.e. returns the highest point that the heap has reached. This value can be used during testing to determine the actual heap usage. The incr argument is ignored.
ENVIRONMENT
A set of functions are provided for manipulating a flat variable space similar to the traditional shell-supported environment. Major enhancements are support for set/unset hook functions.
- char *
getenv
(const char *name) - int
setenv
(const char *name, char *value, int overwrite) - int
putenv
(const char *string) - int
unsetenv
(const char *name) -
These functions behave similarly to their standard library counterparts.
- struct env_var *
env_getenv
(const char *name) -
Looks up a variable in the environment and returns its entire data structure.
- int
env_setenv
(const char *name, int flags, char *value, ev_sethook_t sethook, ev_unsethook_t unsethook) -
Creates a new or sets an existing environment variable called name. If creating a new variable, the sethook and unsethook arguments may be specified.
The set hook is invoked whenever an attempt is made to set the variable, unless the
EV_NOHOOK
flag is set. Typically a set hook will validate the value argument, and then callenv_setenv
() again withEV_NOHOOK
set to actually save the value. The predefined functionenv_noset
() may be specified to refuse all attempts to set a variable.The unset hook is invoked when an attempt is made to unset a variable. If it returns zero, the variable will be unset. The predefined function
env_nounset
() may be used to prevent a variable being unset.
STANDARD LIBRARY SUPPORT
- int
getopt
(int argc, char * const *argv, const char *optstring) - long
strtol
(const char *nptr, char **endptr, int base) - void
srandom
(unsigned long seed) - unsigned long
random
(void) - char *
strerror
(int error) -
Returns error messages for the subset of errno values supported by
libstand
. assert
(expression)-
Requires
<assert.h>
. - int
setjmp
(jmp_buf env) - void
longjmp
(jmp_buf env, int val) -
Defined as
_setjmp
() and_longjmp
() respectively as there is no signal state to manipulate. Requires<setjmp.h>
.
CHARACTER I/O
- void
gets
(char *buf) -
Read characters from the console into buf. All of the standard cautions apply to this function.
- void
ngets
(char *buf, size_t size) -
Read at most size - 1 characters from the console into buf. If size is less than 1, the function's behaviour is as for
gets
(). - char *
fgets
(char *buf, int size, int fd) -
Read a line of at most size-1 characters into buf. Line terminating characters are not stripped, and the buffer is always nul-terminated. Upon successful completion a pointer to the string is returned. If end-of-file occurs before any characters are read, NULL is returned and the buffer contents remain unchanged. If an error occurs, NULL is returned and the buffer contents are indeterminate.
- int
fgetstr
(char *buf, int size, int fd) -
Read a line of at most size characters into buf. Line terminating characters are stripped, and the buffer is always nul-terminated. Returns the number of characters in buf if successful, or -1 if a read error occurs.
- int
printf
(const char *fmt, ...) - void
vprintf
(const char *fmt, va_list ap) - int
sprintf
(char *buf, const char *fmt, ...) - void
vsprintf
(char *buf, const char *fmt, va_list ap) -
The *printf functions implement a subset of the standard
printf
() family functionality and some extensions. The following standard conversions are supported:c
,d
,n
,o
,p
,s
,u
,x
. The following modifiers are supported:+
,-
,#
,*
,0
,field width
,precision
,l
.
CHARACTER TESTS AND CONVERSIONS
- int
isupper
(int c) - int
islower
(int c) - int
isspace
(int c) - int
isdigit
(int c) - int
isxdigit
(int c) - int
isascii
(int c) - int
isalpha
(int c) - int
toupper
(int c) - int
tolower
(int c)
FILE I/O
- int
open
(const char *path, int flags) -
Similar to the behaviour as specified in open(2), except that file creation is not supported, so the mode parameter is not required. The flags argument may be one of
O_RDONLY
,O_WRONLY
andO_RDWR
(although no filesystems currently support writing). - int
close
(int fd) - void
closeall
(void) -
Close all open files.
- ssize_t
read
(int fd, void *buf, size_t len) - ssize_t
write
(int fd, void *buf, size_t len) -
(No filesystems currently support writing.)
- off_t
lseek
(int fd, off_t offset, int whence) -
Files being automatically uncompressed during reading cannot seek backwards from the current point.
- int
stat
(const char *path, struct stat *sb) - int
fstat
(int fd, struct stat *sb) -
The
stat
() andfstat
() functions only fill out the following fields in the sb structure: st_mode, st_nlink, st_uid, st_gid, st_size. Thetftp
filesystem cannot provide meaningful values for this call, and thecd9660
filesystem always reports files having uid/gid of zero.
PAGER
libstand
supplies a simple internal pager
to ease reading the output of large commands.
- void
pager_open
() -
Initialises the pager and tells it that the next line output will be the top of the display. The environment variable LINES is consulted to determine the number of lines to be displayed before pausing.
- void
pager_close
(void) -
Closes the pager.
- int
pager_output
(char *lines) -
Sends the lines in the nul-terminated buffer at lines to the pager. Newline characters are counted in order to determine the number of lines being output (wrapped lines are not accounted for).
pager_output
() will return zero when all of the lines have been output, or nonzero if the display was paused and the user elected to quit. - int
pager_file
(char *fname) -
Attempts to open and display the file fname. Returns -1 on error, 0 at
EOF
, or 1 if the user elects to quit while reading.
NETWORK
- char *
ether_sprintf
(u_char *ap) -
Convert an ethernet address to its human readable notation as specified in IEEE 802.
MISC
- void
twiddle
(void) -
Successive calls emit the characters in the sequence |, /, -, \ followed by a backspace in order to provide reassurance to the user.
REQUIRED LOW-LEVEL SUPPORT
The following resources are consumed by
libstand
- stack, heap, console and devices.
The stack must be established before
libstand
functions can be invoked. Stack
requirements vary depending on the functions and filesystems used by the
consumer and the support layer functions detailed below.
The heap must be established before calling
alloc
() or
open
() by calling setheap
().
Heap usage will vary depending on the number of simultaneously open files,
as well as client behaviour. Automatic decompression will allocate more than
64K of data per open file.
Console access is performed via the
getchar
(),
putchar
() and
ischar
()
functions detailed below.
Device access is initiated via
devopen
()
and is performed through the
dv_strategy
(),
dv_ioctl
()
and
dv_close
()
functions in the device switch structure that
devopen
() returns.
The consumer must provide the following support functions:
- int
getchar
(void) -
Return a character from the console, used by
gets
(),ngets
() and pager functions. - int
ischar
(void) -
Returns nonzero if a character is waiting from the console.
- void
putchar
(int) -
Write a character to the console, used by
gets
(),ngets
(),*printf
(),panic
() andtwiddle
() and thus by many other functions for debugging and informational output. - int
devopen
(struct open_file *of, const char *name, char **file) -
Open the appropriate device for the file named in name, returning in file a pointer to the remaining body of name which does not refer to the device. The f_dev field in of will be set to point to the devsw structure for the opened device if successful. Device identifiers must always precede the path component, but may otherwise be arbitrarily formatted. Used by
open
() and thus for all device-related I/O. - int
devclose
(struct open_file *of) -
Close the device allocated for of. The device driver itself will already have been called for the close; this call should clean up any allocation made by
devopen
() only. - void
panic
(const char *msg, ...) -
Signal a fatal and unrecoverable error condition. The msg ... arguments are as for
printf
().
INTERNAL FILESYSTEMS
Internal filesystems are enabled by the consumer exporting the
array struct fs_ops *file_system[], which should be
initialised with pointers to struct fs_ops structures.
The following filesystem handlers are supplied by
libstand
, the consumer may supply other filesystems
of their own:
- ufs_fsops
- The BSD UFS(5).
- hammer_fsops
- HAMMER(5) filesystem.
- ext2fs_fsops
- Linux ext2fs filesystem.
- msdos_fsops
- MS-DOS filesystem.
- tftp_fsops
- File access via TFTP.
- nfs_fsops
- File access via NFS.
- cd9660_fsops
- ISO 9660 (CD-ROM) filesystem.
- gzipfs_fsops
- Stacked filesystem supporting gzipped files. When trying the gzipfs
filesystem,
libstand
appends.gz
to the end of the filename, and then tries to locate the file using the other filesystems. Placement of this filesystem in the file_system[] array determines whether gzipped files will be opened in preference to non-gzipped files. It is only possible to seek a gzipped file forwards, andstat
() andfstat
() on gzipped files will report an invalid length. - bzipfs_fsops
- The same as gzipfs_fsops, but for bzip2(1)-compressed files.
The array of struct fs_ops pointers should be terminated with a NULL.
DEVICES
Devices are exported by the supporting code via the array struct devsw *devsw[] which is a NULL terminated array of pointers to device switch structures.
HISTORY
libstand
contains contributions from many
sources, including:
libsa
from NetBSDlibc
andlibkern
from FreeBSD 3.0.zalloc
from Matthew Dillon <dillon@backplane.com>
The reorganisation and port to FreeBSD 3.0, the environment functions and this manpage were written by Mike Smith <msmith@FreeBSD.org>.
BUGS
The lack of detailed memory usage data is unhelpful.