type.c revision 99823
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
2899193Sjmallett#include <sys/cdefs.h>
2999193Sjmallett__FBSDID("$FreeBSD: head/lib/libufs/type.c 99823 2002-07-11 21:27:26Z jmallett $");
3099193Sjmallett
3199193Sjmallett#include <sys/param.h>
3299193Sjmallett#include <sys/mount.h>
3399193Sjmallett#include <sys/disklabel.h>
3499193Sjmallett#include <sys/stat.h>
3599193Sjmallett
3699193Sjmallett#include <ufs/ufs/ufsmount.h>
3799193Sjmallett#include <ufs/ufs/dinode.h>
3899193Sjmallett#include <ufs/ffs/fs.h>
3999193Sjmallett
4099193Sjmallett#include <errno.h>
4199193Sjmallett#include <fcntl.h>
4299193Sjmallett#include <stdio.h>
4399193Sjmallett#include <stdlib.h>
4499193Sjmallett#include <string.h>
4599193Sjmallett#include <unistd.h>
4699193Sjmallett
4799193Sjmallett#include <libufs.h>
4899193Sjmallett
4999193Sjmallettstruct uufsd *
5099193Sjmallettufs_disk_ctor(const char *name)
5199193Sjmallett{
5299193Sjmallett	struct uufsd *new;
5399193Sjmallett
5499193Sjmallett	DEBUG(NULL);
5599193Sjmallett
5699193Sjmallett	new = malloc(sizeof(*new));
5799193Sjmallett	if (new == NULL) {
5899193Sjmallett		DEBUG(NULL);
5999193Sjmallett		return NULL;
6099193Sjmallett	}
6199193Sjmallett
6299193Sjmallett	if (ufs_disk_fillout(new, name) == -1) {
6399193Sjmallett		DEBUG(NULL);
6499193Sjmallett		free(new);
6599193Sjmallett		return NULL;
6699193Sjmallett	}
6799193Sjmallett
6899193Sjmallett	return new;
6999193Sjmallett}
7099193Sjmallett
7199193Sjmallettvoid
7299193Sjmallettufs_disk_dtor(struct uufsd **disk)
7399193Sjmallett{
7499193Sjmallett	DEBUG(NULL);
7599193Sjmallett	ufs_disk_close(*disk);
7699193Sjmallett	free(*disk);
7799193Sjmallett	*disk = NULL;
7899193Sjmallett}
7999193Sjmallett
8099193Sjmallettint
8199193Sjmallettufs_disk_close(struct uufsd *disk)
8299193Sjmallett{
8399193Sjmallett	DEBUG(NULL);
8499193Sjmallett	close(disk->d_fd);
8599193Sjmallett	if (disk->d_inoblock != NULL) {
8699193Sjmallett		free(disk->d_inoblock);
8799193Sjmallett		disk->d_inoblock = NULL;
8899193Sjmallett	}
8999193Sjmallett	return 0;
9099193Sjmallett}
9199193Sjmallett
9299193Sjmallettint
9399193Sjmallettufs_disk_fillout(struct uufsd *disk, const char *name)
9499193Sjmallett{
9599193Sjmallett	int fd;
9699193Sjmallett
9799222Sjmallett	DEBUG(NULL);
9899222Sjmallett
9999193Sjmallett	fd = open(name, O_RDONLY);
10099193Sjmallett	if (fd == -1) {
10199193Sjmallett		DEBUG("open");
10299193Sjmallett		return -1;
10399193Sjmallett	}
10499193Sjmallett
10599193Sjmallett	disk->d_bsize = 1;
10699193Sjmallett	disk->d_fd = fd;
10799193Sjmallett	disk->d_inoblock = NULL;
10899823Sjmallett	disk->d_inomin = 0;
10999823Sjmallett	disk->d_inomax = 0;
11099193Sjmallett	disk->d_name = name;
11199193Sjmallett
11299193Sjmallett	if (sbread(disk) == -1) {
11399193Sjmallett		DEBUG(NULL);
11499193Sjmallett		return -1;
11599193Sjmallett	}
11699193Sjmallett
11799193Sjmallett	return 0;
11899193Sjmallett}
119