menu_fdisk.c revision e998e519114d9176339a9115abd802dfdebde87f
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER START
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The contents of this file are subject to the terms of the
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * Common Development and Distribution License (the "License").
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * You may not use this file except in compliance with the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fa9e4066f08beec538e775443c5be79dd423fcabahrens * or http://www.opensolaris.org/os/licensing.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * See the License for the specific language governing permissions
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and limitations under the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * When distributing Covered Code, include this CDDL HEADER in each
fa9e4066f08beec538e775443c5be79dd423fcabahrens * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If applicable, add the following below this CDDL HEADER, with the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * fields enclosed by brackets "[]" replaced with your own identifying
fa9e4066f08beec538e775443c5be79dd423fcabahrens * information: Portions Copyright [yyyy] [name of copyright owner]
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER END
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
99653d4ee642c6528e88224f12409a5f23060994eschrock/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * Use is subject to license terms.
f83b46baf98d276f5f84fa84c8b461f412ac1f5ePaul Dagnelie */
b327cd3f3b4dab4f29e7140159b1e01ed2ceef2aIgor Kozhukhov
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * This file contains functions that implement the fdisk menu commands.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "global.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <errno.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/time.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/resource.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/wait.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <signal.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <string.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <fcntl.h>
99653d4ee642c6528e88224f12409a5f23060994eschrock#include <stdlib.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/dktp/fdisk.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/stat.h>
99653d4ee642c6528e88224f12409a5f23060994eschrock#include <sys/dklabel.h>
99653d4ee642c6528e88224f12409a5f23060994eschrock#ifdef i386
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <libfdisk.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "main.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "analyze.h"
99653d4ee642c6528e88224f12409a5f23060994eschrock#include "menu.h"
99653d4ee642c6528e88224f12409a5f23060994eschrock#include "menu_command.h"
99653d4ee642c6528e88224f12409a5f23060994eschrock#include "menu_defect.h"
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor#include "menu_partition.h"
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor#include "menu_fdisk.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "param.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "misc.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "label.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "startup.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "partition.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "prompts.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "checkdev.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "io.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "ctlr_scsi.h"
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor#include "auto_sense.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern struct menu_item menu_fdisk[];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Byte swapping macros for accessing struct ipart
fa9e4066f08beec538e775443c5be79dd423fcabahrens * to resolve little endian on Sparc.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#if defined(sparc)
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define les(val) ((((val)&0xFF)<<8)|(((val)>>8)&0xFF))
f94275ce205810a201404c5f35f4cc96057022b1Adam Leventhal#define lel(val) (((unsigned)(les((val)&0x0000FFFF))<<16) | \
fa9e4066f08beec538e775443c5be79dd423fcabahrens (les((unsigned)((val)&0xffff0000)>>16)))
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#elif defined(i386)
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define les(val) (val)
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define lel(val) (val)
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#else /* defined(sparc) */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#error No Platform defined
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif /* defined(sparc) */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* Function prototypes */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef __STDC__
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock#if defined(sparc)
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int getbyte(uchar_t **);
99653d4ee642c6528e88224f12409a5f23060994eschrockstatic int getlong(uchar_t **);
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif /* defined(sparc) */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int get_solaris_part(int fd, struct ipart *ipart);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#else /* __STDC__ */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#if defined(sparc)
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int getbyte();
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int getlong();
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif /* defined(sparc) */
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int get_solaris_part();
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif /* __STDC__ */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef i386
fa9e4066f08beec538e775443c5be79dd423fcabahrensint extpart_init(ext_part_t **epp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock/*
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock * Handling the alignment problem of struct ipart.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockstatic void
99653d4ee642c6528e88224f12409a5f23060994eschrockfill_ipart(char *bootptr, struct ipart *partp)
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock{
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock#if defined(sparc)
99653d4ee642c6528e88224f12409a5f23060994eschrock /*
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * Sparc platform:
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock *
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock * Packing short/word for struct ipart to resolve
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock * little endian on Sparc since it is not
fa9e4066f08beec538e775443c5be79dd423fcabahrens * properly aligned on Sparc.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens partp->bootid = getbyte((uchar_t **)&bootptr);
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock partp->beghead = getbyte((uchar_t **)&bootptr);
fa9e4066f08beec538e775443c5be79dd423fcabahrens partp->begsect = getbyte((uchar_t **)&bootptr);
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor partp->begcyl = getbyte((uchar_t **)&bootptr);
99653d4ee642c6528e88224f12409a5f23060994eschrock partp->systid = getbyte((uchar_t **)&bootptr);
fa9e4066f08beec538e775443c5be79dd423fcabahrens partp->endhead = getbyte((uchar_t **)&bootptr);
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock partp->endsect = getbyte((uchar_t **)&bootptr);
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock partp->endcyl = getbyte((uchar_t **)&bootptr);
03a818bc5cc6f80c183dfb3334f4d0ff2ab36fccmmusante partp->relsect = getlong((uchar_t **)&bootptr);
fa9e4066f08beec538e775443c5be79dd423fcabahrens partp->numsect = getlong((uchar_t **)&bootptr);
03a818bc5cc6f80c183dfb3334f4d0ff2ab36fccmmusante#elif defined(i386)
03a818bc5cc6f80c183dfb3334f4d0ff2ab36fccmmusante /*
03a818bc5cc6f80c183dfb3334f4d0ff2ab36fccmmusante * i386 platform:
03a818bc5cc6f80c183dfb3334f4d0ff2ab36fccmmusante *
03a818bc5cc6f80c183dfb3334f4d0ff2ab36fccmmusante * The fdisk table does not begin on a 4-byte boundary within
03a818bc5cc6f80c183dfb3334f4d0ff2ab36fccmmusante * the master boot record; so, we need to recopy its contents
03a818bc5cc6f80c183dfb3334f4d0ff2ab36fccmmusante * to another data structure to avoid an alignment exception.
03a818bc5cc6f80c183dfb3334f4d0ff2ab36fccmmusante */
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock (void) bcopy(bootptr, partp, sizeof (struct ipart));
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock#else
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock#error No Platform defined
46657f8d750bdb71753495ce2919170f126b8e34mmusante#endif /* defined(sparc) */
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock}
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock
181c2f42873ba1b0fdc4d0470593ad30176af1f0mmusante/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Get a correct byte/short/word routines for Sparc platform.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#if defined(sparc)
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrockgetbyte(uchar_t **bp)
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int b;
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock b = **bp;
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock *bp = *bp + 1;
181c2f42873ba1b0fdc4d0470593ad30176af1f0mmusante return (b);
181c2f42873ba1b0fdc4d0470593ad30176af1f0mmusante}
181c2f42873ba1b0fdc4d0470593ad30176af1f0mmusante
181c2f42873ba1b0fdc4d0470593ad30176af1f0mmusante#ifdef DEADCODE
181c2f42873ba1b0fdc4d0470593ad30176af1f0mmusantestatic int
181c2f42873ba1b0fdc4d0470593ad30176af1f0mmusantegetshort(uchar_t **bp)
181c2f42873ba1b0fdc4d0470593ad30176af1f0mmusante{
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock int b;
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens b = ((**bp) << 8) | *(*bp + 1);
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock *bp += 2;
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (b);
181c2f42873ba1b0fdc4d0470593ad30176af1f0mmusante}
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif /* DEADCODE */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
8488aeb5df27784d479c16cde06a9e25cd9a1152taylorstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensgetlong(uchar_t **bp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int b, bh, bl;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor bh = ((**bp) << 8) | *(*bp + 1);
99653d4ee642c6528e88224f12409a5f23060994eschrock *bp += 2;
fa9e4066f08beec538e775443c5be79dd423fcabahrens bl = ((**bp) << 8) | *(*bp + 1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens *bp += 2;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens b = (bh << 16) | bl;
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (b);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif /* defined(sparc) */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Convert cn[tn]dn to cn[tn]dns2 path
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrockstatic void
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrockget_sname(char *name)
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock{
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock char buf[MAXPATHLEN];
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock char *devp = "/dev/dsk";
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *rdevp = "/dev/rdsk";
fa9e4066f08beec538e775443c5be79dd423fcabahrens char np[MAXNAMELEN];
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock char *npt;
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock /*
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock * If it is a full path /dev/[r]dsk/cn[tn]dn, use this path
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock */
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock (void) strcpy(np, cur_disk->disk_name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strncmp(rdevp, cur_disk->disk_name, strlen(rdevp)) == 0 ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens strncmp(devp, cur_disk->disk_name, strlen(devp)) == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Skip if the path is already included with sN
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strchr(np, 's') == strrchr(np, 's')) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens npt = strrchr(np, 'p');
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* If pN is found, do not include it */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (npt != NULL) {
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock *npt = '\0';
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) snprintf(buf, sizeof (buf), "%ss2", np);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) snprintf(buf, sizeof (buf), "%s", np);
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock }
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock } else {
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock (void) snprintf(buf, sizeof (buf), "/dev/rdsk/%ss2", np);
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock }
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock (void) strcpy(name, buf);
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Convert cn[tn]dnsn to cn[tn]dnp0 path
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void
fa9e4066f08beec538e775443c5be79dd423fcabahrensget_pname(char *name)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens char buf[MAXPATHLEN];
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *devp = "/dev/dsk";
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *rdevp = "/dev/rdsk";
99653d4ee642c6528e88224f12409a5f23060994eschrock char np[MAXNAMELEN];
99653d4ee642c6528e88224f12409a5f23060994eschrock char *npt;
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
99653d4ee642c6528e88224f12409a5f23060994eschrock * If it is a full path /dev/[r]dsk/cn[tn]dnsn, use this path
99653d4ee642c6528e88224f12409a5f23060994eschrock */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (cur_disk == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strcpy(np, x86_devname);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strcpy(np, cur_disk->disk_name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strncmp(rdevp, np, strlen(rdevp)) == 0 ||
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock strncmp(devp, np, strlen(devp)) == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor * Skip if the path is already included with pN
99653d4ee642c6528e88224f12409a5f23060994eschrock */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strchr(np, 'p') == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens npt = strrchr(np, 's');
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* If sN is found, do not include it */
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock if (isdigit(*++npt)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens *--npt = '\0';
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) snprintf(buf, sizeof (buf), "%sp0", np);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) snprintf(buf, sizeof (buf), "%s", np);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock (void) snprintf(buf, sizeof (buf), "/dev/rdsk/%sp0", np);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock (void) strcpy(name, buf);
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
99653d4ee642c6528e88224f12409a5f23060994eschrock * Open file descriptor for current disk (cur_file)
fa9e4066f08beec538e775443c5be79dd423fcabahrens * with "p0" path or cur_disk->disk_path
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrensopen_cur_file(int mode)
181c2f42873ba1b0fdc4d0470593ad30176af1f0mmusante{
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *dkpath;
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor char pbuf[MAXPATHLEN];
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (mode) {
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock case FD_USE_P0_PATH:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) get_pname(&pbuf[0]);
fa9e4066f08beec538e775443c5be79dd423fcabahrens dkpath = pbuf;
181c2f42873ba1b0fdc4d0470593ad30176af1f0mmusante break;
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock case FD_USE_CUR_DISK_PATH:
99653d4ee642c6528e88224f12409a5f23060994eschrock if (cur_disk->fdisk_part.systid == SUNIXOS ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_disk->fdisk_part.systid == SUNIXOS2) {
181c2f42873ba1b0fdc4d0470593ad30176af1f0mmusante (void) get_sname(&pbuf[0]);
181c2f42873ba1b0fdc4d0470593ad30176af1f0mmusante dkpath = pbuf;
181c2f42873ba1b0fdc4d0470593ad30176af1f0mmusante } else {
181c2f42873ba1b0fdc4d0470593ad30176af1f0mmusante dkpath = cur_disk->disk_path;
181c2f42873ba1b0fdc4d0470593ad30176af1f0mmusante }
181c2f42873ba1b0fdc4d0470593ad30176af1f0mmusante break;
181c2f42873ba1b0fdc4d0470593ad30176af1f0mmusante default:
181c2f42873ba1b0fdc4d0470593ad30176af1f0mmusante err_print("Error: Invalid mode option for opening "
181c2f42873ba1b0fdc4d0470593ad30176af1f0mmusante "cur_file\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens fullabort();
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock /* Close previous cur_file */
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock (void) close(cur_file);
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock /* Open cur_file with the required path dkpath */
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock if ((cur_file = open_disk(dkpath, O_RDWR | O_NDELAY)) < 0) {
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock err_print(
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock "Error: can't open selected disk '%s'.\n", dkpath);
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock fullabort();
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock }
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock}
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock/*
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock * This routine implements the 'fdisk' command. It simply runs
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock * the fdisk command on the current disk.
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock * Use of this is restricted to interactive mode only.
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock */
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrockint
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrockc_fdisk()
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock{
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock
46a2abf27af40eda17a3f97e79eda1aef4e3c3c8eschrock char buf[MAXPATHLEN];
99653d4ee642c6528e88224f12409a5f23060994eschrock char pbuf[MAXPATHLEN];
99653d4ee642c6528e88224f12409a5f23060994eschrock struct stat statbuf;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock /*
99653d4ee642c6528e88224f12409a5f23060994eschrock * We must be in interactive mode to use the fdisk command
99653d4ee642c6528e88224f12409a5f23060994eschrock */
99653d4ee642c6528e88224f12409a5f23060994eschrock if (option_f != (char *)NULL || isatty(0) != 1 || isatty(1) != 1) {
99653d4ee642c6528e88224f12409a5f23060994eschrock err_print("Fdisk command is for interactive use only!\n");
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock /*
99653d4ee642c6528e88224f12409a5f23060994eschrock * There must be a current disk type and a current disk
99653d4ee642c6528e88224f12409a5f23060994eschrock */
99653d4ee642c6528e88224f12409a5f23060994eschrock if (cur_dtype == NULL) {
99653d4ee642c6528e88224f12409a5f23060994eschrock err_print("Current Disk Type is not set.\n");
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Before running the fdisk command, get file status of
fa9e4066f08beec538e775443c5be79dd423fcabahrens * /dev/rdsk/cn[tn]dnp0 path to see if this disk
fa9e4066f08beec538e775443c5be79dd423fcabahrens * supports fixed disk partition table.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) get_pname(&pbuf[0]);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (stat(pbuf, (struct stat *)&statbuf) == -1 ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens !S_ISCHR(statbuf.st_mode)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens err_print(
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor "Disk does not support fixed disk partition table\n");
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor return (0);
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor }
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor /*
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor * Run the fdisk program.
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor */
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor (void) snprintf(buf, sizeof (buf), "fdisk %s\n", pbuf);
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor (void) system(buf);
99653d4ee642c6528e88224f12409a5f23060994eschrock
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Open cur_file with "p0" path for accessing the fdisk table
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor */
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor (void) open_cur_file(FD_USE_P0_PATH);
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor * Get solaris partition information in the fdisk partition table
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews */
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor if (get_solaris_part(cur_file, &cur_disk->fdisk_part) == -1) {
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor err_print("No fdisk solaris partition found\n");
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor cur_disk->fdisk_part.numsect = 0; /* No Solaris */
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor }
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor /*
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor * Restore cur_file with cur_disk->disk_path
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor */
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor (void) open_cur_file(FD_USE_CUR_DISK_PATH);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Read MBR on the disk
fa9e4066f08beec538e775443c5be79dd423fcabahrens * if the Solaris partition has changed,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * reread the vtoc
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef DEADCODE
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void
8488aeb5df27784d479c16cde06a9e25cd9a1152taylorupdate_cur_parts()
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin{
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens register struct partition_info *parts;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < NDKMAP; i++) {
99653d4ee642c6528e88224f12409a5f23060994eschrock#if defined(_SUNOS_VTOC_16)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (cur_parts->vtoc.v_part[i].p_tag &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_parts->vtoc.v_part[i].p_tag != V_ALTSCTR) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_parts->vtoc.v_part[i].p_start = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_parts->vtoc.v_part[i].p_size = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_parts->pinfo_map[i].dkl_nblk = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_parts->pinfo_map[i].dkl_cylno = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_parts->vtoc.v_part[i].p_tag =
fa9e4066f08beec538e775443c5be79dd423fcabahrens default_vtoc_map[i].p_tag;
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_parts->vtoc.v_part[i].p_flag =
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor default_vtoc_map[i].p_flag;
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor#if defined(_SUNOS_VTOC_16)
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_parts->pinfo_map[C_PARTITION].dkl_nblk = ncyl * spc();
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#if defined(_SUNOS_VTOC_16)
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Adjust for the boot partitions
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_parts->pinfo_map[I_PARTITION].dkl_nblk = spc();
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_parts->pinfo_map[I_PARTITION].dkl_cylno = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_parts->vtoc.v_part[C_PARTITION].p_start =
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_parts->pinfo_map[C_PARTITION].dkl_cylno * nhead * nsect;
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_parts->vtoc.v_part[C_PARTITION].p_size =
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews cur_parts->pinfo_map[C_PARTITION].dkl_nblk;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor cur_parts->vtoc.v_part[I_PARTITION].p_start =
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor cur_parts->pinfo_map[I_PARTITION].dkl_cylno;
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_parts->vtoc.v_part[I_PARTITION].p_size =
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_parts->pinfo_map[I_PARTITION].dkl_nblk;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif /* defined(_SUNOS_VTOC_16) */
fa9e4066f08beec538e775443c5be79dd423fcabahrens parts = cur_dtype->dtype_plist;
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_dtype->dtype_ncyl = ncyl;
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_dtype->dtype_plist = cur_parts;
fa9e4066f08beec538e775443c5be79dd423fcabahrens parts->pinfo_name = cur_parts->pinfo_name;
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_disk->disk_parts = cur_parts;
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_ctype->ctype_dlist = cur_dtype;
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif /* DEADCODE */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensget_solaris_part(int fd, struct ipart *ipart)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct ipart ip;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int status;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *mbr;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *bootptr;
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct dk_label update_label;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ushort_t found = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef i386
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t relsec, numsec;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int pno, rval, ext_part_found = 0;
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor ext_part_t *epp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) lseek(fd, 0, 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * We may get mbr of different size, but the first 512 bytes
fa9e4066f08beec538e775443c5be79dd423fcabahrens * are valid information.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens mbr = malloc(cur_blksz);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mbr == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens err_print("No memory available.\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (-1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens status = read(fd, mbr, cur_blksz);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (status != cur_blksz) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens err_print("Bad read of fdisk partition. Status = %x\n", status);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin err_print("Cannot read fdisk partition information.\n");
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock free(mbr);
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock return (-1);
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) memcpy(&boot_sec, mbr, sizeof (struct mboot));
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(mbr);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef i386
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) extpart_init(&epp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < FD_NUMPART; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ipc;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens ipc = i * sizeof (struct ipart);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Handling the alignment problem of struct ipart */
fa9e4066f08beec538e775443c5be79dd423fcabahrens bootptr = &boot_sec.parts[ipc];
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fill_ipart(bootptr, &ip);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef i386
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (fdisk_is_dos_extended(ip.systid) && (ext_part_found == 0)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* We support only one extended partition per disk */
fa9e4066f08beec538e775443c5be79dd423fcabahrens ext_part_found = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens rval = fdisk_get_solaris_part(epp, &pno, &relsec,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &numsec);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (rval == FDISK_SUCCESS) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Found a solaris partition inside the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * extended partition. Update the statistics.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nhead != 0 && nsect != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens pcyl = numsec / (nhead * nsect);
fa9e4066f08beec538e775443c5be79dd423fcabahrens xstart = relsec / (nhead * nsect);
fa9e4066f08beec538e775443c5be79dd423fcabahrens ncyl = pcyl - acyl;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens solaris_offset = relsec;
fa9e4066f08beec538e775443c5be79dd423fcabahrens found = 2;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ip.bootid = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ip.beghead = ip.begsect = ip.begcyl = 0xff;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ip.endhead = ip.endsect = ip.endcyl = 0xff;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ip.systid = SUNIXOS2;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ip.relsect = relsec;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ip.numsect = numsec;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ipart->bootid = ip.bootid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens status = bcmp(&ip, ipart,
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (struct ipart));
fa9e4066f08beec538e775443c5be79dd423fcabahrens bcopy(&ip, ipart, sizeof (struct ipart));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens continue;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * we are interested in Solaris and EFI partition types
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef i386
99653d4ee642c6528e88224f12409a5f23060994eschrock if ((ip.systid == SUNIXOS &&
99653d4ee642c6528e88224f12409a5f23060994eschrock (fdisk_is_linux_swap(epp, lel(ip.relsect), NULL) != 0)) ||
99653d4ee642c6528e88224f12409a5f23060994eschrock ip.systid == SUNIXOS2 ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens ip.systid == EFI_PMBR) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens#else
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor if (ip.systid == SUNIXOS ||
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor ip.systid == SUNIXOS2 ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens ip.systid == EFI_PMBR) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * if the disk has an EFI label, nhead and nsect may
fa9e4066f08beec538e775443c5be79dd423fcabahrens * be zero. This test protects us from FPE's, and
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor * format still seems to work fine
99653d4ee642c6528e88224f12409a5f23060994eschrock */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nhead != 0 && nsect != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens pcyl = lel(ip.numsect) / (nhead * nsect);
fa9e4066f08beec538e775443c5be79dd423fcabahrens xstart = lel(ip.relsect) / (nhead * nsect);
fa9e4066f08beec538e775443c5be79dd423fcabahrens ncyl = pcyl - acyl;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef DEBUG
fa9e4066f08beec538e775443c5be79dd423fcabahrens else {
b327cd3f3b4dab4f29e7140159b1e01ed2ceef2aIgor Kozhukhov err_print("Critical geometry values are zero:\n"
b327cd3f3b4dab4f29e7140159b1e01ed2ceef2aIgor Kozhukhov "\tnhead = %d; nsect = %d\n", nhead, nsect);
b327cd3f3b4dab4f29e7140159b1e01ed2ceef2aIgor Kozhukhov }
99653d4ee642c6528e88224f12409a5f23060994eschrock#endif /* DEBUG */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens solaris_offset = (uint_t)lel(ip.relsect);
fa9e4066f08beec538e775443c5be79dd423fcabahrens found = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin#ifdef i386
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin libfdisk_fini(&epp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin if (!found) {
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin err_print("Solaris fdisk partition not found\n");
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin return (-1);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin } else if (found == 1) {
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin /*
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * Found a primary solaris partition.
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * compare the previous and current Solaris partition
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * but don't use bootid in determination of Solaris partition
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * changes
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin */
fa9e4066f08beec538e775443c5be79dd423fcabahrens ipart->bootid = ip.bootid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens status = bcmp(&ip, ipart, sizeof (struct ipart));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens bcopy(&ip, ipart, sizeof (struct ipart));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock /* if the disk partitioning has changed - get the VTOC */
99653d4ee642c6528e88224f12409a5f23060994eschrock if (status) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct extvtoc exvtoc;
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct vtoc vtoc;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens status = ioctl(fd, DKIOCGEXTVTOC, &exvtoc);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (status == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens i = errno;
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Try the old ioctl DKIOCGVTOC */
fa9e4066f08beec538e775443c5be79dd423fcabahrens status = ioctl(fd, DKIOCGVTOC, &vtoc);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (status == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens err_print("Bad ioctl DKIOCGEXTVTOC.\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens err_print("errno=%d %s\n", i, strerror(i));
fa9e4066f08beec538e775443c5be79dd423fcabahrens err_print("Cannot read vtoc information.\n");
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock status = read_label(fd, &update_label);
99653d4ee642c6528e88224f12409a5f23060994eschrock if (status == -1) {
99653d4ee642c6528e88224f12409a5f23060994eschrock err_print("Cannot read label information.\n");
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock /* copy vtoc information */
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_parts->vtoc = update_label.dkl_vtoc;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin#if defined(_SUNOS_VTOC_16)
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * this is to update the slice table on x86
fa9e4066f08beec538e775443c5be79dd423fcabahrens * we don't care about VTOC8 here
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < NDKMAP; i ++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_parts->pinfo_map[i].dkl_cylno =
fa9e4066f08beec538e775443c5be79dd423fcabahrens update_label.dkl_vtoc.v_part[i].p_start /
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((int)(update_label.dkl_nhead *
fa9e4066f08beec538e775443c5be79dd423fcabahrens update_label.dkl_nsect));
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_parts->pinfo_map[i].dkl_nblk =
fa9e4066f08beec538e775443c5be79dd423fcabahrens update_label.dkl_vtoc.v_part[i].p_size;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif /* defined(_SUNOS_VTOC_16) */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock cur_dtype->dtype_ncyl = update_label.dkl_ncyl;
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_dtype->dtype_pcyl = update_label.dkl_pcyl;
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_dtype->dtype_acyl = update_label.dkl_acyl;
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_dtype->dtype_nhead = update_label.dkl_nhead;
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock cur_dtype->dtype_nsect = update_label.dkl_nsect;
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock ncyl = cur_dtype->dtype_ncyl;
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin acyl = cur_dtype->dtype_acyl;
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock pcyl = cur_dtype->dtype_pcyl;
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock nsect = cur_dtype->dtype_nsect;
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock nhead = cur_dtype->dtype_nhead;
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock }
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock return (0);
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock}
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrockint
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrockcopy_solaris_part(struct ipart *ipart)
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock{
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock int status, i, fd;
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock struct mboot mboot;
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock char *mbr;
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock struct ipart ip;
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock char buf[MAXPATHLEN];
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock char *bootptr;
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock struct stat statbuf;
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef i386
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t relsec, numsec;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int pno, rval, ext_part_found = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ext_part_t *epp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) get_pname(&buf[0]);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (stat(buf, &statbuf) == -1 ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens !S_ISCHR(statbuf.st_mode) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((cur_label == L_TYPE_EFI) &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens (cur_disk->disk_flags & DSK_LABEL_DIRTY))) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Make sure to reset solaris_offset to zero if it is
fa9e4066f08beec538e775443c5be79dd423fcabahrens * previously set by a selected disk that
fa9e4066f08beec538e775443c5be79dd423fcabahrens * supports the fdisk table.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens solaris_offset = 0;
99653d4ee642c6528e88224f12409a5f23060994eschrock /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Return if this disk does not support fdisk table or
fa9e4066f08beec538e775443c5be79dd423fcabahrens * if it uses an EFI label but has not yet been labelled.
99653d4ee642c6528e88224f12409a5f23060994eschrock * If the EFI label has not been written then the open
fa9e4066f08beec538e775443c5be79dd423fcabahrens * on the partition will fail.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((fd = open(buf, O_RDONLY)) < 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens err_print("Error: can't open disk '%s'.\n", buf);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (-1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * We may get mbr of different size, but the first 512 bytes
fa9e4066f08beec538e775443c5be79dd423fcabahrens * are valid information.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens mbr = malloc(cur_blksz);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mbr == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens err_print("No memory available.\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (-1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens status = read(fd, mbr, cur_blksz);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (status != cur_blksz) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens err_print("Bad read of fdisk partition.\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) close(fd);
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(mbr);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (-1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) memcpy(&mboot, mbr, sizeof (struct mboot));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef i386
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) extpart_init(&epp);
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor#endif
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor for (i = 0; i < FD_NUMPART; i++) {
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor int ipc;
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor
fa9e4066f08beec538e775443c5be79dd423fcabahrens ipc = i * sizeof (struct ipart);
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor /* Handling the alignment problem of struct ipart */
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor bootptr = &mboot.parts[ipc];
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor (void) fill_ipart(bootptr, &ip);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef i386
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (fdisk_is_dos_extended(ip.systid) && (ext_part_found == 0)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* We support only one extended partition per disk */
fa9e4066f08beec538e775443c5be79dd423fcabahrens ext_part_found = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens rval = fdisk_get_solaris_part(epp, &pno, &relsec,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &numsec);
99653d4ee642c6528e88224f12409a5f23060994eschrock if (rval == FDISK_SUCCESS) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Found a solaris partition inside the
99653d4ee642c6528e88224f12409a5f23060994eschrock * extended partition. Update the statistics.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nhead != 0 && nsect != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens pcyl = numsec / (nhead * nsect);
fa9e4066f08beec538e775443c5be79dd423fcabahrens ncyl = pcyl - acyl;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens solaris_offset = relsec;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ip.bootid = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ip.beghead = ip.begsect = ip.begcyl = 0xff;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ip.endhead = ip.endsect = ip.endcyl = 0xff;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ip.systid = SUNIXOS2;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ip.relsect = relsec;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ip.numsect = numsec;
99653d4ee642c6528e88224f12409a5f23060994eschrock bcopy(&ip, ipart, sizeof (struct ipart));
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens continue;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock#ifdef i386
99653d4ee642c6528e88224f12409a5f23060994eschrock if ((ip.systid == SUNIXOS &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens (fdisk_is_linux_swap(epp, lel(ip.relsect), NULL) != 0)) ||
99653d4ee642c6528e88224f12409a5f23060994eschrock ip.systid == SUNIXOS2 ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens ip.systid == EFI_PMBR) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens#else
99653d4ee642c6528e88224f12409a5f23060994eschrock if (ip.systid == SUNIXOS ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens ip.systid == SUNIXOS2 ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens ip.systid == EFI_PMBR) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens solaris_offset = lel(ip.relsect);
fa9e4066f08beec538e775443c5be79dd423fcabahrens bcopy(&ip, ipart, sizeof (struct ipart));
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock /*
99653d4ee642c6528e88224f12409a5f23060994eschrock * if the disk has an EFI label, we typically won't
99653d4ee642c6528e88224f12409a5f23060994eschrock * have values for nhead and nsect. format seems to
99653d4ee642c6528e88224f12409a5f23060994eschrock * work without them, and we need to protect ourselves
99653d4ee642c6528e88224f12409a5f23060994eschrock * from FPE's
99653d4ee642c6528e88224f12409a5f23060994eschrock */
99653d4ee642c6528e88224f12409a5f23060994eschrock if (nhead != 0 && nsect != 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock pcyl = lel(ip.numsect) / (nhead * nsect);
99653d4ee642c6528e88224f12409a5f23060994eschrock ncyl = pcyl - acyl;
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock#ifdef DEBUG
99653d4ee642c6528e88224f12409a5f23060994eschrock else {
99653d4ee642c6528e88224f12409a5f23060994eschrock err_print("Critical geometry values are zero:\n"
99653d4ee642c6528e88224f12409a5f23060994eschrock "\tnhead = %d; nsect = %d\n", nhead, nsect);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif /* DEBUG */
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef i386
fa9e4066f08beec538e775443c5be79dd423fcabahrens libfdisk_fini(&epp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) close(fd);
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(mbr);
99653d4ee642c6528e88224f12409a5f23060994eschrock return (0);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#if defined(_FIRMWARE_NEEDS_FDISK)
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrensauto_solaris_part(struct dk_label *label)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens int status, i, fd;
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct mboot mboot;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *mbr;
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct ipart ip;
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor char *bootptr;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char pbuf[MAXPATHLEN];
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef i386
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor uint32_t relsec, numsec;
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor int pno, rval, ext_part_found = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ext_part_t *epp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) get_pname(&pbuf[0]);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((fd = open_disk(pbuf, O_RDONLY)) < 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens err_print("Error: can't open selected disk '%s'.\n", pbuf);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (-1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * We may get mbr of different size, but the first 512 bytes
fa9e4066f08beec538e775443c5be79dd423fcabahrens * are valid information.
99653d4ee642c6528e88224f12409a5f23060994eschrock */
fa9e4066f08beec538e775443c5be79dd423fcabahrens mbr = malloc(cur_blksz);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mbr == NULL) {
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor err_print("No memory available.\n");
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor return (-1);
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor }
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor status = read(fd, mbr, cur_blksz);
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor if (status != cur_blksz) {
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor err_print("Bad read of fdisk partition.\n");
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor free(mbr);
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor return (-1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin (void) memcpy(&mboot, mbr, sizeof (struct mboot));
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin#ifdef i386
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin (void) extpart_init(&epp);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin#endif
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin for (i = 0; i < FD_NUMPART; i++) {
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin int ipc;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens ipc = i * sizeof (struct ipart);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Handling the alignment problem of struct ipart */
99653d4ee642c6528e88224f12409a5f23060994eschrock bootptr = &mboot.parts[ipc];
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fill_ipart(bootptr, &ip);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef i386
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (fdisk_is_dos_extended(ip.systid) && (ext_part_found == 0)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* We support only one extended partition per disk */
fa9e4066f08beec538e775443c5be79dd423fcabahrens ext_part_found = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens rval = fdisk_get_solaris_part(epp, &pno, &relsec,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &numsec);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (rval == FDISK_SUCCESS) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
99653d4ee642c6528e88224f12409a5f23060994eschrock * Found a solaris partition inside the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * extended partition. Update the statistics.
99653d4ee642c6528e88224f12409a5f23060994eschrock */
99653d4ee642c6528e88224f12409a5f23060994eschrock if ((label->dkl_nhead != 0) &&
99653d4ee642c6528e88224f12409a5f23060994eschrock (label->dkl_nsect != 0)) {
99653d4ee642c6528e88224f12409a5f23060994eschrock label->dkl_pcyl =
99653d4ee642c6528e88224f12409a5f23060994eschrock numsec / (label->dkl_nhead *
99653d4ee642c6528e88224f12409a5f23060994eschrock label->dkl_nsect);
99653d4ee642c6528e88224f12409a5f23060994eschrock label->dkl_ncyl = label->dkl_pcyl -
99653d4ee642c6528e88224f12409a5f23060994eschrock label->dkl_acyl;
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock solaris_offset = relsec;
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock continue;
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock#endif
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * if the disk has an EFI label, the nhead and nsect fields
fa9e4066f08beec538e775443c5be79dd423fcabahrens * the label may be zero. This protects us from FPE's, and
fa9e4066f08beec538e775443c5be79dd423fcabahrens * format still seems to work happily
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef i386
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((ip.systid == SUNIXOS &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens (fdisk_is_linux_swap(epp, lel(ip.relsect), NULL) != 0)) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens ip.systid == SUNIXOS2 ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens ip.systid == EFI_PMBR) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens#else
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (ip.systid == SUNIXOS ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens ip.systid == SUNIXOS2 ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens ip.systid == EFI_PMBR) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((label->dkl_nhead != 0) &&
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor (label->dkl_nsect != 0)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens label->dkl_pcyl = lel(ip.numsect) /
fa9e4066f08beec538e775443c5be79dd423fcabahrens (label->dkl_nhead * label->dkl_nsect);
fa9e4066f08beec538e775443c5be79dd423fcabahrens label->dkl_ncyl = label->dkl_pcyl -
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor label->dkl_acyl;
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor }
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef DEBUG
fa9e4066f08beec538e775443c5be79dd423fcabahrens else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens err_print("Critical label fields aren't "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "non-zero:\n"
fa9e4066f08beec538e775443c5be79dd423fcabahrens "\tlabel->dkl_nhead = %d; "
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock "label->dkl_nsect = "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "%d\n", label->dkl_nhead,
fa9e4066f08beec538e775443c5be79dd423fcabahrens label->dkl_nsect);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif /* DEBUG */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens solaris_offset = lel(ip.relsect);
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef i386
fa9e4066f08beec538e775443c5be79dd423fcabahrens libfdisk_fini(&epp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) close(fd);
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(mbr);
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif /* defined(_FIRMWARE_NEEDS_FDISK) */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock
afefbcddfd8caf5f3b2da510d9439471ab225040eschrockint
fa9e4066f08beec538e775443c5be79dd423fcabahrensgood_fdisk()
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens char buf[MAXPATHLEN];
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct stat statbuf;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor (void) get_pname(&buf[0]);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (stat(buf, &statbuf) == -1 ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens !S_ISCHR(statbuf.st_mode) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_label == L_TYPE_EFI) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Return if this disk does not support fdisk table or
fa9e4066f08beec538e775443c5be79dd423fcabahrens * if the disk is labeled with EFI.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (lel(cur_disk->fdisk_part.numsect) > 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens err_print("WARNING - ");
fa9e4066f08beec538e775443c5be79dd423fcabahrens err_print("This disk may be in use by an application "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "that has\n\t modified the fdisk table. Ensure "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "that this disk is\n\t not currently in use "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "before proceeding to use fdisk.\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef i386
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrensextpart_init(ext_part_t **epp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int rval, lf_op_flag = 0;
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock char p0_path[MAXPATHLEN];
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock get_pname(&p0_path[0]);
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock lf_op_flag |= FDISK_READ_DISK;
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock if ((rval = libfdisk_init(epp, p0_path, NULL, lf_op_flag)) !=
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock FDISK_SUCCESS) {
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock switch (rval) {
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * FDISK_EBADLOGDRIVE and FDISK_ENOLOGDRIVE can
fa9e4066f08beec538e775443c5be79dd423fcabahrens * be considered as soft errors and hence
fa9e4066f08beec538e775443c5be79dd423fcabahrens * we do not exit
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens case FDISK_EBADLOGDRIVE:
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor case FDISK_ENOLOGDRIVE:
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case FDISK_ENOVGEOM:
99653d4ee642c6528e88224f12409a5f23060994eschrock err_print("Could not get virtual geometry for"
99653d4ee642c6528e88224f12409a5f23060994eschrock " this device\n");
99653d4ee642c6528e88224f12409a5f23060994eschrock fullabort();
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor break;
99653d4ee642c6528e88224f12409a5f23060994eschrock case FDISK_ENOPGEOM:
99653d4ee642c6528e88224f12409a5f23060994eschrock err_print("Could not get physical geometry for"
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan " this device\n");
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan fullabort();
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan break;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan case FDISK_ENOLGEOM:
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan err_print("Could not get label geometry for "
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan " this device\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens fullabort();
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens default:
99653d4ee642c6528e88224f12409a5f23060994eschrock err_print("Failed to initialise libfdisk.\n");
99653d4ee642c6528e88224f12409a5f23060994eschrock fullabort();
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock return (0);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock#endif
3ccfa83cd9cddd1e34808ba18082c156758c5ec8ahrens