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