199193Sjmallett/*
299193Sjmallett * Copyright (c) 2002 Juli Mallett.  All rights reserved.
399193Sjmallett *
499193Sjmallett * This software was written by Juli Mallett <jmallett@FreeBSD.org> for the
599193Sjmallett * FreeBSD project.  Redistribution and use in source and binary forms, with
699193Sjmallett * or without modification, are permitted provided that the following
799193Sjmallett * conditions are met:
899193Sjmallett *
999193Sjmallett * 1. Redistribution of source code must retain the above copyright notice,
1099193Sjmallett *    this list of conditions and the following disclaimer.
1199193Sjmallett * 2. Redistribution in binary form must reproduce the above copyright
1299193Sjmallett *    notice, this list of conditions and the following disclaimer in the
1399193Sjmallett *    documentation and/or other materials provided with the distribution.
1499193Sjmallett *
1599193Sjmallett * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1699193Sjmallett * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
1799193Sjmallett * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
1899193Sjmallett * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
1999193Sjmallett * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
2099193Sjmallett * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
2199193Sjmallett * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2299193Sjmallett * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
2399193Sjmallett * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
2499193Sjmallett * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2599193Sjmallett * POSSIBILITY OF SUCH DAMAGE.
2699193Sjmallett *
2799193Sjmallett * $FreeBSD$
2899193Sjmallett */
2999193Sjmallett
30102296Sjmallett#ifndef	__LIBUFS_H__
31102296Sjmallett#define	__LIBUFS_H__
32102296Sjmallett
3399193Sjmallett/*
3499193Sjmallett * libufs structures.
3599193Sjmallett */
3699193Sjmallett
3799193Sjmallett/*
3899193Sjmallett * userland ufs disk.
3999193Sjmallett */
4099193Sjmallettstruct uufsd {
4199193Sjmallett	const char *d_name;	/* disk name */
4299193Sjmallett	int d_ufs;		/* decimal UFS version */
4399193Sjmallett	int d_fd;		/* raw device file descriptor */
4499193Sjmallett	long d_bsize;		/* device bsize */
4599193Sjmallett	ufs2_daddr_t d_sblock;	/* superblock location */
46207141Sjeff	struct csum *d_sbcsum;	/* Superblock summary info */
4799193Sjmallett	caddr_t d_inoblock;	/* inode block */
4899193Sjmallett	ino_t d_inomin;		/* low inode */
4999193Sjmallett	ino_t d_inomax;		/* high inode */
5099193Sjmallett	union {
5199193Sjmallett		struct fs d_fs;	/* filesystem information */
5299193Sjmallett		char d_sb[MAXBSIZE];
5399193Sjmallett				/* superblock as buffer */
5499193Sjmallett	} d_sbunion;
55109509Sjmallett	union {
56109509Sjmallett		struct cg d_cg;	/* cylinder group */
57109509Sjmallett		char d_buf[MAXBSIZE];
58109509Sjmallett				/* cylinder group storage */
59109509Sjmallett	} d_cgunion;
60109509Sjmallett	int d_ccg;		/* current cylinder group */
61109518Sjmallett	int d_lcg;		/* last cylinder group (in d_cg) */
62105737Sjmallett	const char *d_error;	/* human readable disk error */
63109506Sjmallett	int d_mine;		/* internal flags */
6499193Sjmallett#define	d_fs	d_sbunion.d_fs
6599193Sjmallett#define	d_sb	d_sbunion.d_sb
66109509Sjmallett#define	d_cg	d_cgunion.d_cg
6799193Sjmallett};
6899193Sjmallett
69218601Skib/*
70218601Skib * libufs macros (internal, non-exported).
71218601Skib */
72218601Skib#ifdef	_LIBUFS
73218601Skib/*
74218601Skib * Trace steps through libufs, to be used at entry and erroneous return.
75218601Skib */
76218601Skibstatic inline void
77218601SkibERROR(struct uufsd *u, const char *str)
78218601Skib{
79218601Skib
80218601Skib#ifdef	_LIBUFS_DEBUGGING
81218601Skib	if (str != NULL) {
82218601Skib		fprintf(stderr, "libufs: %s", str);
83218601Skib		if (errno != 0)
84218601Skib			fprintf(stderr, ": %s", strerror(errno));
85218601Skib		fprintf(stderr, "\n");
86218601Skib	}
87218601Skib#endif
88218601Skib	if (u != NULL)
89218601Skib		u->d_error = str;
90218601Skib}
91218601Skib#endif	/* _LIBUFS */
92218601Skib
93102296Sjmallett__BEGIN_DECLS
94102296Sjmallett
9599193Sjmallett/*
9699193Sjmallett * libufs prototypes.
9799193Sjmallett */
9899193Sjmallett
9999193Sjmallett/*
10099193Sjmallett * block.c
10199193Sjmallett */
10299193Sjmallettssize_t bread(struct uufsd *, ufs2_daddr_t, void *, size_t);
10399193Sjmallettssize_t bwrite(struct uufsd *, ufs2_daddr_t, const void *, size_t);
104174668Sphkint berase(struct uufsd *, ufs2_daddr_t, ufs2_daddr_t);
10599193Sjmallett
10699193Sjmallett/*
107109509Sjmallett * cgroup.c
108109509Sjmallett */
109207141Sjeffufs2_daddr_t cgballoc(struct uufsd *);
110207141Sjeffint cgbfree(struct uufsd *, ufs2_daddr_t, long);
111207141Sjeffino_t cgialloc(struct uufsd *);
112109509Sjmallettint cgread(struct uufsd *);
113109509Sjmallettint cgread1(struct uufsd *, int);
114207141Sjeffint cgwrite(struct uufsd *);
115163835Spjdint cgwrite1(struct uufsd *, int);
116109509Sjmallett
117109509Sjmallett/*
11899193Sjmallett * inode.c
11999193Sjmallett */
12099193Sjmallettint getino(struct uufsd *, void **, ino_t, int *);
121207141Sjeffint putino(struct uufsd *);
12299193Sjmallett
12399193Sjmallett/*
12499193Sjmallett * sblock.c
12599193Sjmallett */
12699193Sjmallettint sbread(struct uufsd *);
12799193Sjmallettint sbwrite(struct uufsd *, int);
12899193Sjmallett
12999193Sjmallett/*
13099193Sjmallett * type.c
13199193Sjmallett */
13299193Sjmallettint ufs_disk_close(struct uufsd *);
13399193Sjmallettint ufs_disk_fillout(struct uufsd *, const char *);
134109755Sjmallettint ufs_disk_fillout_blank(struct uufsd *, const char *);
135110066Sjmallettint ufs_disk_write(struct uufsd *);
136102296Sjmallett
137207141Sjeff/*
138207141Sjeff * ffs_subr.c
139207141Sjeff */
140207141Sjeffvoid	ffs_clrblock(struct fs *, u_char *, ufs1_daddr_t);
141207141Sjeffvoid	ffs_clusteracct(struct fs *, struct cg *, ufs1_daddr_t, int);
142207141Sjeffvoid	ffs_fragacct(struct fs *, int, int32_t [], int);
143207141Sjeffint	ffs_isblock(struct fs *, u_char *, ufs1_daddr_t);
144207141Sjeffint	ffs_isfreeblock(struct fs *, u_char *, ufs1_daddr_t);
145207141Sjeffvoid	ffs_setblock(struct fs *, u_char *, ufs1_daddr_t);
146207141Sjeff
147102296Sjmallett__END_DECLS
148102296Sjmallett
149102296Sjmallett#endif	/* __LIBUFS_H__ */
150