stand.h revision 40520
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.7 1998/10/06 19:23:57 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}; 141 142extern int errno; 143 144struct open_file { 145 int f_flags; /* see F_* below */ 146 struct devsw *f_dev; /* pointer to device operations */ 147 void *f_devdata; /* device specific data */ 148 struct fs_ops *f_ops; /* pointer to file system operations */ 149 void *f_fsdata; /* file system specific data */ 150 off_t f_offset; /* current file offset (F_RAW) */ 151}; 152 153#define SOPEN_MAX 8 154extern struct open_file files[]; 155 156/* f_flags values */ 157#define F_READ 0x0001 /* file opened for reading */ 158#define F_WRITE 0x0002 /* file opened for writing */ 159#define F_RAW 0x0004 /* raw device open - no file system */ 160#define F_NODEV 0x0008 /* network open - no device */ 161 162#define isupper(c) ((c) >= 'A' && (c) <= 'Z') 163#define islower(c) ((c) >= 'a' && (c) <= 'z') 164#define isspace(c) ((c) == ' ' || (c) == '\t') 165#define isdigit(c) ((c) >= '0' && (c) <= '9') 166#define isxdigit(c) (isdigit(c) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F')) 167#define isascii(c) ((c) >= 0 || (c <= 0x7f)) 168#define isalpha(c) (isupper(c) || (islower(c))) 169#define toupper(c) ((c) - 'a' + 'A') 170#define tolower(c) ((c) - 'A' + 'a') 171 172/* sbrk emulation */ 173extern void setheap(void *base, void *top); 174extern char *sbrk(int incr); 175 176/* Matt Dillon's zalloc/zmalloc */ 177extern void *malloc(size_t bytes); 178extern void free(void *ptr); 179/*#define free(p) {CHK("free %p", p); free(p);} */ /* use for catching guard violations */ 180extern void *calloc(size_t n1, size_t n2); 181extern void *realloc(void *ptr, size_t size); 182extern void *reallocf(void *ptr, size_t size); 183extern void mallocstats(void); 184#ifdef __alpha__ 185extern void free_region(void *start, void *end); 186#endif 187 188/* disklabel support (undocumented, may be junk) */ 189struct disklabel; 190extern char *getdisklabel(const char *, struct disklabel *); 191extern int dkcksum(struct disklabel *); 192 193extern int printf(const char *fmt, ...); 194extern void vprintf(const char *fmt, _BSD_VA_LIST_); 195extern int sprintf(char *buf, const char *cfmt, ...); 196 197extern void twiddle(void); 198 199extern void ngets(char *, int); 200#define gets(x) ngets((x), 0) 201extern int fgetstr(char *buf, int size, int fd); 202 203extern int open(const char *, int); 204#define O_RDONLY 0x0 205#define O_WRONLY 0x1 /* writing not (yet?) supported */ 206#define O_RDWR 0x2 207extern int close(int); 208extern void closeall(void); 209extern ssize_t read(int, void *, size_t); 210extern ssize_t write(int, void *, size_t); 211extern off_t lseek(int, off_t, int); 212extern int stat(const char *, struct stat *); 213 214extern void srandom(u_long seed); 215extern u_long random(void); 216 217/* imports from stdlib, locally modified */ 218extern long strtol(const char *, char **, int); 219extern char * strerror(int err); 220extern char *optarg; /* getopt(3) external variables */ 221extern int optind, opterr, optopt; 222extern int getopt(int, char * const [], const char *); 223 224/* pager.c */ 225extern void pager_open(void); 226extern void pager_close(void); 227extern int pager_output(const char *lines); 228extern int pager_file(const char *fname); 229 230/* environment.c */ 231#define EV_DYNAMIC (1<<0) /* value was dynamically allocated, free if changed/unset */ 232#define EV_VOLATILE (1<<1) /* value is volatile, make a copy of it */ 233#define EV_NOHOOK (1<<2) /* don't call hook when setting */ 234 235struct env_var; 236typedef char *(ev_format_t)(struct env_var *ev); 237typedef int (ev_sethook_t)(struct env_var *ev, int flags, void *value); 238typedef int (ev_unsethook_t)(struct env_var *ev); 239 240struct env_var 241{ 242 char *ev_name; 243 int ev_flags; 244 void *ev_value; 245 ev_sethook_t *ev_sethook; 246 ev_unsethook_t *ev_unsethook; 247 struct env_var *ev_next, *ev_prev; 248}; 249extern struct env_var *environ; 250 251extern struct env_var *env_getenv(const char *name); 252extern int env_setenv(const char *name, int flags, void *value, 253 ev_sethook_t sethook, ev_unsethook_t unsethook); 254extern char *getenv(const char *name); 255extern int setenv(const char *name, char *value, int overwrite); 256extern int putenv(const char *string); 257extern int unsetenv(const char *name); 258 259extern ev_sethook_t env_noset; /* refuse set operation */ 260extern ev_unsethook_t env_nounset; /* refuse unset operation */ 261 262/* BCD conversions (undocumented) */ 263extern u_char const bcd2bin_data[]; 264extern u_char const bin2bcd_data[]; 265extern char const hex2ascii_data[]; 266 267#define bcd2bin(bcd) (bcd2bin_data[bcd]) 268#define bin2bcd(bin) (bin2bcd_data[bin]) 269#define hex2ascii(hex) (hex2ascii_data[hex]) 270 271/* min/max (undocumented) */ 272static __inline int imax(int a, int b) { return (a > b ? a : b); } 273static __inline int imin(int a, int b) { return (a < b ? a : b); } 274static __inline long lmax(long a, long b) { return (a > b ? a : b); } 275static __inline long lmin(long a, long b) { return (a < b ? a : b); } 276static __inline u_int max(u_int a, u_int b) { return (a > b ? a : b); } 277static __inline u_int min(u_int a, u_int b) { return (a < b ? a : b); } 278static __inline quad_t qmax(quad_t a, quad_t b) { return (a > b ? a : b); } 279static __inline quad_t qmin(quad_t a, quad_t b) { return (a < b ? a : b); } 280static __inline u_long ulmax(u_long a, u_long b) { return (a > b ? a : b); } 281static __inline u_long ulmin(u_long a, u_long b) { return (a < b ? a : b); } 282 283/* swaps (undocumented, useful?) */ 284#ifdef __i386__ 285extern u_int32_t bswap32(u_int32_t x); 286extern u_int64_t bswap64(u_int32_t x); 287#endif 288 289/* null functions for device/filesystem switches (undocumented) */ 290extern int nodev(void); 291extern int noioctl(struct open_file *, u_long, void *); 292extern void nullsys(void); 293 294extern int null_open(const char *path, struct open_file *f); 295extern int null_close(struct open_file *f); 296extern ssize_t null_read(struct open_file *f, void *buf, size_t size, size_t *resid); 297extern ssize_t null_write(struct open_file *f, void *buf, size_t size, size_t *resid); 298extern off_t null_seek(struct open_file *f, off_t offset, int where); 299extern int null_stat(struct open_file *f, struct stat *sb); 300 301/* 302 * Machine dependent functions and data, must be provided or stubbed by 303 * the consumer 304 */ 305extern int getchar(void); 306extern int ischar(void); 307extern void putchar(int); 308extern int devopen(struct open_file *, const char *, const char **); 309extern int devclose(struct open_file *f); 310extern void panic(const char *, ...) __dead2; 311extern struct fs_ops *file_system[]; 312extern struct devsw *devsw[]; 313 314#if 0 315 316static inline void * 317malloc_debug(size_t size, const char *file, int line) 318{ 319 void *p; 320 printf("%s:%d malloc(%ld)", file, line, size); 321 p = malloc(size); 322 printf("=%p\n", p); 323 return p; 324} 325 326static inline void 327free_debug(void *p, const char *file, int line) 328{ 329 printf("%s:%d free(%p)\n", file, line, p); 330 free(p); 331} 332 333#define malloc(x) malloc_debug(x, __FILE__, __LINE__) 334#define free(x) free_debug(x, __FILE__, __LINE__) 335 336#endif 337