diff --git a/bsdfdisk/bsdfdisk-lib.pl b/bsdfdisk/bsdfdisk-lib.pl index b8420e121..9889e99e4 100644 --- a/bsdfdisk/bsdfdisk-lib.pl +++ b/bsdfdisk/bsdfdisk-lib.pl @@ -220,11 +220,12 @@ sub execute_fdisk_commands { my ($disk, $cmds) = @_; my $temp = &transname(); -&open_tempfile(TEMP, ">$temp"); +my $fh = "TEMP"; +&open_tempfile($fh, ">$temp"); foreach my $c (@$cmds) { - &print_tempfile(TEMP, $c."\n"); + &print_tempfile($fh, $c."\n"); } -&close_tempfile(TEMP); +&close_tempfile($fh); my $out = &backquote_logged("fdisk -f $temp $disk->{'device'} &1"); my $ex = $?; &unlink_file($temp); @@ -240,4 +241,17 @@ return &execute_fdisk_commands($disk, [ "p $slice->{'number'} 0 0 0" ]); } +# create_slice(&disk, &slice) +# Add a slice to a disk +sub create_slice +{ +my ($disk, $slice) = @_; +my $type = hex($slice->{'type'}); +my $start = int(($slice->{'startblock'} * $disk->{'blocksize'}) / 1024); +my $end = int((($slice->{'startblock'} + $slice->{'blocks'}) * + $disk->{'blocksize'}) / 1024); +return &execute_fdisk_commands($disk, + [ "p $slice->{'number'} $type ${start}K ${end}K" ]); +} + 1; diff --git a/bsdfdisk/create_slice.cgi b/bsdfdisk/create_slice.cgi new file mode 100644 index 000000000..f911dfe19 --- /dev/null +++ b/bsdfdisk/create_slice.cgi @@ -0,0 +1,52 @@ +#!/usr/local/bin/perl +# Actually create a new slice + +use strict; +use warnings; +require './bsdfdisk-lib.pl'; +our (%in, %text, $module_name); +&ReadParse(); +&error_setup($text{'nslice_err'}); + +# Get the disk +my @disks = &list_disks_partitions(); +my ($disk) = grep { $_->{'device'} eq $in{'device'} } @disks; +$disk || &error($text{'disk_egone'}); + +# Validate inputs, starting with slice number +my $slice = { }; +$in{'number'} =~ /^\d+$/ || &error($text{'nslice_enumber'}); +my ($clash) = grep { $_->{'number'} == $in{'number'} } @{$disk->{'slices'}}; +$clash && &error(&text('nslice_eclash', $in{'number'})); +$slice->{'number'} = $in{'number'}; + +# Start and end blocks +$in{'start'} =~ /^\d+$/ || &error($text{'nslice_estart'}); +$in{'end'} =~ /^\d+$/ || &error($text{'nslice_eend'}); +$in{'start'} < $in{'end'} || &error($text{'nslice_erange'}); +$slice->{'startblock'} = $in{'start'}; +$slice->{'blocks'} = $in{'end'} - $in{'start'}; + +# Slice type +$slice->{'type'} = $in{'type'}; + +# Do the creation +&ui_print_header($disk->{'desc'}, $text{'nslice_title'}, ""); + +print &text('nslice_creating', $in{'number'}, $disk->{'desc'}),"
\n"; +my $err = &create_slice($disk, $slice); +if ($err) { + print &text('nslice_failed', $err),"
\n"; + } +else { + print &text('nslice_done'),"
\n"; + } + +if (!$err && $in{'makepart'}) { + # Also create a partition + # XXX + } + +&ui_print_footer("edit_disk.cgi?device=$in{'device'}", + $text{'disk_return'}); + diff --git a/bsdfdisk/lang/en b/bsdfdisk/lang/en index 88813a7ef..0efecef6c 100644 --- a/bsdfdisk/lang/en +++ b/bsdfdisk/lang/en @@ -24,6 +24,7 @@ disk_size=Size disk_dsize=Disk size: $1 disk_model=Make and model: $1 disk_cylinders=Cylinders: $1 +disk_blocks=Blocks: $1 disk_device=Device file: $1 disk_return=list of slices disk_add=Create a new slice. @@ -66,3 +67,13 @@ nslice_start=Starting block nslice_end=Ending block nslice_type=New slice type nslice_makepart=Also create partition? +nslice_err=Failed to create slice +nslice_enumber=Missing or non-numeric slice number +nslice_eclash=A slice with number $1 already exists +nslice_estart=Starting block must be a number +nslice_eend=Ending block must be a number +nslice_erange=Starting block must be lower than the ending block +nslice_emax=Ending block cannot be larger than the disk size of $1 blocks +nslice_creating=Creating slice $1 on $2 .. +nslice_failed=.. slice creation failed : $1 +nslice_done=.. slice added diff --git a/bsdfdisk/slice_form.cgi b/bsdfdisk/slice_form.cgi index 06071c584..81dfeee7a 100644 --- a/bsdfdisk/slice_form.cgi +++ b/bsdfdisk/slice_form.cgi @@ -15,11 +15,12 @@ $disk || &error($text{'disk_egone'}); &ui_print_header($disk->{'desc'}, $text{'nslice_title'}, ""); print &ui_form_start("create_slice.cgi", "post"); +print &ui_hidden("device", $in{'device'}); print &ui_table_start($text{'nslice_header'}, undef, 2); # Slice number (first free) my %used = map { $_->{'number'}, $_ } @{$disk->{'slices'}}; -my $n = 0; +my $n = 1; while($used{$n}) { $n++; } @@ -31,12 +32,11 @@ print &ui_table_row($text{'nslice_diskblocks'}, $disk->{'blocks'}); # Start and end blocks (defaults to last slice+1) -my ($start, $end); +my ($start, $end) = (0, $disk->{'blocks'}); foreach my $s (sort { $a->{'startblock'} cmp $b->{'startblock'} } @{$disk->{'slices'}}) { $start = $s->{'startblock'} + $s->{'blocks'} + 1; } -$end = $disk->{'blocks'} - 1; print &ui_table_row($text{'nslice_start'}, &ui_textbox("start", $start, 10)); print &ui_table_row($text{'nslice_end'},