type.c revision 99193
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 99193 2002-07-01 01:45:03Z 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 9799193Sjmallett fd = open(name, O_RDONLY); 9899193Sjmallett if (fd == -1) { 9999193Sjmallett DEBUG("open"); 10099193Sjmallett return -1; 10199193Sjmallett } 10299193Sjmallett 10399193Sjmallett disk->d_bsize = 1; 10499193Sjmallett disk->d_fd = fd; 10599193Sjmallett disk->d_inoblock = NULL; 10699193Sjmallett disk->d_name = name; 10799193Sjmallett 10899193Sjmallett if (sbread(disk) == -1) { 10999193Sjmallett DEBUG(NULL); 11099193Sjmallett return -1; 11199193Sjmallett } 11299193Sjmallett 11399193Sjmallett return 0; 11499193Sjmallett} 115