source: branches/3.2/MondoRescue/bin/mr-label @ 3550

Last change on this file since 3550 was 3550, checked in by bruno, 4 years ago
  • Really fix #778 by taking in acount the FAT size !
  • Property svn:executable set to *
File size: 4.3 KB
Line 
1#!/usr/bin/perl -w
2#
3# $Id$
4# Copyright B. Cornec 2005-2014
5# Provided under the GPL v2
6#
7# Get the complete network configuration of the system
8#
9use strict 'vars';
10use ProjectBuilder::Base;
11use ProjectBuilder::Version;
12use Data::Dumper;
13use Getopt::Long qw(:config auto_abbrev no_ignore_case);
14use English;
15
16
17=pod
18
19=head1 NAME
20
21mr-label labelling tool
22
23=head1 DESCRIPTION
24
25mr-label labels VFAT devices or files representing VFAT devices
26
27=head1 SYNOPSIS
28
29mr-label [-v][-h][-L LABEL|-U UUID] device|file
30
31=head1 ARGUMENTS
32
33=over 4
34
35=item B<device|file>
36
37This is the VFAT device or file representing a VFAT device to modify with regards to its label
38
39=back
40
41=head1 OPTIONS
42
43=over 4
44
45=item B<-v|--verbose>
46
47Increase verbosity
48
49=item B<-h|--help>
50
51Print a brief help message and exits.
52
53=item B<--man>
54
55Prints the manual page and exits.
56
57=item B<-L LABEL>
58
59This is the new LABEL to put on the VFAT filesystem
60
61=item B<-U UUID>
62
63This is the new UUID to put on the VFAT filesystem
64
65=back
66
67=head1 WEB SITES
68
69The main Web site of the project is available at L<http://www.mondorescue.org>. Bug reports should be filled using the trac instance of the project at L<http://trac.mondorescue.org/>.
70
71=head1 USER MAILING LIST
72
73For community exchanges around MondoRescue please use the list L<http://sourceforge.net/mailarchive/forum.php?forum_name=mondo-devel>
74
75=head1 AUTHORS
76
77The MondoRescue team lead by Bruno Cornec L<mailto:bruno@mondorescue.org>.
78
79=head1 COPYRIGHT
80
81MondoRescue is distributed under the GPL v2.0 license or later,
82described in the file C<COPYING> included with the distribution.
83
84=cut
85
86# Global variables
87my ($mrver,$mrrev) = pb_version_init();
88my $appname = "mr-label";
89my %opts;                   # CLI Options
90
91# Initialize the syntax string
92
93pb_syntax_init("$appname Version $mrver-$mrrev\n");
94
95GetOptions("help|?|h" => \$opts{'h'}, 
96        "man" => \$opts{'man'},
97        "verbose|v+" => \$opts{'v'},
98        "label|L=s" => \$opts{'L'},
99        "uuid|U=s" => \$opts{'U'},
100) || pb_syntax(-1,0);
101
102if (defined $opts{'h'}) {
103    pb_syntax(0,1);
104}
105if (defined $opts{'man'}) {
106    pb_syntax(0,2);
107}
108if (defined $opts{'v'}) {
109    $pbdebug++;
110}
111pb_log_init($pbdebug, $pbLOG);
112pb_temp_init($pbdebug);
113
114my $label=$opts{'L'};
115my $uuid=$opts{'U'};
116die "Unable no label/uuid defined" if ((not defined $label) && (not defined $uuid));
117
118my $inputf  = $ARGV[0];
119die "$0: no input file defined" if (not defined $inputf);
120
121my($inputfh, $buffer, $offset, $length, $hexlabel);
122
123# Evaluate the size of the FAT with blkid -p
124open(FS,"blkid -p $inputf|") || die "$0: cannot blkid -p $inputf: $!";
125my $verfs = <FS>;
126close(FS);
127$verfs =~ s/.*VERSION="FAT([0-9][0-9]).*"/FAT$1/;
128chomp($verfs);
129pb_log(1,"Working on a FS ot type ***$verfs***\n");
130
131open($inputfh,  "+< $inputf") || die "$0: cannot open $inputf for reading/writing: $!";
132binmode($inputfh) || die "binmode failed: $!";
133
134# Source https://www.win.tue.nl/~aeb/linux/fs/fat/fat-1.html
135if (defined $label) {
136    # x first bytes are untouched
137    $offset = 43 if (($verfs =~ /FAT16/) || ($verfs =~ /FAT12/));
138    $offset = 71 if ($verfs =~ /FAT32/);
139    $length = 11;
140} elsif (defined $uuid) {
141    # x first bytes are untouched
142    $offset = 39 if (($verfs =~ /FAT16/) || ($verfs =~ /FAT12/));
143    $offset = 67 if ($verfs =~ /FAT32/);
144    $length = 4;
145} else {
146    die "Nothing to do no label/uuid defined";
147}
148
149if (! seek($inputfh, $offset,0)) {
150    die "Unable to seek $inputf: $!";
151}
152# then read the following bytes
153my $size = read($inputfh, $buffer, $length);
154if ($size != $length) {
155    die "Unable to read existing label/uuid: $!";
156}
157
158if (defined $label) {
159    pb_log(1,"Previous label was ***$buffer***\n");
160} elsif (defined $uuid) {
161    my ($hex) = unpack( 'H*', $buffer );
162    pb_log(1,"Previous hex was ***$hex***\n");
163    my @loc = ($hex =~ m/../g);
164    #print Dumper(@loc);
165    $hex = join('',reverse(@loc));
166    pb_log(1,"Previous uuid was ***$hex***\n");
167} else {
168    die "Nothing to do no label/uuid defined";
169}
170   
171if (defined $label) {
172    $hexlabel=sprintf("%-11s", uc($label));
173    pb_log(1,"New label is ***$hexlabel***\n");
174} elsif (defined $uuid) {
175    # Remove separator
176    $uuid =~ s/-//;
177    pb_log(1,"New uuid is ***$uuid***\n");
178    my @loc = ($uuid =~ m/../g);
179    my $hex = join('',reverse(@loc));
180    ($hexlabel) = pack( 'H*', $hex );
181} else {
182    die "Nothing to do no label/uuid defined";
183}
184# Go back
185seek($inputfh, $offset,0);
186print $inputfh $hexlabel;
187close($inputfh) || die "couldn't close $inputf: $!";
Note: See TracBrowser for help on using the repository browser.