#include <sys/types.h>
#include <sys/stat.h>
#include <sys/stdarg.h>
#include <sys/stdint.h>
#include "saerrno.h"
#ifndef NULL
#define NULL 0
#endif
struct open_file;
#ifndef LIBKERN_INLINE
#define max(a,b) (((a)>(b))? (a) : (b))
#define min(a,b) (((a)>(b))? (b) : (a))
#endif
struct fs_ops {
int (*open)(char *path, struct open_file *f);
int (*close)(struct open_file *f);
int (*read)(struct open_file *f, void *buf,
size_t size, size_t *resid);
int (*write)(struct open_file *f, void *buf,
size_t size, size_t *resid);
off_t (*seek)(struct open_file *f, off_t offset, int where);
int (*stat)(struct open_file *f, struct stat *sb);
int (*readdir)(struct open_file *f, char *);
int (*fchmod)(struct open_file *f, mode_t);
};
extern struct fs_ops file_system[];
extern int nfsys;
#define SEEK_SET 0
#define SEEK_CUR 1
#define SEEK_END 2
struct devsw {
char *dv_name;
int (*dv_strategy)(void *devdata, int rw,
daddr_t blk, size_t size,
void *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);
};
extern struct devsw devsw[];
extern int ndevs;
extern struct consdev *cn_tab;
struct open_file {
int f_flags;
struct devsw *f_dev;
void *f_devdata;
struct fs_ops *f_ops;
void *f_fsdata;
off_t f_offset;
};
#define SOPEN_MAX 4
extern struct open_file files[];
#define F_READ 0x0001
#define F_WRITE 0x0002
#define F_RAW 0x0004
#define F_NODEV 0x0008
#define F_NOWRITE 0x0010
#define isupper(c) ((c) >= 'A' && (c) <= 'Z')
#define islower(c) ((c) >= 'a' && (c) <= 'z')
#define isalpha(c) (isupper(c)||islower(c))
#define tolower(c) (isupper(c)?((c) - 'A' + 'a'):(c))
#define toupper(c) (islower(c)?((c) - 'a' + 'A'):(c))
#define isspace(c) ((c) == ' ' || (c) == '\t')
#define isdigit(c) ((c) >= '0' && (c) <= '9')
#define btochs(b,c,h,s,nh,ns) \
c = (b) / ((nh) * (ns)); \
h = ((b) % ((nh) * (ns))) / (ns); \
s = ((b) % ((nh) * (ns))) % (ns);
void *alloc(u_int);
void free(void *, u_int);
struct disklabel;
char *getdisklabel(const char *, struct disklabel *);
u_int dkcksum(const struct disklabel *);
#define BOOTRANDOM "/etc/random.seed"
#define BOOTRANDOM_MAX 256
extern char rnddata[BOOTRANDOM_MAX];
void printf(const char *, ...);
int snprintf(char *, size_t, const char *, ...);
void vprintf(const char *, __va_list);
void twiddle(void);
void getln(char *, size_t);
__dead void panic(const char *, ...) __attribute__((noreturn));
__dead void _rtt(void) __attribute__((noreturn));
#define bzero(s,n) ((void)memset((s),0,(n)))
#define bcmp(s1,s2,n) (memcmp((s2),(s1),(n)))
#define bcopy(s1,s2,n) ((void)memmove((s2),(s1),(n)))
void explicit_bzero(void *, size_t);
void hexdump(const void *, size_t);
void *memcpy(void *, const void *, size_t);
void *memmove(void *, const void *, size_t);
int memcmp(const void *, const void *, size_t);
char *strncpy(char *, const char *, size_t);
int strncmp(const char *, const char *, size_t);
int strcmp(const char *, const char *);
size_t strlen(const char *);
long strtol(const char *, char **, int);
long long strtoll(const char *, char **, int);
char *strchr(const char *, int);
void *memset(void *, int, size_t);
void exit(void);
#define O_RDONLY 0x0000
#define O_WRONLY 0x0001
#define O_RDWR 0x0002
int open(const char *, int);
int close(int);
void closeall(void);
ssize_t read(int, void *, size_t);
ssize_t write(int, void *, size_t);
int stat(const char *path, struct stat *sb);
int fstat(int fd, struct stat *sb);
off_t lseek(int, off_t, int);
int opendir(const char *);
int readdir(int, char *);
void closedir(int);
int nodev(void);
int noioctl(struct open_file *, u_long, void *);
void nullsys(void);
int null_open(char *path, struct open_file *f);
int null_close(struct open_file *f);
ssize_t null_read(struct open_file *f, void *buf, size_t size, size_t *resid);
ssize_t null_write(struct open_file *f, void *buf, size_t size, size_t *resid);
off_t null_seek(struct open_file *f, off_t offset, int where);
int null_stat(struct open_file *f, struct stat *sb);
int null_readdir(struct open_file *f, char *name);
char *ttyname(int);
dev_t ttydev(char *);
void cninit(void);
int cnset(dev_t);
void cnputc(int);
int cngetc(void);
int cnischar(void);
int cnspeed(dev_t, int);
u_int sleep(u_int);
void usleep(u_int);
char *ctime(const time_t *);
int ioctl(int, u_long, char *);
void putchar(int);
int getchar(void);
#ifdef __INTERNAL_LIBSA_CREAD
int oopen(const char *, int);
int oclose(int);
ssize_t oread(int, void *, size_t);
off_t olseek(int, off_t, int);
#endif
int devopen(struct open_file *, const char *, char **);
void machdep_start(char *, int, char *, char *, char *);
time_t getsecs(void);