#ifndef _SYS_UCOREDUMP_H_
#define _SYS_UCOREDUMP_H_
#ifdef _KERNEL
#include <sys/_uio.h>
#include <sys/blockcount.h>
#include <sys/queue.h>
struct coredump_params;
struct coredump_writer;
struct thread;
struct ucred;
typedef int coredump_init_fn(const struct coredump_writer *,
const struct coredump_params *);
typedef int coredump_write_fn(const struct coredump_writer *, const void *, size_t,
off_t, enum uio_seg, struct ucred *, size_t *, struct thread *);
typedef int coredump_extend_fn(const struct coredump_writer *, off_t,
struct ucred *);
struct coredump_vnode_ctx {
struct vnode *vp;
struct ucred *fcred;
};
coredump_write_fn core_vn_write;
coredump_extend_fn core_vn_extend;
struct coredump_writer {
void *ctx;
coredump_init_fn *init_fn;
coredump_write_fn *write_fn;
coredump_extend_fn *extend_fn;
};
struct coredump_params {
off_t offset;
struct ucred *active_cred;
struct thread *td;
const struct coredump_writer *cdw;
struct compressor *comp;
};
#define CORE_BUF_SIZE (16 * 1024)
int core_write(struct coredump_params *, const void *, size_t, off_t,
enum uio_seg, size_t *);
int core_output(char *, size_t, off_t, struct coredump_params *, void *);
int sbuf_drain_core_output(void *, const char *, int);
extern int coredump_pack_fileinfo;
extern int coredump_pack_vmmapinfo;
extern int compress_user_cores;
extern int compress_user_cores_level;
typedef int coredumper_probe_fn(struct thread *);
#define COREDUMPER_NOMATCH (-1)
#define COREDUMPER_GENERIC (0)
#define COREDUMPER_SPECIAL (50)
#define COREDUMPER_HIGH_PRIORITY (100)
typedef int coredumper_handle_fn(struct thread *, off_t);
struct coredumper {
SLIST_ENTRY(coredumper) cd_entry;
const char *cd_name;
coredumper_probe_fn *cd_probe;
coredumper_handle_fn *cd_handle;
blockcount_t cd_refcount;
};
void coredumper_register(struct coredumper *);
void coredumper_unregister(struct coredumper *);
#endif
#endif