1#!/bin/sh
2#-
3# SPDX-License-Identifier: BSD-2-Clause-FreeBSD
4#
5# Copyright (c) 2010 iXsystems, Inc.  All rights reserved.
6#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions
9# are met:
10# 1. Redistributions of source code must retain the above copyright
11#    notice, this list of conditions and the following disclaimer.
12# 2. Redistributions in binary form must reproduce the above copyright
13#    notice, this list of conditions and the following disclaimer in the
14#    documentation and/or other materials provided with the distribution.
15#
16# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26# SUCH DAMAGE.
27#
28# $FreeBSD$
29
30# Create partitions on a target disk
31#############################
32
33. ${PROGDIR}/backend/functions.sh
34
35if [ -z "${1}" ] ; then
36  echo "Error: No disk specified!"
37  exit 1
38fi
39
40if [ -z "${2}" ] ; then
41  echo "Error: No size specified!"
42  exit 1
43fi
44
45if [ ! -e "/dev/${1}" ] ; then
46  echo "Error: Disk /dev/${1} does not exist!"
47  exit 1
48fi
49
50DISK="${1}"
51MB="${2}"
52TYPE="${3}"
53STARTBLOCK="${4}"
54
55TOTALBLOCKS="`expr $MB \* 2048`"
56
57# If no TYPE specified, default to MBR
58if [ -z "$TYPE" ] ; then TYPE="mbr" ; fi
59
60# Sanity check the gpart type
61case $TYPE in
62	apm|APM) ;;
63	bsd|BSD) ;;
64	ebr|EBR) ;;
65	gpt|GPT) ;;
66	mbr|MBR) ;;
67    vtoc8|VTOC8) ;;
68	*) echo "Error: Unknown gpart type: $TYPE" ; exit 1 ;;
69esac
70
71# Lets figure out what number this partition will be
72LASTSLICE="`gpart show $DISK | grep -v -e $DISK -e '\- free \-' -e '^$' | awk 'END {print $3}'`"
73if [ -z "${LASTSLICE}" ] ; then
74  LASTSLICE="1"
75else
76  LASTSLICE="`expr $LASTSLICE + 1`"
77fi
78
79SLICENUM="${LASTSLICE}"
80
81# Set a 4k Aligned start block if none specified
82if [ "${SLICENUM}" = "1" -a -z "$STARTBLOCK" ] ; then
83  STARTBLOCK="2016"
84fi
85
86
87# If this is an empty disk, see if we need to create a new scheme for it
88gpart show ${DISK} >/dev/null 2>/dev/null
89if [ $? -eq 0 -a "${SLICENUM}" = "1" ] ; then
90  if [ "${TYPE}" = "mbr" -o "${TYPE}" = "MBR" ] ; then 
91    flags="-s ${TYPE} -f active"
92  else
93    flags="-s ${TYPE}"
94  fi
95  gpart create ${flags} ${DISK}
96fi
97
98# If we have a starting block, use it
99if [ -n "$STARTBLOCK" ] ; then
100  sBLOCK="-b $STARTBLOCK"
101fi
102
103gpart add ${sBLOCK} -s ${TOTALBLOCKS} -t freebsd -i ${SLICENUM} ${DISK}
104exit "$?"
105