LIBSTAND(3) | MidnightBSD Library Functions Manual | LIBSTAND(3) |
libstand
— support
library for standalone executables
#include
<stand.h>
The libstand
library 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 are available as documented in string(3) and bstring(3).
malloc
(size_t
size)Allocate size bytes of memory from the heap using a best-fit algorithm.
free
(void
*ptr)Free the allocated object at ptr.
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.
sbrk
(int junk)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
junk argument is ignored.
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.
getenv
(const char *name)setenv
(const char *name,
const char *value, int
overwrite)putenv
(const char
*string)unsetenv
(const char
*name)These functions behave similarly to their standard library counterparts.
env_getenv
(const char
*name)Looks up a variable in the environment and returns its entire data structure.
env_setenv
(const char *name,
int flags, const void *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 call
env_setenv
() again with EV_NOHOOK set to
actually save the value. The predefined function
env_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.
getopt
(int
argc, char * const *argv, const
char *optstring)strtol
(const
char *nptr, char **endptr, int
base)srandom
(unsigned
long seed)random
(void)strerror
(int
error)Returns error messages for the subset of errno values
supported by libstand
.
assert
(expression)Requires
<assert.h>
.
setjmp
(jmp_buf
env)longjmp
(jmp_buf
env, int val)Defined as
_setjmp
()
and
_longjmp
()
respectively as there is no signal state to manipulate. Requires
<setjmp.h>
.
gets
(char *buf)Read characters from the console into buf. All of the standard cautions apply to this function.
ngets
(char
*buf, int 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
().
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.
printf
(const
char *fmt, ...)vprintf
(const
char *fmt, va_list ap)sprintf
(char
*buf, const char *fmt,
...)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.
The b
conversion is provided to decode
error registers. Its usage is:
where <base> is the output expressed as a control character, e.g. \10 gives octal, \20 gives hex. Each <arg> is a sequence of characters, the first of which gives the bit number to be inspected (origin 1) and the next characters (up to a character less than 32) give the text to be displayed if the bit is set. Thus
would give the output
The D
conversion provides a hexdump
facility, e.g.
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 and O_RDWR (although no file systems currently support writing).
close
(int
fd)closeall
(void)Close all open files.
read
(int
fd, void *buf, size_t
len)write
(int
fd, void *buf, size_t
len)(No file systems currently support writing.)
lseek
(int
fd, off_t offset, int
whence)Files being automatically uncompressed during reading cannot seek backwards from the current point.
stat
(const
char *path, struct stat *sb)fstat
(int
fd, struct stat *sb)The
stat
()
and
fstat
()
functions only fill out the following fields in the
sb structure:
st_mode,st_nlink,st_uid,st_gid,st_size. The tftp
file system cannot provide meaningful values for this call, and the
cd9660
file system always reports files having
uid/gid of zero.
The libstand
library supplies a simple
internal pager to ease reading the output of large commands.
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.
pager_close
(void)Closes the pager.
pager_output
(const
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). The
pager_output
()
function will return zero when all of the lines have been output, or
nonzero if the display was paused and the user elected to quit.
pager_file
(const
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.
twiddle
(void)Successive calls emit the characters in the sequence |,/,-,\ followed by a backspace in order to provide reassurance to the user.
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 file systems 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:
getchar
(void)Return a character from the console, used by
gets
(),
ngets
() and pager functions.
ischar
(void)Returns nonzero if a character is waiting from the console.
putchar
(int)Write a character to the console, used by
gets
(),
ngets
(),
*printf
(),
panic
() and twiddle
()
and thus by many other functions for debugging and informational
output.
devopen
(struct open_file *of,
const char *name, const 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.
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.
panic
(const
char *msg, ...)Signal a fatal and unrecoverable error
condition. The msg ... arguments are as for
printf
().
Internal file systems 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 file system handlers are supplied by
libstand
, the consumer may supply other file systems
of their own:
libstand
appends
.gz
to the end of the filename, and then tries to
locate the file using the other file systems. Placement of this file
system 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, and
stat
() and fstat
() on
gzipped files will report an invalid length.The array of struct fs_ops pointers should be terminated with a NULL.
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.
The libstand
library contains
contributions from many sources, including:
libsa
from NetBSDlibc
and libkern
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⟩.
The lack of detailed memory usage data is unhelpful.
August 6, 2004 | midnightbsd-3.1 |