Index: head/stand/libsa/libstand.3
===================================================================
--- head/stand/libsa/libstand.3 (revision 326444)
+++ head/stand/libsa/libstand.3 (revision 326445)
@@ -1,676 +1,676 @@
.\" Copyright (c) Michael Smith
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" $FreeBSD$
.\"
.Dd August 6, 2004
.Dt LIBSTAND 3
.Os
.Sh NAME
.Nm libstand
.Nd support library for standalone executables
.Sh SYNOPSIS
.In stand.h
.Sh DESCRIPTION
The
.Nm
library provides a set of supporting functions for standalone
applications, mimicking where possible the standard
.Bx
programming
environment.
The following sections group these functions by kind.
Unless specifically described here, see the corresponding section 3
manpages for the given functions.
.Sh STRING FUNCTIONS
String functions are available as documented in
.Xr string 3
and
.Xr bstring 3 .
.Sh MEMORY ALLOCATION
.Bl -hang -width 10n
.It Xo
.Ft "void *"
.Fn malloc "size_t size"
.Xc
.Pp
Allocate
.Fa size
bytes of memory from the heap using a best-fit algorithm.
.It Xo
.Ft void
.Fn free "void *ptr"
.Xc
.Pp
Free the allocated object at
.Fa ptr .
.It Xo
.Ft void
.Fn setheap "void *start" "void *limit"
.Xc
.Pp
Initialise the heap.
This function must be called before calling
.Fn alloc
for the first time.
The region between
.Fa start
and
.Fa limit
will be used for the heap; attempting to allocate beyond this will result
in a panic.
.It Xo
.Ft "char *"
.Fn sbrk "int junk"
.Xc
.Pp
Provides the behaviour of
.Fn 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
.Fa junk
argument is ignored.
.El
.Sh 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.
.Bl -hang -width 10n
.It Xo
.Ft "char *"
.Fn getenv "const char *name"
.Xc
.It Xo
.Ft int
.Fn setenv "const char *name" "const char *value" "int overwrite"
.Xc
.It Xo
.Ft int
.Fn putenv "const char *string"
.Xc
.It Xo
.Ft int
.Fn unsetenv "const char *name"
.Xc
.Pp
These functions behave similarly to their standard library counterparts.
.It Xo
.Ft "struct env_var *"
.Fn env_getenv "const char *name"
.Xc
.Pp
Looks up a variable in the environment and returns its entire
data structure.
.It Xo
.Ft int
.Fn env_setenv "const char *name" "int flags" "const void *value" "ev_sethook_t sethook" "ev_unsethook_t unsethook"
.Xc
.Pp
Creates a new or sets an existing environment variable called
.Fa name .
If creating a new variable, the
.Fa sethook
and
.Fa unsethook
arguments may be specified.
.Pp
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
.Fa value
argument, and then call
.Fn env_setenv
again with EV_NOHOOK set to actually save the value.
The predefined function
.Fn env_noset
may be specified to refuse all attempts to set a variable.
.Pp
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
.Fa env_nounset
may be used to prevent a variable being unset.
.El
.Sh STANDARD LIBRARY SUPPORT
.Bl -hang -width 10n
.It Xo
.Ft int
.Fn getopt "int argc" "char * const *argv" "const char *optstring"
.Xc
.It Xo
.Ft long
.Fn strtol "const char *nptr" "char **endptr" "int base"
.Xc
.It Xo
.Ft void
-.Fn srandom "unsigned long seed"
+.Fn srandom "unsigned int seed"
.Xc
.It Xo
-.Ft "unsigned long"
+.Ft "long"
.Fn random void
.Xc
.It Xo
.Ft "char *"
.Fn strerror "int error"
.Xc
.Pp
Returns error messages for the subset of errno values supported by
.Nm .
.It Fn assert expression
.Pp
Requires
.In assert.h .
.It Xo
.Ft int
.Fn setjmp "jmp_buf env"
.Xc
.It Xo
.Ft void
.Fn longjmp "jmp_buf env" "int val"
.Xc
.Pp
Defined as
.Fn _setjmp
and
.Fn _longjmp
respectively as there is no signal state to manipulate.
Requires
.In setjmp.h .
.El
.Sh CHARACTER I/O
.Bl -hang -width 10n
.It Xo
.Ft void
.Fn gets "char *buf"
.Xc
.Pp
Read characters from the console into
.Fa buf .
All of the standard cautions apply to this function.
.It Xo
.Ft void
.Fn ngets "char *buf" "int size"
.Xc
.Pp
Read at most
.Fa size
- 1 characters from the console into
.Fa buf .
If
.Fa size
is less than 1, the function's behaviour is as for
.Fn gets .
.It Xo
.Ft int
.Fn fgetstr "char *buf" "int size" "int fd"
.Xc
.Pp
Read a line of at most
.Fa size
characters into
.Fa buf .
Line terminating characters are stripped, and the buffer is always
.Dv NUL
terminated.
Returns the number of characters in
.Fa buf
if successful, or -1 if a read error occurs.
.It Xo
.Ft int
.Fn printf "const char *fmt" "..."
.Xc
.It Xo
.Ft void
.Fn vprintf "const char *fmt" "va_list ap"
.Xc
.It Xo
.Ft int
.Fn sprintf "char *buf" "const char *fmt" "..."
.Xc
.It Xo
.Ft void
.Fn vsprintf "char *buf" "const char *fmt" "va_list ap"
.Xc
.Pp
The *printf functions implement a subset of the standard
.Fn 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.
.Pp
The
.Li b
conversion is provided to decode error registers.
Its usage is:
.Bd -ragged -offset indent
printf(
.Qq reg=%b\en ,
regval,
.Qq *
);
.Ed
.Pp
where is the output expressed as a control character, e.g.\& \e10 gives
octal, \e20 gives hex.
Each 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
.Bd -ragged -offset indent
printf(
.Qq reg=%b\en ,
3,
.Qq \e10\e2BITTWO\e1BITONE
);
.Ed
.Pp
would give the output
.Bd -ragged -offset indent
reg=3
.Ed
.Pp
The
.Li D
conversion provides a hexdump facility, e.g.
.Bd -ragged -offset indent
printf(
.Qq %6D ,
ptr,
.Qq \&:
); gives
.Qq XX:XX:XX:XX:XX:XX
.Ed
.Bd -ragged -offset indent
printf(
.Qq %*D ,
len,
ptr,
.Qq "\ "
); gives
.Qq XX XX XX ...
.Ed
.El
.Sh CHARACTER TESTS AND CONVERSIONS
.Bl -hang -width 10n
.It Xo
.Ft int
.Fn isupper "int c"
.Xc
.It Xo
.Ft int
.Fn islower "int c"
.Xc
.It Xo
.Ft int
.Fn isspace "int c"
.Xc
.It Xo
.Ft int
.Fn isdigit "int c"
.Xc
.It Xo
.Ft int
.Fn isxdigit "int c"
.Xc
.It Xo
.Ft int
.Fn isascii "int c"
.Xc
.It Xo
.Ft int
.Fn isalpha "int c"
.Xc
.It Xo
.Ft int
.Fn toupper "int c"
.Xc
.It Xo
.Ft int
.Fn tolower "int c"
.Xc
.El
.Sh FILE I/O
.Bl -hang -width 10n
.It Xo
.Ft int
.Fn open "const char *path" "int flags"
.Xc
.Pp
Similar to the behaviour as specified in
.Xr open 2 ,
except that file creation is not supported, so the mode parameter is not
required.
The
.Fa flags
argument may be one of O_RDONLY, O_WRONLY and O_RDWR (although no file systems
currently support writing).
.It Xo
.Ft int
.Fn close "int fd"
.Xc
.It Xo
.Ft void
.Fn closeall void
.Xc
.Pp
Close all open files.
.It Xo
.Ft ssize_t
.Fn read "int fd" "void *buf" "size_t len"
.Xc
.It Xo
.Ft ssize_t
.Fn write "int fd" "void *buf" "size_t len"
.Xc
.Pp
(No file systems currently support writing.)
.It Xo
.Ft off_t
.Fn lseek "int fd" "off_t offset" "int whence"
.Xc
.Pp
Files being automatically uncompressed during reading cannot seek backwards
from the current point.
.It Xo
.Ft int
.Fn stat "const char *path" "struct stat *sb"
.Xc
.It Xo
.Ft int
.Fn fstat "int fd" "struct stat *sb"
.Xc
.Pp
The
.Fn stat
and
.Fn fstat
functions only fill out the following fields in the
.Fa sb
structure: st_mode,st_nlink,st_uid,st_gid,st_size.
The
.Nm tftp
file system cannot provide meaningful values for this call, and the
.Nm cd9660
file system always reports files having uid/gid of zero.
.El
.Sh PAGER
The
.Nm
library supplies a simple internal pager to ease reading the output of large
commands.
.Bl -hang -width 10n
.It Xo
.Ft void
.Fn pager_open
.Xc
.Pp
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.
.It Xo
.Ft void
.Fn pager_close void
.Xc
.Pp
Closes the pager.
.It Xo
.Ft int
.Fn pager_output "const char *lines"
.Xc
.Pp
Sends the lines in the
.Dv NUL Ns
-terminated buffer at
.Fa 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
.Fn 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.
.It Xo
.Ft int
.Fn pager_file "const char *fname"
.Xc
.Pp
Attempts to open and display the file
.Fa fname .
Returns -1 on error, 0 at EOF, or 1 if the user elects to quit while reading.
.El
.Sh MISC
.Bl -hang -width 10n
.It Xo
.Ft void
.Fn twiddle void
.Xc
.Pp
Successive calls emit the characters in the sequence |,/,-,\\ followed by a
backspace in order to provide reassurance to the user.
.El
.Sh REQUIRED LOW-LEVEL SUPPORT
The following resources are consumed by
.Nm
- stack, heap, console and devices.
.Pp
The stack must be established before
.Nm
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.
.Pp
The heap must be established before calling
.Fn alloc
or
.Fn open
by calling
.Fn 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.
.Pp
Console access is performed via the
.Fn getchar ,
.Fn putchar
and
.Fn ischar
functions detailed below.
.Pp
Device access is initiated via
.Fn devopen
and is performed through the
.Fn dv_strategy ,
.Fn dv_ioctl
and
.Fn dv_close
functions in the device switch structure that
.Fn devopen
returns.
.Pp
The consumer must provide the following support functions:
.Bl -hang -width 10n
.It Xo
.Ft int
.Fn getchar void
.Xc
.Pp
Return a character from the console, used by
.Fn gets ,
.Fn ngets
and pager functions.
.It Xo
.Ft int
.Fn ischar void
.Xc
.Pp
Returns nonzero if a character is waiting from the console.
.It Xo
.Ft void
.Fn putchar int
.Xc
.Pp
Write a character to the console, used by
.Fn gets ,
.Fn ngets ,
.Fn *printf ,
.Fn panic
and
.Fn twiddle
and thus by many other functions for debugging and informational output.
.It Xo
.Ft int
.Fn devopen "struct open_file *of" "const char *name" "const char **file"
.Xc
.Pp
Open the appropriate device for the file named in
.Fa name ,
returning in
.Fa file
a pointer to the remaining body of
.Fa name
which does not refer to the device.
The
.Va f_dev
field in
.Fa of
will be set to point to the
.Vt devsw
structure for the opened device if successful.
Device identifiers must
always precede the path component, but may otherwise be arbitrarily formatted.
Used by
.Fn open
and thus for all device-related I/O.
.It Xo
.Ft int
.Fn devclose "struct open_file *of"
.Xc
.Pp
Close the device allocated for
.Fa of .
The device driver itself will already have been called for the close; this call
should clean up any allocation made by devopen only.
.It Xo
.Ft void
.Fn panic "const char *msg" "..."
.Xc
.Pp
Signal a fatal and unrecoverable error condition.
The
.Fa msg ...
arguments are as for
.Fn printf .
.El
.Sh INTERNAL FILE SYSTEMS
Internal file systems are enabled by the consumer exporting the array
.Vt struct fs_ops *file_system[] ,
which should be initialised with pointers
to
.Vt struct fs_ops
structures.
The following file system handlers are supplied by
.Nm ,
the consumer may supply other file systems of their own:
.Bl -hang -width ".Va cd9660_fsops"
.It Va ufs_fsops
The
.Bx
UFS.
.It Va ext2fs_fsops
Linux ext2fs file system.
.It Va tftp_fsops
File access via TFTP.
.It Va nfs_fsops
File access via NFS.
.It Va cd9660_fsops
ISO 9660 (CD-ROM) file system.
.It Va gzipfs_fsops
Stacked file system supporting gzipped files.
When trying the gzipfs file system,
.Nm
appends
.Li .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
.Va 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
.Fn stat
and
.Fn fstat
on gzipped files will report an invalid length.
.It Va bzipfs_fsops
The same as
.Va gzipfs_fsops ,
but for
.Xr bzip2 1 Ns -compressed
files.
.El
.Pp
The array of
.Vt struct fs_ops
pointers should be terminated with a NULL.
.Sh DEVICES
Devices are exported by the supporting code via the array
.Vt struct devsw *devsw[]
which is a NULL terminated array of pointers to device switch structures.
.Sh HISTORY
The
.Nm
library contains contributions from many sources, including:
.Bl -bullet -compact
.It
.Nm libsa
from
.Nx
.It
.Nm libc
and
.Nm libkern
from
.Fx 3.0 .
.It
.Nm zalloc
from
.An Matthew Dillon Aq Mt dillon@backplane.com
.El
.Pp
The reorganisation and port to
.Fx 3.0 ,
the environment functions and this manpage were written by
.An Mike Smith Aq Mt msmith@FreeBSD.org .
.Sh BUGS
The lack of detailed memory usage data is unhelpful.
Index: head/stand/libsa/random.c
===================================================================
--- head/stand/libsa/random.c (revision 326444)
+++ head/stand/libsa/random.c (revision 326445)
@@ -1,70 +1,70 @@
/*-
* Copyright (c) 1992, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)random.c 8.1 (Berkeley) 6/10/93
*/
#include
__FBSDID("$FreeBSD$");
#include
-static u_long randseed = 1;
+static long randseed = 1;
void
-srandom(seed)
- u_long seed;
+srandom(unsigned int seed)
{
+
randseed = seed;
}
/*
* Pseudo-random number generator for randomizing the profiling clock,
* and whatever else we might use it for. The result is uniform on
* [0, 2^31 - 1].
*/
-u_long
-random()
+long
+random(void)
{
long x, hi, lo, t;
/*
* Compute x[n + 1] = (7^5 * x[n]) mod (2^31 - 1).
* From "Random number generators: good ones are hard to find",
* Park and Miller, Communications of the ACM, vol. 31, no. 10,
* October 1988, p. 1195.
*/
x = randseed;
hi = x / 127773;
lo = x % 127773;
t = 16807 * lo - 2836 * hi;
if (t <= 0)
t += 0x7fffffff;
randseed = t;
return (t);
}
Index: head/stand/libsa/stand.h
===================================================================
--- head/stand/libsa/stand.h (revision 326444)
+++ head/stand/libsa/stand.h (revision 326445)
@@ -1,426 +1,426 @@
/*
* Copyright (c) 1998 Michael Smith.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
* From $NetBSD: stand.h,v 1.22 1997/06/26 19:17:40 drochner Exp $
*/
/*-
* Copyright (c) 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)stand.h 8.1 (Berkeley) 6/11/93
*/
#ifndef STAND_H
#define STAND_H
#include
#include
#include
#include
/* this header intentionally exports NULL from */
#include
#define CHK(fmt, args...) printf("%s(%d): " fmt "\n", __func__, __LINE__ , ##args)
#define PCHK(fmt, args...) {printf("%s(%d): " fmt "\n", __func__, __LINE__ , ##args); getchar();}
/* Avoid unwanted userlandish components */
#define _KERNEL
#include
#undef _KERNEL
/* special stand error codes */
#define EADAPT (ELAST+1) /* bad adaptor */
#define ECTLR (ELAST+2) /* bad controller */
#define EUNIT (ELAST+3) /* bad unit */
#define ESLICE (ELAST+4) /* bad slice */
#define EPART (ELAST+5) /* bad partition */
#define ERDLAB (ELAST+6) /* can't read disk label */
#define EUNLAB (ELAST+7) /* unlabeled disk */
#define EOFFSET (ELAST+8) /* relative seek not supported */
#define ESALAST (ELAST+8) /* */
struct open_file;
/*
* This structure is used to define file system operations in a file system
* independent way.
*
* XXX note that filesystem providers should export a pointer to their fs_ops
* struct, so that consumers can reference this and thus include the
* filesystems that they require.
*/
struct fs_ops {
const char *fs_name;
int (*fo_open)(const char *path, struct open_file *f);
int (*fo_close)(struct open_file *f);
int (*fo_read)(struct open_file *f, void *buf,
size_t size, size_t *resid);
int (*fo_write)(struct open_file *f, void *buf,
size_t size, size_t *resid);
off_t (*fo_seek)(struct open_file *f, off_t offset, int where);
int (*fo_stat)(struct open_file *f, struct stat *sb);
int (*fo_readdir)(struct open_file *f, struct dirent *d);
};
/*
* libstand-supplied filesystems
*/
extern struct fs_ops ufs_fsops;
extern struct fs_ops tftp_fsops;
extern struct fs_ops nfs_fsops;
extern struct fs_ops cd9660_fsops;
extern struct fs_ops nandfs_fsops;
extern struct fs_ops gzipfs_fsops;
extern struct fs_ops bzipfs_fsops;
extern struct fs_ops dosfs_fsops;
extern struct fs_ops ext2fs_fsops;
extern struct fs_ops splitfs_fsops;
extern struct fs_ops pkgfs_fsops;
/* where values for lseek(2) */
#define SEEK_SET 0 /* set file offset to offset */
#define SEEK_CUR 1 /* set file offset to current plus offset */
#define SEEK_END 2 /* set file offset to EOF plus offset */
/*
* Device switch
*/
struct devsw {
const char dv_name[8];
int dv_type; /* opaque type constant, arch-dependant */
int (*dv_init)(void); /* early probe call */
int (*dv_strategy)(void *devdata, int rw, daddr_t blk,
size_t size, char *buf, size_t *rsize);
int (*dv_open)(struct open_file *f, ...);
int (*dv_close)(struct open_file *f);
int (*dv_ioctl)(struct open_file *f, u_long cmd, void *data);
int (*dv_print)(int verbose); /* print device information */
void (*dv_cleanup)(void);
};
/*
* libstand-supplied device switch
*/
extern struct devsw netdev;
extern int errno;
/*
* Generic device specifier; architecture-dependent
* versions may be larger, but should be allowed to
* overlap.
*/
struct devdesc
{
struct devsw *d_dev;
int d_type;
#define DEVT_NONE 0
#define DEVT_DISK 1
#define DEVT_NET 2
#define DEVT_CD 3
#define DEVT_ZFS 4
#define DEVT_FD 5
int d_unit;
void *d_opendata;
};
struct open_file {
int f_flags; /* see F_* below */
struct devsw *f_dev; /* pointer to device operations */
void *f_devdata; /* device specific data */
struct fs_ops *f_ops; /* pointer to file system operations */
void *f_fsdata; /* file system specific data */
off_t f_offset; /* current file offset */
char *f_rabuf; /* readahead buffer pointer */
size_t f_ralen; /* valid data in readahead buffer */
off_t f_raoffset; /* consumer offset in readahead buffer */
#define SOPEN_RASIZE 512
};
#define SOPEN_MAX 64
extern struct open_file files[];
/* f_flags values */
#define F_READ 0x0001 /* file opened for reading */
#define F_WRITE 0x0002 /* file opened for writing */
#define F_RAW 0x0004 /* raw device open - no file system */
#define F_NODEV 0x0008 /* network open - no device */
#define F_MASK 0xFFFF
/* Mode modifier for strategy() */
#define F_NORA (0x01 << 16) /* Disable Read-Ahead */
#define isascii(c) (((c) & ~0x7F) == 0)
static __inline int isupper(int c)
{
return c >= 'A' && c <= 'Z';
}
static __inline int islower(int c)
{
return c >= 'a' && c <= 'z';
}
static __inline int isspace(int c)
{
return c == ' ' || (c >= 0x9 && c <= 0xd);
}
static __inline int isdigit(int c)
{
return c >= '0' && c <= '9';
}
static __inline int isxdigit(int c)
{
return isdigit(c) || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F');
}
static __inline int isalpha(int c)
{
return isupper(c) || islower(c);
}
static __inline int isalnum(int c)
{
return isalpha(c) || isdigit(c);
}
static __inline int toupper(int c)
{
return islower(c) ? c - 'a' + 'A' : c;
}
static __inline int tolower(int c)
{
return isupper(c) ? c - 'A' + 'a' : c;
}
/* sbrk emulation */
extern void setheap(void *base, void *top);
extern char *sbrk(int incr);
/* Matt Dillon's zalloc/zmalloc */
extern void *malloc(size_t bytes);
extern void free(void *ptr);
/*#define free(p) {CHK("free %p", p); free(p);} */ /* use for catching guard violations */
extern void *calloc(size_t n1, size_t n2);
extern void *realloc(void *ptr, size_t size);
extern void *reallocf(void *ptr, size_t size);
extern void mallocstats(void);
extern int printf(const char *fmt, ...) __printflike(1, 2);
extern void vprintf(const char *fmt, __va_list);
extern int sprintf(char *buf, const char *cfmt, ...) __printflike(2, 3);
extern int snprintf(char *buf, size_t size, const char *cfmt, ...) __printflike(3, 4);
extern void vsprintf(char *buf, const char *cfmt, __va_list);
extern void twiddle(u_int callerdiv);
extern void twiddle_divisor(u_int globaldiv);
extern void ngets(char *, int);
#define gets(x) ngets((x), 0)
extern int fgetstr(char *buf, int size, int fd);
extern int open(const char *, int);
#define O_RDONLY 0x0
#define O_WRONLY 0x1
#define O_RDWR 0x2
extern int close(int);
extern void closeall(void);
extern ssize_t read(int, void *, size_t);
extern ssize_t write(int, void *, size_t);
extern struct dirent *readdirfd(int);
-extern void srandom(u_long seed);
+extern void srandom(unsigned int);
extern u_long random(void);
/* imports from stdlib, locally modified */
extern long strtol(const char *, char **, int);
extern unsigned long strtoul(const char *, char **, int);
extern char *optarg; /* getopt(3) external variables */
extern int optind, opterr, optopt, optreset;
extern int getopt(int, char * const [], const char *);
/* pager.c */
extern void pager_open(void);
extern void pager_close(void);
extern int pager_output(const char *lines);
extern int pager_file(const char *fname);
/* No signal state to preserve */
#define setjmp _setjmp
#define longjmp _longjmp
/* environment.c */
#define EV_DYNAMIC (1<<0) /* value was dynamically allocated, free if changed/unset */
#define EV_VOLATILE (1<<1) /* value is volatile, make a copy of it */
#define EV_NOHOOK (1<<2) /* don't call hook when setting */
struct env_var;
typedef char *(ev_format_t)(struct env_var *ev);
typedef int (ev_sethook_t)(struct env_var *ev, int flags,
const void *value);
typedef int (ev_unsethook_t)(struct env_var *ev);
struct env_var
{
char *ev_name;
int ev_flags;
void *ev_value;
ev_sethook_t *ev_sethook;
ev_unsethook_t *ev_unsethook;
struct env_var *ev_next, *ev_prev;
};
extern struct env_var *environ;
extern struct env_var *env_getenv(const char *name);
extern int env_setenv(const char *name, int flags,
const void *value, ev_sethook_t sethook,
ev_unsethook_t unsethook);
extern char *getenv(const char *name);
extern int setenv(const char *name, const char *value,
int overwrite);
extern int putenv(const char *string);
extern int unsetenv(const char *name);
extern ev_sethook_t env_noset; /* refuse set operation */
extern ev_unsethook_t env_nounset; /* refuse unset operation */
/* BCD conversions (undocumented) */
extern u_char const bcd2bin_data[];
extern u_char const bin2bcd_data[];
extern char const hex2ascii_data[];
#define bcd2bin(bcd) (bcd2bin_data[bcd])
#define bin2bcd(bin) (bin2bcd_data[bin])
#define hex2ascii(hex) (hex2ascii_data[hex])
/* min/max (undocumented) */
static __inline int imax(int a, int b) { return (a > b ? a : b); }
static __inline int imin(int a, int b) { return (a < b ? a : b); }
static __inline long lmax(long a, long b) { return (a > b ? a : b); }
static __inline long lmin(long a, long b) { return (a < b ? a : b); }
static __inline u_int max(u_int a, u_int b) { return (a > b ? a : b); }
static __inline u_int min(u_int a, u_int b) { return (a < b ? a : b); }
static __inline quad_t qmax(quad_t a, quad_t b) { return (a > b ? a : b); }
static __inline quad_t qmin(quad_t a, quad_t b) { return (a < b ? a : b); }
static __inline u_long ulmax(u_long a, u_long b) { return (a > b ? a : b); }
static __inline u_long ulmin(u_long a, u_long b) { return (a < b ? a : b); }
/* null functions for device/filesystem switches (undocumented) */
extern int nodev(void);
extern int noioctl(struct open_file *, u_long, void *);
extern void nullsys(void);
extern int null_open(const char *path, struct open_file *f);
extern int null_close(struct open_file *f);
extern int null_read(struct open_file *f, void *buf, size_t size, size_t *resid);
extern int null_write(struct open_file *f, void *buf, size_t size, size_t *resid);
extern off_t null_seek(struct open_file *f, off_t offset, int where);
extern int null_stat(struct open_file *f, struct stat *sb);
extern int null_readdir(struct open_file *f, struct dirent *d);
/*
* Machine dependent functions and data, must be provided or stubbed by
* the consumer
*/
extern void exit(int);
extern int getchar(void);
extern int ischar(void);
extern void putchar(int);
extern int devopen(struct open_file *, const char *, const char **);
extern int devclose(struct open_file *f);
extern void panic(const char *, ...) __dead2 __printflike(1, 2);
extern struct fs_ops *file_system[];
extern struct fs_ops *exclusive_file_system;
extern struct devsw *devsw[];
/*
* Expose byteorder(3) functions.
*/
#ifndef _BYTEORDER_PROTOTYPED
#define _BYTEORDER_PROTOTYPED
extern uint32_t htonl(uint32_t);
extern uint16_t htons(uint16_t);
extern uint32_t ntohl(uint32_t);
extern uint16_t ntohs(uint16_t);
#endif
#ifndef _BYTEORDER_FUNC_DEFINED
#define _BYTEORDER_FUNC_DEFINED
#define htonl(x) __htonl(x)
#define htons(x) __htons(x)
#define ntohl(x) __ntohl(x)
#define ntohs(x) __ntohs(x)
#endif
void *Malloc(size_t, const char *, int);
void *Calloc(size_t, size_t, const char *, int);
void *Realloc(void *, size_t, const char *, int);
void Free(void *, const char *, int);
#if 1
#define malloc(x) Malloc(x, __FILE__, __LINE__)
#define calloc(x, y) Calloc(x, y, __FILE__, __LINE__)
#define free(x) Free(x, __FILE__, __LINE__)
#define realloc(x, y) Realloc(x, y, __FILE__, __LINE__)
#else
#define malloc(x) Malloc(x, NULL, 0)
#define calloc(x, y) Calloc(x, y, NULL, 0)
#define free(x) Free(x, NULL, 0)
#define realloc(x, y) Realloc(x, y, NULL, 0)
#endif
#endif /* STAND_H */