type.c revision 109462
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 109462 2003-01-18 04:22:14Z 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
54109462Sjmallett	new = NULL;
5599193Sjmallett
56109462Sjmallett	ERROR(new, NULL);
57109462Sjmallett
5899193Sjmallett	new = malloc(sizeof(*new));
5999193Sjmallett	if (new == NULL) {
60109462Sjmallett		ERROR(new, "unable to allocate memory for disk");
6199193Sjmallett		return NULL;
6299193Sjmallett	}
6399193Sjmallett
6499193Sjmallett	if (ufs_disk_fillout(new, name) == -1) {
65109462Sjmallett		ERROR(new, "could not fill out disk");
6699193Sjmallett		free(new);
6799193Sjmallett		return NULL;
6899193Sjmallett	}
6999193Sjmallett
7099193Sjmallett	return new;
7199193Sjmallett}
7299193Sjmallett
7399193Sjmallettvoid
74109462Sjmallettufs_disk_dtor(struct uufsd **diskp)
7599193Sjmallett{
76109462Sjmallett	struct uufsd *disk;
77109462Sjmallett
78109462Sjmallett	if (diskp != NULL)
79109462Sjmallett		disk = *diskp;
80109462Sjmallett	else
81109462Sjmallett		return;
82109462Sjmallett
83109462Sjmallett	ERROR(disk, NULL);
84109462Sjmallett
85109462Sjmallett	ufs_disk_close(disk);
86109462Sjmallett	free(disk);
87109462Sjmallett	*diskp = NULL;
8899193Sjmallett}
8999193Sjmallett
9099193Sjmallettint
9199193Sjmallettufs_disk_close(struct uufsd *disk)
9299193Sjmallett{
93109462Sjmallett	ERROR(disk, NULL);
9499193Sjmallett	close(disk->d_fd);
9599193Sjmallett	if (disk->d_inoblock != NULL) {
9699193Sjmallett		free(disk->d_inoblock);
9799193Sjmallett		disk->d_inoblock = NULL;
9899193Sjmallett	}
9999193Sjmallett	return 0;
10099193Sjmallett}
10199193Sjmallett
10299193Sjmallettint
10399193Sjmallettufs_disk_fillout(struct uufsd *disk, const char *name)
10499193Sjmallett{
10599193Sjmallett	int fd;
10699193Sjmallett
107109462Sjmallett	ERROR(disk, NULL);
10899222Sjmallett
10999193Sjmallett	fd = open(name, O_RDONLY);
11099193Sjmallett	if (fd == -1) {
111109462Sjmallett		ERROR(disk, "failed to open disk for reading");
11299193Sjmallett		return -1;
11399193Sjmallett	}
11499193Sjmallett
11599193Sjmallett	disk->d_bsize = 1;
11699193Sjmallett	disk->d_fd = fd;
11799193Sjmallett	disk->d_inoblock = NULL;
11899823Sjmallett	disk->d_inomin = 0;
11999823Sjmallett	disk->d_inomax = 0;
12099193Sjmallett	disk->d_name = name;
121101687Sjmallett	disk->d_ufs = 0;
122105737Sjmallett	disk->d_error = NULL;
12399193Sjmallett
12499193Sjmallett	if (sbread(disk) == -1) {
125109462Sjmallett		ERROR(disk, "could not read superblock to fill out disk");
12699193Sjmallett		return -1;
12799193Sjmallett	}
12899193Sjmallett
12999193Sjmallett	return 0;
13099193Sjmallett}
131