stand.h revision 97776
1190207Srpaulo/* 2190207Srpaulo * Copyright (c) 1998 Michael Smith. 317680Spst * All rights reserved. 439297Sfenner * 517680Spst * Redistribution and use in source and binary forms, with or without 617680Spst * modification, are permitted provided that the following conditions 7146773Ssam * are met: 8146773Ssam * 1. Redistributions of source code must retain the above copyright 917680Spst * notice, this list of conditions and the following disclaimer. 1017680Spst * 2. Redistributions in binary form must reproduce the above copyright 1117680Spst * notice, this list of conditions and the following disclaimer in the 1217680Spst * documentation and/or other materials provided with the distribution. 1317680Spst * 1417680Spst * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1517680Spst * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1617680Spst * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1717680Spst * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1817680Spst * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1917680Spst * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2017680Spst * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2117680Spst * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2217680Spst * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2317680Spst * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2417680Spst * SUCH DAMAGE. 2517680Spst * 2617680Spst * $FreeBSD: head/lib/libstand/stand.h 97776 2002-06-03 19:04:10Z sobomax $ 27127668Sbms * From $NetBSD: stand.h,v 1.22 1997/06/26 19:17:40 drochner Exp $ 28190207Srpaulo */ 29190207Srpaulo 30190207Srpaulo/*- 3117680Spst * Copyright (c) 1993 3217680Spst * The Regents of the University of California. All rights reserved. 3356893Sfenner * 3456893Sfenner * Redistribution and use in source and binary forms, with or without 3556893Sfenner * modification, are permitted provided that the following conditions 3656893Sfenner * are met: 37127668Sbms * 1. Redistributions of source code must retain the above copyright 3817680Spst * notice, this list of conditions and the following disclaimer. 3917680Spst * 2. Redistributions in binary form must reproduce the above copyright 4017680Spst * notice, this list of conditions and the following disclaimer in the 4117680Spst * documentation and/or other materials provided with the distribution. 4217680Spst * 3. All advertising materials mentioning features or use of this software 4317680Spst * must display the following acknowledgement: 4417680Spst * This product includes software developed by the University of 4517680Spst * California, Berkeley and its contributors. 4617680Spst * 4. Neither the name of the University nor the names of its contributors 4775115Sfenner * may be used to endorse or promote products derived from this software 4875115Sfenner * without specific prior written permission. 4975115Sfenner * 5075115Sfenner * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 5175115Sfenner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 5275115Sfenner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 53127668Sbms * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 54146773Ssam * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 55146773Ssam * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 5675115Sfenner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 5798524Sfenner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 5898524Sfenner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 59146773Ssam * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 60146773Ssam * SUCH DAMAGE. 61146773Ssam * 62146773Ssam * @(#)stand.h 8.1 (Berkeley) 6/11/93 63146773Ssam */ 64146773Ssam 65146773Ssam#include <sys/types.h> 66146773Ssam#include <sys/cdefs.h> 67190207Srpaulo#include <sys/stat.h> 68146773Ssam#include <sys/dirent.h> 69146773Ssam#include <string.h> 7075115Sfenner 7175115Sfenner#define CHK(fmt, args...) printf("%s(%d): " fmt "\n", __FUNCTION__, __LINE__ , ##args) 7275115Sfenner#define PCHK(fmt, args...) {printf("%s(%d): " fmt "\n", __FUNCTION__, __LINE__ , ##args); getchar();} 7375115Sfenner 7417680Spst#ifndef NULL 7517680Spst#define NULL 0 7656893Sfenner#endif 77190207Srpaulo 78190207Srpaulo/* Avoid unwanted userlandish components */ 7956893Sfenner#define _KERNEL 80190207Srpaulo#include <sys/errno.h> 81190207Srpaulo#undef _KERNEL 8256893Sfenner 83190207Srpaulo/* special stand error codes */ 8417680Spst#define EADAPT (ELAST+1) /* bad adaptor */ 8517680Spst#define ECTLR (ELAST+2) /* bad controller */ 8617680Spst#define EUNIT (ELAST+3) /* bad unit */ 87190207Srpaulo#define ESLICE (ELAST+4) /* bad slice */ 88190207Srpaulo#define EPART (ELAST+5) /* bad partition */ 89190207Srpaulo#define ERDLAB (ELAST+6) /* can't read disk label */ 90190207Srpaulo#define EUNLAB (ELAST+7) /* unlabeled disk */ 9117680Spst#define EOFFSET (ELAST+8) /* relative seek not supported */ 9217680Spst#define ESALAST (ELAST+8) /* */ 9317680Spst 9417680Spststruct open_file; 9517680Spst 9617680Spst/* 9717680Spst * This structure is used to define file system operations in a file system 9817680Spst * independent way. 9917680Spst * 100190207Srpaulo * XXX note that filesystem providers should export a pointer to their fs_ops 101190207Srpaulo * struct, so that consumers can reference this and thus include the 102190207Srpaulo * filesystems that they require. 103190207Srpaulo */ 104190207Srpaulostruct fs_ops { 105190207Srpaulo const char *fs_name; 106190207Srpaulo int (*fo_open)(const char *path, struct open_file *f); 107190207Srpaulo int (*fo_close)(struct open_file *f); 108190207Srpaulo int (*fo_read)(struct open_file *f, void *buf, 109190207Srpaulo size_t size, size_t *resid); 110190207Srpaulo int (*fo_write)(struct open_file *f, void *buf, 11117680Spst size_t size, size_t *resid); 112190207Srpaulo off_t (*fo_seek)(struct open_file *f, off_t offset, int where); 113190207Srpaulo int (*fo_stat)(struct open_file *f, struct stat *sb); 114190207Srpaulo int (*fo_readdir)(struct open_file *f, struct dirent *d); 115190207Srpaulo}; 116190207Srpaulo 117190207Srpaulo/* 118190207Srpaulo * libstand-supplied filesystems 119190207Srpaulo */ 120190207Srpauloextern struct fs_ops ufs_fsops; 121190207Srpauloextern struct fs_ops tftp_fsops; 122190207Srpauloextern struct fs_ops nfs_fsops; 123190207Srpauloextern struct fs_ops cd9660_fsops; 124190207Srpauloextern struct fs_ops zipfs_fsops; 125190207Srpauloextern struct fs_ops bzipfs_fsops; 126190207Srpauloextern struct fs_ops dosfs_fsops; 127190207Srpauloextern struct fs_ops ext2fs_fsops; 128190207Srpauloextern struct fs_ops splitfs_fsops; 12956893Sfenner 13075115Sfenner/* where values for lseek(2) */ 13175115Sfenner#define SEEK_SET 0 /* set file offset to offset */ 132127668Sbms#define SEEK_CUR 1 /* set file offset to current plus offset */ 13375115Sfenner#define SEEK_END 2 /* set file offset to EOF plus offset */ 134190207Srpaulo 135190207Srpaulo/* 136190207Srpaulo * Device switch 137190207Srpaulo */ 138190207Srpaulostruct devsw { 139190207Srpaulo const char dv_name[8]; 140190207Srpaulo int dv_type; /* opaque type constant, arch-dependant */ 141190207Srpaulo int (*dv_init)(void); /* early probe call */ 142190207Srpaulo int (*dv_strategy)(void *devdata, int rw, daddr_t blk, size_t size, 143190207Srpaulo char *buf, size_t *rsize); 144190207Srpaulo int (*dv_open)(struct open_file *f, ...); 14575115Sfenner int (*dv_close)(struct open_file *f); 146190207Srpaulo int (*dv_ioctl)(struct open_file *f, u_long cmd, void *data); 147190207Srpaulo void (*dv_print)(int verbose); /* print device information */ 148190207Srpaulo void (*dv_cleanup)(void); 149190207Srpaulo}; 150190207Srpaulo 151190207Srpaulo/* 152190207Srpaulo * libstand-supplied device switch 153190207Srpaulo */ 154190207Srpauloextern struct devsw netdev; 15575115Sfenner 156190207Srpauloextern int errno; 157190207Srpaulo 158190207Srpaulostruct open_file { 15975115Sfenner int f_flags; /* see F_* below */ 16075115Sfenner struct devsw *f_dev; /* pointer to device operations */ 16175115Sfenner void *f_devdata; /* device specific data */ 16275115Sfenner struct fs_ops *f_ops; /* pointer to file system operations */ 163190207Srpaulo void *f_fsdata; /* file system specific data */ 16475115Sfenner off_t f_offset; /* current file offset */ 165190207Srpaulo char *f_rabuf; /* readahead buffer pointer */ 166190207Srpaulo size_t f_ralen; /* valid data in readahead buffer */ 167190207Srpaulo off_t f_raoffset; /* consumer offset in readahead buffer */ 168190207Srpaulo#define SOPEN_RASIZE 512 169190207Srpaulo}; 170190207Srpaulo 171190207Srpaulo#define SOPEN_MAX 8 172190207Srpauloextern struct open_file files[]; 173190207Srpaulo 174190207Srpaulo/* f_flags values */ 175190207Srpaulo#define F_READ 0x0001 /* file opened for reading */ 176190207Srpaulo#define F_WRITE 0x0002 /* file opened for writing */ 17775115Sfenner#define F_RAW 0x0004 /* raw device open - no file system */ 178190207Srpaulo#define F_NODEV 0x0008 /* network open - no device */ 179190207Srpaulo 180190207Srpaulo#define isascii(c) (((c) & ~0x7F) == 0) 181190207Srpaulo 182190207Srpaulostatic __inline int isupper(int c) 183190207Srpaulo{ 18475115Sfenner return c >= 'A' && c <= 'Z'; 185190207Srpaulo} 186190207Srpaulo 18775115Sfennerstatic __inline int islower(int c) 188190207Srpaulo{ 18975115Sfenner return c >= 'a' && c <= 'z'; 19075115Sfenner} 19175115Sfenner 19217680Spststatic __inline int isspace(int c) 19317680Spst{ 19475115Sfenner return c == ' ' || (c >= 0x9 && c <= 0xd); 19517680Spst} 196190207Srpaulo 197190207Srpaulostatic __inline int isdigit(int c) 198190207Srpaulo{ 199190207Srpaulo return c >= '0' && c <= '9'; 200190207Srpaulo} 201190207Srpaulo 202190207Srpaulostatic __inline int isxdigit(int c) 203190207Srpaulo{ 20456893Sfenner return isdigit(c) || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'); 205190207Srpaulo} 20656893Sfenner 20717680Spststatic __inline int isalpha(int c) 208190207Srpaulo{ 209190207Srpaulo return isupper(c) || islower(c); 21056893Sfenner} 211190207Srpaulo 212190207Srpaulostatic __inline int isalnum(int c) 213190207Srpaulo{ 214190207Srpaulo return isalpha(c) || isdigit(c); 21556893Sfenner} 216190207Srpaulo 217190207Srpaulostatic __inline int toupper(int c) 218190207Srpaulo{ 219190207Srpaulo return islower(c) ? c - 'a' + 'A' : c; 220190207Srpaulo} 221190207Srpaulo 222190207Srpaulostatic __inline int tolower(int c) 22317680Spst{ 224190207Srpaulo return isupper(c) ? c - 'A' + 'a' : c; 225190207Srpaulo} 22656893Sfenner 227190207Srpaulo/* sbrk emulation */ 22875115Sfennerextern void setheap(void *base, void *top); 229190207Srpauloextern char *sbrk(int incr); 230146773Ssam 231146773Ssam/* Matt Dillon's zalloc/zmalloc */ 23275115Sfennerextern void *malloc(size_t bytes); 23375115Sfennerextern void free(void *ptr); 23475115Sfenner/*#define free(p) {CHK("free %p", p); free(p);} */ /* use for catching guard violations */ 235190207Srpauloextern void *calloc(size_t n1, size_t n2); 236190207Srpauloextern void *realloc(void *ptr, size_t size); 237190207Srpauloextern void *reallocf(void *ptr, size_t size); 238190207Srpauloextern void mallocstats(void); 239190207Srpaulo#ifdef __alpha__ 240190207Srpauloextern void free_region(void *start, void *end); 241190207Srpaulo#endif 242190207Srpaulo 243190207Srpaulo/* disklabel support (undocumented, may be junk) */ 244190207Srpaulostruct disklabel; 245190207Srpauloextern char *getdisklabel(const char *, struct disklabel *); 246190207Srpaulo 247190207Srpauloextern int printf(const char *fmt, ...); 248190207Srpauloextern void vprintf(const char *fmt, _BSD_VA_LIST_); 249190207Srpauloextern int sprintf(char *buf, const char *cfmt, ...); 250190207Srpauloextern void vsprintf(char *buf, const char *cfmt, _BSD_VA_LIST_); 251190207Srpaulo 252190207Srpauloextern void twiddle(void); 253190207Srpaulo 254190207Srpauloextern void ngets(char *, int); 255190207Srpaulo#define gets(x) ngets((x), 0) 256190207Srpauloextern int fgetstr(char *buf, int size, int fd); 257190207Srpaulo 258190207Srpauloextern int open(const char *, int); 259190207Srpaulo#define O_RDONLY 0x0 260190207Srpaulo#define O_WRONLY 0x1 261190207Srpaulo#define O_RDWR 0x2 262190207Srpauloextern int close(int); 263190207Srpauloextern void closeall(void); 264190207Srpauloextern ssize_t read(int, void *, size_t); 26556893Sfennerextern ssize_t write(int, void *, size_t); 266190207Srpauloextern struct dirent *readdirfd(int); 267190207Srpaulo 268190207Srpauloextern void srandom(u_long seed); 269190207Srpauloextern u_long random(void); 270190207Srpaulo 271190207Srpaulo/* imports from stdlib, locally modified */ 272190207Srpauloextern long strtol(const char *, char **, int); 273190207Srpauloextern char *optarg; /* getopt(3) external variables */ 274190207Srpauloextern int optind, opterr, optopt, optreset; 275190207Srpauloextern int getopt(int, char * const [], const char *); 276190207Srpaulo 277190207Srpaulo/* pager.c */ 27856893Sfennerextern void pager_open(void); 279190207Srpauloextern void pager_close(void); 280190207Srpauloextern int pager_output(const char *lines); 281190207Srpauloextern int pager_file(const char *fname); 282190207Srpaulo 283190207Srpaulo/* No signal state to preserve */ 284190207Srpaulo#define setjmp _setjmp 285190207Srpaulo#define longjmp _longjmp 286190207Srpaulo 287190207Srpaulo/* environment.c */ 288190207Srpaulo#define EV_DYNAMIC (1<<0) /* value was dynamically allocated, free if changed/unset */ 289190207Srpaulo#define EV_VOLATILE (1<<1) /* value is volatile, make a copy of it */ 290190207Srpaulo#define EV_NOHOOK (1<<2) /* don't call hook when setting */ 29156893Sfenner 292190207Srpaulostruct env_var; 293190207Srpaulotypedef char *(ev_format_t)(struct env_var *ev); 294190207Srpaulotypedef int (ev_sethook_t)(struct env_var *ev, int flags, void *value); 295190207Srpaulotypedef int (ev_unsethook_t)(struct env_var *ev); 296190207Srpaulo 297146773Ssamstruct env_var 298190207Srpaulo{ 29956893Sfenner char *ev_name; 300190207Srpaulo int ev_flags; 301190207Srpaulo void *ev_value; 302190207Srpaulo ev_sethook_t *ev_sethook; 303190207Srpaulo ev_unsethook_t *ev_unsethook; 30417680Spst struct env_var *ev_next, *ev_prev; 305190207Srpaulo}; 306190207Srpauloextern struct env_var *environ; 307190207Srpaulo 308190207Srpauloextern struct env_var *env_getenv(const char *name); 309190207Srpauloextern int env_setenv(const char *name, int flags, 310190207Srpaulo const void *value, ev_sethook_t sethook, 311190207Srpaulo ev_unsethook_t unsethook); 312190207Srpauloextern char *getenv(const char *name); 31317680Spstextern int setenv(const char *name, const char *value, 314190207Srpaulo int overwrite); 315190207Srpauloextern int putenv(const char *string); 316190207Srpauloextern int unsetenv(const char *name); 317190207Srpaulo 318190207Srpauloextern ev_sethook_t env_noset; /* refuse set operation */ 319190207Srpauloextern ev_unsethook_t env_nounset; /* refuse unset operation */ 320190207Srpaulo 321190207Srpaulo/* BCD conversions (undocumented) */ 322190207Srpauloextern u_char const bcd2bin_data[]; 323190207Srpauloextern u_char const bin2bcd_data[]; 324190207Srpauloextern char const hex2ascii_data[]; 325190207Srpaulo 326190207Srpaulo#define bcd2bin(bcd) (bcd2bin_data[bcd]) 327190207Srpaulo#define bin2bcd(bin) (bin2bcd_data[bin]) 32856893Sfenner#define hex2ascii(hex) (hex2ascii_data[hex]) 329190207Srpaulo 330190207Srpaulo/* min/max (undocumented) */ 331190207Srpaulostatic __inline int imax(int a, int b) { return (a > b ? a : b); } 332190207Srpaulostatic __inline int imin(int a, int b) { return (a < b ? a : b); } 333190207Srpaulostatic __inline long lmax(long a, long b) { return (a > b ? a : b); } 334190207Srpaulostatic __inline long lmin(long a, long b) { return (a < b ? a : b); } 335190207Srpaulostatic __inline u_int max(u_int a, u_int b) { return (a > b ? a : b); } 336190207Srpaulostatic __inline u_int min(u_int a, u_int b) { return (a < b ? a : b); } 337190207Srpaulostatic __inline quad_t qmax(quad_t a, quad_t b) { return (a > b ? a : b); } 338190207Srpaulostatic __inline quad_t qmin(quad_t a, quad_t b) { return (a < b ? a : b); } 339190207Srpaulostatic __inline u_long ulmax(u_long a, u_long b) { return (a > b ? a : b); } 340190207Srpaulostatic __inline u_long ulmin(u_long a, u_long b) { return (a < b ? a : b); } 341190207Srpaulo 342190207Srpaulo/* swaps (undocumented, useful?) */ 343190207Srpaulo#ifdef __i386__ 344190207Srpauloextern u_int32_t bswap32(u_int32_t x); 345190207Srpauloextern u_int64_t bswap64(u_int64_t x); 346190207Srpaulo#endif 347190207Srpaulo 348190207Srpaulo/* null functions for device/filesystem switches (undocumented) */ 349190207Srpauloextern int nodev(void); 350190207Srpauloextern int noioctl(struct open_file *, u_long, void *); 351190207Srpauloextern void nullsys(void); 352190207Srpaulo 353190207Srpauloextern int null_open(const char *path, struct open_file *f); 354190207Srpauloextern int null_close(struct open_file *f); 355190207Srpauloextern int null_read(struct open_file *f, void *buf, size_t size, size_t *resid); 356190207Srpauloextern int null_write(struct open_file *f, void *buf, size_t size, size_t *resid); 357190207Srpauloextern off_t null_seek(struct open_file *f, off_t offset, int where); 358190207Srpauloextern int null_stat(struct open_file *f, struct stat *sb); 359190207Srpauloextern int null_readdir(struct open_file *f, struct dirent *d); 360190207Srpaulo 361190207Srpaulo 362190207Srpaulo/* 363190207Srpaulo * Machine dependent functions and data, must be provided or stubbed by 364190207Srpaulo * the consumer 365190207Srpaulo */ 366190207Srpauloextern int getchar(void); 367190207Srpauloextern int ischar(void); 36856893Sfennerextern void putchar(int); 369190207Srpauloextern int devopen(struct open_file *, const char *, const char **); 370190207Srpauloextern int devclose(struct open_file *f); 371190207Srpauloextern void panic(const char *, ...) __dead2; 372190207Srpauloextern struct fs_ops *file_system[]; 373190207Srpauloextern struct devsw *devsw[]; 374190207Srpaulo 375190207Srpaulo/* 376190207Srpaulo * Expose byteorder(3) functions. 377190207Srpaulo */ 378190207Srpaulo#ifndef _BYTEORDER_PROTOTYPED 379190207Srpaulo#define _BYTEORDER_PROTOTYPED 380190207Srpauloextern uint32_t htonl(uint32_t); 381190207Srpauloextern uint16_t htons(uint16_t); 382190207Srpauloextern uint32_t ntohl(uint32_t); 383190207Srpauloextern uint16_t ntohs(uint16_t); 384190207Srpaulo#endif 385190207Srpaulo 386190207Srpaulo#ifndef _BYTEORDER_FUNC_DEFINED 38756893Sfenner#define _BYTEORDER_FUNC_DEFINED 38817680Spst#define htonl(x) __htonl(x) 389190207Srpaulo#define htons(x) __htons(x) 390190207Srpaulo#define ntohl(x) __ntohl(x) 391190207Srpaulo#define ntohs(x) __ntohs(x) 392190207Srpaulo#endif 393190207Srpaulo 394190207Srpaulo#if 0 39517680Spst 396190207Srpaulostatic inline void * 397190207Srpaulomalloc_debug(size_t size, const char *file, int line) 398190207Srpaulo{ 399190207Srpaulo void *p; 400190207Srpaulo printf("%s:%d malloc(%ld)", file, line, size); 401190207Srpaulo p = malloc(size); 402190207Srpaulo printf("=%p\n", p); 403190207Srpaulo return p; 404190207Srpaulo} 405190207Srpaulo 406190207Srpaulostatic inline void 407190207Srpaulofree_debug(void *p, const char *file, int line) 408190207Srpaulo{ 409190207Srpaulo printf("%s:%d free(%p)\n", file, line, p); 410190207Srpaulo free(p); 411190207Srpaulo} 412190207Srpaulo 413190207Srpaulo#define malloc(x) malloc_debug(x, __FILE__, __LINE__) 414190207Srpaulo#define free(x) free_debug(x, __FILE__, __LINE__) 41575115Sfenner 416190207Srpaulo#endif 417190207Srpaulo