stand.h revision 40889
1/* 2 * Copyright (c) 1998 Michael Smith. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * $Id: stand.h,v 1.10 1998/11/01 09:31:08 msmith Exp $ 27 * From $NetBSD: stand.h,v 1.22 1997/06/26 19:17:40 drochner Exp $ 28 */ 29 30/*- 31 * Copyright (c) 1993 32 * The Regents of the University of California. All rights reserved. 33 * 34 * Redistribution and use in source and binary forms, with or without 35 * modification, are permitted provided that the following conditions 36 * are met: 37 * 1. Redistributions of source code must retain the above copyright 38 * notice, this list of conditions and the following disclaimer. 39 * 2. Redistributions in binary form must reproduce the above copyright 40 * notice, this list of conditions and the following disclaimer in the 41 * documentation and/or other materials provided with the distribution. 42 * 3. All advertising materials mentioning features or use of this software 43 * must display the following acknowledgement: 44 * This product includes software developed by the University of 45 * California, Berkeley and its contributors. 46 * 4. Neither the name of the University nor the names of its contributors 47 * may be used to endorse or promote products derived from this software 48 * without specific prior written permission. 49 * 50 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 51 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 52 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 53 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 54 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 55 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 56 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 57 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 58 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 59 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 60 * SUCH DAMAGE. 61 * 62 * @(#)stand.h 8.1 (Berkeley) 6/11/93 63 */ 64 65#include <sys/types.h> 66#include <sys/cdefs.h> 67#include <sys/stat.h> 68 69#define CHK(fmt, args...) printf("%s(%d): " fmt "\n", __FUNCTION__, __LINE__ , ##args) 70#define PCHK(fmt, args...) {printf("%s(%d): " fmt "\n", __FUNCTION__, __LINE__ , ##args); getchar();} 71 72#ifndef NULL 73#define NULL 0 74#endif 75 76/* Avoid unwanted userlandish components */ 77#define KERNEL 78#include <sys/errno.h> 79#undef KERNEL 80 81/* special stand error codes */ 82#define EADAPT (ELAST+1) /* bad adaptor */ 83#define ECTLR (ELAST+2) /* bad controller */ 84#define EUNIT (ELAST+3) /* bad unit */ 85#define ESLICE (ELAST+4) /* bad slice */ 86#define EPART (ELAST+5) /* bad partition */ 87#define ERDLAB (ELAST+6) /* can't read disk label */ 88#define EUNLAB (ELAST+7) /* unlabeled disk */ 89#define EOFFSET (ELAST+8) /* relative seek not supported */ 90#define ESALAST (ELAST+8) /* */ 91 92struct open_file; 93 94/* 95 * This structure is used to define file system operations in a file system 96 * independent way. 97 * 98 * XXX note that filesystem providers should export a pointer to their fs_ops 99 * struct, so that consumers can reference this and thus include the 100 * filesystems that they require. 101 */ 102struct fs_ops { 103 const char *fs_name; 104 int (*fo_open)(const char *path, struct open_file *f); 105 int (*fo_close)(struct open_file *f); 106 int (*fo_read)(struct open_file *f, void *buf, 107 size_t size, size_t *resid); 108 int (*fo_write)(struct open_file *f, void *buf, 109 size_t size, size_t *resid); 110 off_t (*fo_seek)(struct open_file *f, off_t offset, int where); 111 int (*fo_stat)(struct open_file *f, struct stat *sb); 112}; 113 114/* 115 * libstand-supplied filesystems 116 */ 117extern struct fs_ops ufs_fsops; 118extern struct fs_ops tftp_fsops; 119extern struct fs_ops nfs_fsops; 120extern struct fs_ops cd9660_fsops; 121extern struct fs_ops zipfs_fsops; 122extern struct fs_ops dosfs_fsops; 123 124/* where values for lseek(2) */ 125#define SEEK_SET 0 /* set file offset to offset */ 126#define SEEK_CUR 1 /* set file offset to current plus offset */ 127#define SEEK_END 2 /* set file offset to EOF plus offset */ 128 129/* 130 * Device switch 131 */ 132struct devsw { 133 const char dv_name[8]; 134 int dv_type; /* opaque type constant, arch-dependant */ 135 int (*dv_init)(void); /* early probe call */ 136 int (*dv_strategy)(void *devdata, int rw, daddr_t blk, size_t size, void *buf, size_t *rsize); 137 int (*dv_open)(struct open_file *f, ...); 138 int (*dv_close)(struct open_file *f); 139 int (*dv_ioctl)(struct open_file *f, u_long cmd, void *data); 140 void (*dv_print)(int verbose); /* print device information */ 141}; 142 143extern int errno; 144 145struct open_file { 146 int f_flags; /* see F_* below */ 147 struct devsw *f_dev; /* pointer to device operations */ 148 void *f_devdata; /* device specific data */ 149 struct fs_ops *f_ops; /* pointer to file system operations */ 150 void *f_fsdata; /* file system specific data */ 151 off_t f_offset; /* current file offset (F_RAW) */ 152}; 153 154#define SOPEN_MAX 8 155extern struct open_file files[]; 156 157/* f_flags values */ 158#define F_READ 0x0001 /* file opened for reading */ 159#define F_WRITE 0x0002 /* file opened for writing */ 160#define F_RAW 0x0004 /* raw device open - no file system */ 161#define F_NODEV 0x0008 /* network open - no device */ 162 163#define isupper(c) ((c) >= 'A' && (c) <= 'Z') 164#define islower(c) ((c) >= 'a' && (c) <= 'z') 165#define isspace(c) ((c) == ' ' || ((c) >= 0x9 && (c) <= 0xd)) 166#define isdigit(c) ((c) >= '0' && (c) <= '9') 167#define isxdigit(c) (isdigit(c) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F')) 168#define isascii(c) ((c) >= 0 || (c <= 0x7f)) 169#define isalpha(c) (isupper(c) || (islower(c))) 170#define toupper(c) ((c) - 'a' + 'A') 171#define tolower(c) ((c) - 'A' + 'a') 172 173/* sbrk emulation */ 174extern void setheap(void *base, void *top); 175extern char *sbrk(int incr); 176 177/* Matt Dillon's zalloc/zmalloc */ 178extern void *malloc(size_t bytes); 179extern void free(void *ptr); 180/*#define free(p) {CHK("free %p", p); free(p);} */ /* use for catching guard violations */ 181extern void *calloc(size_t n1, size_t n2); 182extern void *realloc(void *ptr, size_t size); 183extern void *reallocf(void *ptr, size_t size); 184extern void mallocstats(void); 185#ifdef __alpha__ 186extern void free_region(void *start, void *end); 187#endif 188 189/* disklabel support (undocumented, may be junk) */ 190struct disklabel; 191extern char *getdisklabel(const char *, struct disklabel *); 192extern int dkcksum(struct disklabel *); 193 194extern int printf(const char *fmt, ...); 195extern void vprintf(const char *fmt, _BSD_VA_LIST_); 196extern int sprintf(char *buf, const char *cfmt, ...); 197extern void vsprintf(char *buf, const char *cfmt, _BSD_VA_LIST_); 198 199extern void twiddle(void); 200 201extern void ngets(char *, int); 202#define gets(x) ngets((x), 0) 203extern int fgetstr(char *buf, int size, int fd); 204 205extern int open(const char *, int); 206#define O_RDONLY 0x0 207#define O_WRONLY 0x1 /* writing not (yet?) supported */ 208#define O_RDWR 0x2 209extern int close(int); 210extern void closeall(void); 211extern ssize_t read(int, void *, size_t); 212extern ssize_t write(int, void *, size_t); 213extern off_t lseek(int, off_t, int); 214extern int stat(const char *, struct stat *); 215 216extern void srandom(u_long seed); 217extern u_long random(void); 218 219/* imports from stdlib, locally modified */ 220extern long strtol(const char *, char **, int); 221extern char * strerror(int err); 222extern char *optarg; /* getopt(3) external variables */ 223extern int optind, opterr, optopt; 224extern int getopt(int, char * const [], const char *); 225 226/* pager.c */ 227extern void pager_open(void); 228extern void pager_close(void); 229extern int pager_output(const char *lines); 230extern int pager_file(const char *fname); 231 232/* environment.c */ 233#define EV_DYNAMIC (1<<0) /* value was dynamically allocated, free if changed/unset */ 234#define EV_VOLATILE (1<<1) /* value is volatile, make a copy of it */ 235#define EV_NOHOOK (1<<2) /* don't call hook when setting */ 236 237struct env_var; 238typedef char *(ev_format_t)(struct env_var *ev); 239typedef int (ev_sethook_t)(struct env_var *ev, int flags, void *value); 240typedef int (ev_unsethook_t)(struct env_var *ev); 241 242struct env_var 243{ 244 char *ev_name; 245 int ev_flags; 246 void *ev_value; 247 ev_sethook_t *ev_sethook; 248 ev_unsethook_t *ev_unsethook; 249 struct env_var *ev_next, *ev_prev; 250}; 251extern struct env_var *environ; 252 253extern struct env_var *env_getenv(const char *name); 254extern int env_setenv(const char *name, int flags, void *value, 255 ev_sethook_t sethook, ev_unsethook_t unsethook); 256extern char *getenv(const char *name); 257extern int setenv(const char *name, char *value, int overwrite); 258extern int putenv(const char *string); 259extern int unsetenv(const char *name); 260 261extern ev_sethook_t env_noset; /* refuse set operation */ 262extern ev_unsethook_t env_nounset; /* refuse unset operation */ 263 264/* BCD conversions (undocumented) */ 265extern u_char const bcd2bin_data[]; 266extern u_char const bin2bcd_data[]; 267extern char const hex2ascii_data[]; 268 269#define bcd2bin(bcd) (bcd2bin_data[bcd]) 270#define bin2bcd(bin) (bin2bcd_data[bin]) 271#define hex2ascii(hex) (hex2ascii_data[hex]) 272 273/* min/max (undocumented) */ 274static __inline int imax(int a, int b) { return (a > b ? a : b); } 275static __inline int imin(int a, int b) { return (a < b ? a : b); } 276static __inline long lmax(long a, long b) { return (a > b ? a : b); } 277static __inline long lmin(long a, long b) { return (a < b ? a : b); } 278static __inline u_int max(u_int a, u_int b) { return (a > b ? a : b); } 279static __inline u_int min(u_int a, u_int b) { return (a < b ? a : b); } 280static __inline quad_t qmax(quad_t a, quad_t b) { return (a > b ? a : b); } 281static __inline quad_t qmin(quad_t a, quad_t b) { return (a < b ? a : b); } 282static __inline u_long ulmax(u_long a, u_long b) { return (a > b ? a : b); } 283static __inline u_long ulmin(u_long a, u_long b) { return (a < b ? a : b); } 284 285/* swaps (undocumented, useful?) */ 286#ifdef __i386__ 287extern u_int32_t bswap32(u_int32_t x); 288extern u_int64_t bswap64(u_int32_t x); 289#endif 290 291/* null functions for device/filesystem switches (undocumented) */ 292extern int nodev(void); 293extern int noioctl(struct open_file *, u_long, void *); 294extern void nullsys(void); 295 296extern int null_open(const char *path, struct open_file *f); 297extern int null_close(struct open_file *f); 298extern ssize_t null_read(struct open_file *f, void *buf, size_t size, size_t *resid); 299extern ssize_t null_write(struct open_file *f, void *buf, size_t size, size_t *resid); 300extern off_t null_seek(struct open_file *f, off_t offset, int where); 301extern int null_stat(struct open_file *f, struct stat *sb); 302 303/* 304 * Machine dependent functions and data, must be provided or stubbed by 305 * the consumer 306 */ 307extern int getchar(void); 308extern int ischar(void); 309extern void putchar(int); 310extern int devopen(struct open_file *, const char *, const char **); 311extern int devclose(struct open_file *f); 312extern void panic(const char *, ...) __dead2; 313extern struct fs_ops *file_system[]; 314extern struct devsw *devsw[]; 315 316#if 0 317 318static inline void * 319malloc_debug(size_t size, const char *file, int line) 320{ 321 void *p; 322 printf("%s:%d malloc(%ld)", file, line, size); 323 p = malloc(size); 324 printf("=%p\n", p); 325 return p; 326} 327 328static inline void 329free_debug(void *p, const char *file, int line) 330{ 331 printf("%s:%d free(%p)\n", file, line, p); 332 free(p); 333} 334 335#define malloc(x) malloc_debug(x, __FILE__, __LINE__) 336#define free(x) free_debug(x, __FILE__, __LINE__) 337 338#endif 339