WIP: uniproc
[hband-tools.git] / disk-mgmt / phantomlabel
blob3a4df5276e883e0b0f33ead2a20fa5cb5a32d9ca
1 #!/usr/bin/env perl
3 use warnings;
4 $myname = "phantomlabel";
5 $offset_signature = 0x10040;
6 $size_signature = 8;
7 $signature = '_BHRfS_M';
8 $offset_label = 0x1012B;
9 $size_buf_label = 100;
11 $new_label = $ARGV[1];
12 if(defined $new_label)
14 if(length $new_label > $size_buf_label - 1)
16 die "$myname: label must not exceed $size_buf_label bytes\n";
18 if($new_label =~ m{[/\\]})
20 die "$myname: label must not contain '/' or '\\' char\n";
24 open $target_device, '+<', $ARGV[0] or die "$myname: open: $!";
26 sub show_current_data
28 seek $target_device, $offset_signature, 0 or die "$myname: seek: $!";
29 $read_bytes = read $target_device, $buf_signature, $size_signature or die "$myname: read: $!";
30 if($read_bytes != $size_signature)
32 die sprintf "%s: could not read %d bytes at 0x%X\n", $myname, $size_signature, $offset_signature;
34 printf "# octets at 0x%X\n", $offset_signature;
35 printf "%s\n", join " ", map { sprintf "%02X", $_ } unpack 'C'.$size_signature, $buf_signature;
37 $size_buf_new_label = defined $new_label ? length($new_label) + 1 : 100;
38 seek $target_device, $offset_label, 0 or die "$myname: seek: $!";
39 $read_bytes = read $target_device, $buf_label, $size_buf_new_label or die "$myname: read: $!";
40 if($read_bytes != $size_buf_new_label)
42 die sprintf "%s: could not read %d bytes at 0x%X\n", $myname, $size_buf_new_label, $offset_label;
44 printf "# octets at 0x%X\n", $offset_label;
45 printf "%s\n", join " ", map { sprintf "%02X", $_ } unpack 'C'.$size_buf_new_label, $buf_label;
48 show_current_data;
50 if(defined $new_label)
52 print "# writing new label\n";
54 seek $target_device, $offset_signature, 0 or die "$myname: seek: $!";
55 print {$target_device} $signature or die "$myname: write: $!";
57 seek $target_device, $offset_label, 0 or die "$myname: seek: $!";
58 print {$target_device} $new_label.chr(0) or die "$myname: write: $!";
60 print "# new label is written\n";
62 show_current_data;