1*c2e8ce64Stsutsui /* $NetBSD: diskutil.c,v 1.5 2011/12/25 06:09:09 tsutsui Exp $ */
204faabf0Stsutsui
304faabf0Stsutsui /*-
404faabf0Stsutsui * Copyright (c) 2004 The NetBSD Foundation, Inc.
504faabf0Stsutsui * All rights reserved.
604faabf0Stsutsui *
704faabf0Stsutsui * This code is derived from software contributed to The NetBSD Foundation
804faabf0Stsutsui * by UCHIYAMA Yasushi.
904faabf0Stsutsui *
1004faabf0Stsutsui * Redistribution and use in source and binary forms, with or without
1104faabf0Stsutsui * modification, are permitted provided that the following conditions
1204faabf0Stsutsui * are met:
1304faabf0Stsutsui * 1. Redistributions of source code must retain the above copyright
1404faabf0Stsutsui * notice, this list of conditions and the following disclaimer.
1504faabf0Stsutsui * 2. Redistributions in binary form must reproduce the above copyright
1604faabf0Stsutsui * notice, this list of conditions and the following disclaimer in the
1704faabf0Stsutsui * documentation and/or other materials provided with the distribution.
1804faabf0Stsutsui *
1904faabf0Stsutsui * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2004faabf0Stsutsui * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2104faabf0Stsutsui * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2204faabf0Stsutsui * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2304faabf0Stsutsui * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2404faabf0Stsutsui * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2504faabf0Stsutsui * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2604faabf0Stsutsui * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2704faabf0Stsutsui * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2804faabf0Stsutsui * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2904faabf0Stsutsui * POSSIBILITY OF SUCH DAMAGE.
3004faabf0Stsutsui */
3104faabf0Stsutsui
3204faabf0Stsutsui #include <lib/libsa/stand.h>
3304faabf0Stsutsui #include <lib/libsa/ufs.h>
3404faabf0Stsutsui #include <lib/libkern/libkern.h>
3504faabf0Stsutsui
3604faabf0Stsutsui #include <machine/pdinfo.h>
3704faabf0Stsutsui #include <machine/vtoc.h>
3804faabf0Stsutsui #include <machine/bfs.h>
3904faabf0Stsutsui
4004faabf0Stsutsui #include "cmd.h"
4104faabf0Stsutsui #include "local.h"
4204faabf0Stsutsui
4304faabf0Stsutsui struct pdinfo_sector pdinfo;
4404faabf0Stsutsui struct vtoc_sector vtoc;
4504faabf0Stsutsui int vtoc_readed;
4604faabf0Stsutsui
4704faabf0Stsutsui void bfs_ls(void);
4804faabf0Stsutsui
4904faabf0Stsutsui int
cmd_disklabel(int argc,char * argp[],int interactive)5004faabf0Stsutsui cmd_disklabel(int argc, char *argp[], int interactive)
5104faabf0Stsutsui {
5204faabf0Stsutsui struct ux_partition *partition;
5304faabf0Stsutsui int i;
5404faabf0Stsutsui
5504faabf0Stsutsui if (!read_vtoc())
5604faabf0Stsutsui return 1;
5704faabf0Stsutsui
5804faabf0Stsutsui partition = vtoc.partition;
5904faabf0Stsutsui printf("Tag\tFlags\tStart\tCount\n");
6004faabf0Stsutsui for (i = 0; i < VTOC_MAXPARTITIONS; i++, partition++)
6104faabf0Stsutsui printf(" %d %d %d\t%d\t%d\n", i, partition->tag,
6204faabf0Stsutsui partition->flags, partition->start_sector,
6304faabf0Stsutsui partition->nsectors);
6404faabf0Stsutsui
6504faabf0Stsutsui return 0;
6604faabf0Stsutsui }
6704faabf0Stsutsui
6804faabf0Stsutsui int
cmd_ls(int argc,char * argp[],int interactive)6904faabf0Stsutsui cmd_ls(int argc, char *argp[], int interactive)
7004faabf0Stsutsui {
7104faabf0Stsutsui int i;
7204faabf0Stsutsui
7304faabf0Stsutsui if (argc < 2) {
7404faabf0Stsutsui printf("ls partition\n");
7504faabf0Stsutsui return 1;
7604faabf0Stsutsui }
7704faabf0Stsutsui
7804faabf0Stsutsui if (!read_vtoc())
7904faabf0Stsutsui return 1;
8004faabf0Stsutsui
8104faabf0Stsutsui i = strtoul(argp[1], 0, 0);
8204faabf0Stsutsui if (i < 0 || i >= VTOC_MAXPARTITIONS)
8304faabf0Stsutsui return 1;
8404faabf0Stsutsui
8504faabf0Stsutsui if (!device_attach(-1, -1, i))
8604faabf0Stsutsui return 1;
8704faabf0Stsutsui switch (fstype(i)) {
8804faabf0Stsutsui case FSTYPE_BFS:
8904faabf0Stsutsui bfs_ls();
9004faabf0Stsutsui break;
9104faabf0Stsutsui default:
92*c2e8ce64Stsutsui ls("/");
93*c2e8ce64Stsutsui break;
9404faabf0Stsutsui }
9504faabf0Stsutsui
9604faabf0Stsutsui return 0;
9704faabf0Stsutsui }
9804faabf0Stsutsui
9904faabf0Stsutsui void
bfs_ls(void)10004faabf0Stsutsui bfs_ls(void)
10104faabf0Stsutsui {
10204faabf0Stsutsui struct bfs *bfs;
10304faabf0Stsutsui struct bfs_dirent *file;
10404faabf0Stsutsui struct bfs_inode *inode;
10504faabf0Stsutsui int i;
10604faabf0Stsutsui
10704faabf0Stsutsui if (!DEVICE_CAPABILITY.disk_enabled)
10804faabf0Stsutsui return;
10904faabf0Stsutsui
11004faabf0Stsutsui if (bfs_init(&bfs) != 0)
11104faabf0Stsutsui return;
11204faabf0Stsutsui
11304faabf0Stsutsui for (file = bfs->dirent, i = 0; i < bfs->max_dirent; i++, file++) {
11404faabf0Stsutsui if (file->inode != 0) {
11504faabf0Stsutsui inode = &bfs->inode[file->inode - BFS_ROOT_INODE];
11604faabf0Stsutsui printf("%s\t%d (%d-%d)\n", file->name,
11704faabf0Stsutsui bfs_file_size(inode), inode->start_sector,
11804faabf0Stsutsui inode->end_sector);
11904faabf0Stsutsui }
12004faabf0Stsutsui }
12104faabf0Stsutsui
12204faabf0Stsutsui bfs_fini(bfs);
12304faabf0Stsutsui }
12404faabf0Stsutsui
12504faabf0Stsutsui int
fstype(int partition)12604faabf0Stsutsui fstype(int partition)
12704faabf0Stsutsui {
12804faabf0Stsutsui struct ux_partition *p;
12904faabf0Stsutsui
13004faabf0Stsutsui if (!read_vtoc())
13104faabf0Stsutsui return -1;
13204faabf0Stsutsui
13304faabf0Stsutsui if (partition < 0 || partition >= VTOC_MAXPARTITIONS)
13404faabf0Stsutsui return -1;
13504faabf0Stsutsui
13604faabf0Stsutsui p = &vtoc.partition[partition];
13704faabf0Stsutsui if (p->tag == VTOC_TAG_STAND)
13804faabf0Stsutsui return FSTYPE_BFS;
13904faabf0Stsutsui
14004faabf0Stsutsui if ((p->flags & VTOC_FLAG_UNMOUNT) == 0)
14104faabf0Stsutsui return FSTYPE_UFS; /* possibly */
14204faabf0Stsutsui
14304faabf0Stsutsui return -1;
14404faabf0Stsutsui }
14504faabf0Stsutsui
146712239e3Sthorpej bool
find_partition_start(int partition,int * sector)14704faabf0Stsutsui find_partition_start(int partition, int *sector)
14804faabf0Stsutsui {
14904faabf0Stsutsui
15004faabf0Stsutsui if (!read_vtoc())
15116ed6645Sthorpej return false;
15204faabf0Stsutsui
15304faabf0Stsutsui *sector = pdinfo.logical_sector +
15404faabf0Stsutsui vtoc.partition[partition].start_sector;
15504faabf0Stsutsui printf("[partition=%d, start sector=%d]", partition, *sector);
15604faabf0Stsutsui
15716ed6645Sthorpej return true;
15804faabf0Stsutsui }
15904faabf0Stsutsui
160712239e3Sthorpej bool
read_vtoc(void)16104faabf0Stsutsui read_vtoc(void)
16204faabf0Stsutsui {
16304faabf0Stsutsui
16404faabf0Stsutsui if (!DEVICE_CAPABILITY.disk_enabled)
16516ed6645Sthorpej return false;
16604faabf0Stsutsui
16704faabf0Stsutsui if (vtoc_readed)
16816ed6645Sthorpej return true;
16904faabf0Stsutsui
17004faabf0Stsutsui if (!pdinfo_sector(0, &pdinfo)) {
17104faabf0Stsutsui printf("no PDINFO\n");
17216ed6645Sthorpej return false;
17304faabf0Stsutsui }
17404faabf0Stsutsui
17504faabf0Stsutsui if (!vtoc_sector(0, &vtoc, pdinfo.logical_sector)) {
17604faabf0Stsutsui printf("no VTOC\n");
17716ed6645Sthorpej return false;
17804faabf0Stsutsui }
17916ed6645Sthorpej vtoc_readed = true;
18004faabf0Stsutsui
18116ed6645Sthorpej return true;
18204faabf0Stsutsui }
183