[pkg-fso-commits] [SCM] Debian packaging for uboot-envtools branch, master, updated. debian/20081215-2-17-g263a613

Per Andersson avtobiff at gmail.com
Sun Nov 22 19:35:37 UTC 2009


The following commit has been merged in the master branch:
commit 7e6255d66e23178f1d77fde294fce81382769a3e
Author: Per Andersson <avtobiff at gmail.com>
Date:   Wed Aug 5 16:30:28 2009 +0200

    added uboot-envedit script.

diff --git a/contrib/crc32.pl b/contrib/crc32.pl
new file mode 100644
index 0000000..b74c49b
--- /dev/null
+++ b/contrib/crc32.pl
@@ -0,0 +1,47 @@
+#!/usr/bin/perl
+#
+# crc32.pl - Straightforward and very slow CRC32 implementation
+#
+# Copyright (C) 2006-2007 by OpenMoko, Inc.
+# Written by Werner Almesberger <werner at openmoko.org>
+# All Rights Reserved
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+
+#
+# For details, see
+# http://en.wikipedia.org/w/index.php?title=Cyclic_redundancy_check&oldid=110823112
+#
+
+sub crc32
+{
+    local ($s) = @_;
+    local ($poly, $crc) = (0xedb88320, 0xffffffff);
+    local ($i, $j);
+
+    for ($i = 0; $i != length $s; $i++) {
+	for ($j = 0; $j != 8; $j++) {
+	    $crc &= 0xffffffff;
+	    if (($crc ^ (unpack("C", substr($s, $i, 1)) >> $j)) & 1) {
+		$crc = ($crc >> 1) ^ $poly;
+	    }
+	    else {
+		$crc = $crc >> 1;
+	    }
+	}
+    }
+    return $crc ^ 0xffffffff;
+}
diff --git a/contrib/uboot-envedit b/contrib/uboot-envedit
new file mode 100755
index 0000000..78b55fe
--- /dev/null
+++ b/contrib/uboot-envedit
@@ -0,0 +1,336 @@
+#!/usr/bin/perl
+#
+# envedit.pl - U-Boot environment editor
+#
+# Copyright (C) 2006-2007 by OpenMoko, Inc.
+# Written by Werner Almesberger <werner at openmoko.org>
+# All Rights Reserved
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+
+#
+# Preprocessing operations:
+#
+# CPP-like conditionals:
+#
+# #ifdef VAR
+# #ifndef VAR
+# #else
+# #endif
+#
+# Macro expansion:
+#
+# #define MACRO
+# #define MACRO TEXT ...
+# MACRO
+# MACRO##TOKEN
+#
+# Note that #ifdef/#ifndef use both existing environment variables (i.e., those
+# present in the environment at the time of processing) and  preprocessing
+# variables (i.e., those set with -D), while macro expansion only uses
+# preprocessing variables.
+#
+
+$ENV_SIZE = 0x40000;
+
+push(@INC, "/usr/share/fso-python-helpers/");
+
+sub usage
+{
+    print STDERR
+"usage: $0 [-s size] [-c] [-i file] [-o file|-p] [-f env_file]\n".
+"                  [-D var[=value]] [var=[value] ...]\n".
+"  -c             ignore CRC errors in input environment\n".
+"  -f env_file    read changes from env_file\n".
+"  -i file        read environment from file (default: use empty ".
+  "environment)\n".
+"  -o file        write environment to file (default: write to stdout)\n".
+"  -p             print environment in human-readable form to stdout\n".
+"  -s bytes       environment size in bytes (default: 262144)\n".
+"  -D var[=value] define a variable for env_file preprocessing only\n".
+"  var=           remove the specified variable\n".
+"  var=value      set the specified variable\n".
+"The options -c, and -s, if present, must precede all other options.\n";
+"The options -D, if present, must precede -f.\n";
+    exit(1);
+}
+
+
+
+sub do_crc32
+{
+    if (!defined $have_crc) {
+	do 'crc32.pl';
+	$have_crc = 1;
+    }
+    return &crc32(@_);
+}
+
+
+sub readenv
+{
+    local ($file) = @_;
+    local ($crc, $env, $want);
+
+    open(FILE, $file) || die "$file: $!";
+    $env = join("", <FILE>);
+    close FILE;
+    if (length $env < 6) {	# CRC plus \0\0
+	print STDERR sprintf("Environment is too small (%d bytes < 6)\n",
+	  length $env);
+	exit(1);
+    }
+    if (length $env != $ENV_SIZE) {
+	print STDERR sprintf("warning: environment is %d bytes, expected %d\n",
+	  length $env, $ENV_SIZE);
+	$env = substr($env, 0, $ENV_SIZE);
+	$env .= '\000' x ($ENV_SIZE-length $env);
+    }
+    ($crc, $env) = unpack("Va*", $env);
+    $want = &do_crc32($env);
+    if ($crc != $want) {
+	print STDERR sprintf("CRC error: expected 0x%08x, got 0x%08x\n",
+	  $want, $crc);
+	exit(1) unless $warn_crc;
+    }
+    foreach (split(/\000/, $env)) {
+	last if $_ eq "";
+	if (/^([^=]+)=/) {
+	    if ($' eq "") {
+		print STDERR "warning: skipping empty entry for \"$_\"\n";
+	    }
+	    else {
+		$env{$1} = $';
+	    }
+	}
+	else {
+	    print STDERR
+	      "warning: ignoring invalid environment entry \"$_\"\n";
+	}
+    }
+}
+
+
+sub set
+{
+    return 0 unless $_[0] =~ /^([^=]+)=\s*(.+)?$/;
+
+    local ($var, $value) = ($1, $2);
+
+    if ($value ne "") {
+	$env{$var} = $value;
+    }
+    else {
+	undef $env{$var};
+    }
+    print STDERR
+      "warning: variable name \"$var\" contains invalid characters\n"
+      unless $var =~ /^\w+$/;
+    return 1;
+}
+
+
+sub set_err
+{
+    if (!&set($_[0])) {
+	print STDERR "invalid setting \"$_[0]\"\n";
+	exit(1);
+    }
+}
+
+
+sub expand
+{
+    local ($s, @key) = @_;
+    local ($tmp, $pre, $exp, $post);
+    local ($i, @tmp);
+
+    $tmp = "";
+    while (length $s) {
+	$pre = $s;
+	$exp = "";
+	$post = "";
+	for ($i = 0; $i <= $#key; $i++) {
+	    @tmp = @key;
+	    splice(@tmp, $i, 1);
+	    if ($s =~ /(##)?\b$key[$i]\b(##)?/) {
+		if (length $` < length $pre) {
+		    $pre = $`;
+		    $post = $';
+		    $exp = &expand($def{$key[$i]}, @tmp);
+		}
+	    }
+	}
+	$tmp .= $pre.$exp;
+	$s = $post;
+    }
+    return $tmp;
+}
+
+
+if ($0 =~ m#/[^/]*$#) {
+    push(@INC, $`);
+}
+
+while (@ARGV) {
+    if ($ARGV[0] eq "-i") {
+	&usage unless defined $ARGV[1];
+	&readenv($ARGV[1]);
+	shift(@ARGV);
+	shift(@ARGV);
+    }
+    elsif ($ARGV[0] eq "-o") {
+	&usage if defined $printenv;
+	&usage unless defined $ARGV[1];
+	shift(@ARGV);
+	$outfile = shift(@ARGV);
+    }
+    elsif ($ARGV[0] eq "-p") {
+	&usage if defined $outfile;
+	$printenv = 1;
+	shift(@ARGV);
+    }
+    elsif ($ARGV[0] eq "-s") {
+	&usage if $have_crc;
+	&usage unless defined $ARGV[1];
+	shift(@ARGV);
+	$ENV_SIZE = eval shift(@ARGV);
+    }
+    elsif ($ARGV[0] eq "-c") {
+	&usage if $have_crc;
+	shift(@ARGV);
+	$warn_crc = 1;
+    }
+    elsif ($ARGV[0] eq "-D") {
+	&usage unless defined $ARGV[1];
+	shift(@ARGV);
+	if ($ARGV[0] =~ /=/) {
+	    $def{$`} = $';
+	}
+	else {
+	    $def{$ARGV[0]} = 1;
+	}
+	shift @ARGV;
+    }
+    elsif ($ARGV[0] eq "-f") {
+	&usage unless defined $ARGV[1];
+	shift(@ARGV);
+	$file = shift(@ARGV);
+	undef $line;
+	open(FILE, $file) || die "$file: $!";
+	while (<FILE>) {
+	    chop;
+	    if (/^\s*#if(n?)def\s+(\S+)/) {
+		if (!$false &&
+		  (defined $env{$2} || defined $def{$2}) == ($1 ne "n")) {
+		    $true++;
+		}
+		else {
+		    $false++;
+		}
+	    }
+	    elsif (/^\s*#else\b/) {
+		if (!$false && !$true) {
+		    print STDERR "$file:$.: #else without #if...\n";
+		    exit(1);
+		}
+		if (!$false) {
+		    $true--;
+		    $false++;
+		}
+		elsif ($false == 1) {
+		    $false--;
+		    $true++;
+		}
+	    }
+	    elsif (/^\s*#endif\b/) {
+		if (!$false && !$true) {
+		    print STDERR "$file:$.: #endif without #if...\n";
+		    exit(1);
+		}
+		if ($false) {
+		    $false--;
+		}
+		else {
+		    $true--;
+		}
+	    }
+	    next if $false;
+
+	    if (/^\s*#define\s+(\S+)(\s*(.*?))?\s*$/) {
+		if (defined $def{$1} && $def{$1} ne $3) {
+		    print STDERR "$file:$.: redefinition of macro \"$1\"\n";
+		    exit(1);
+		}
+		$def{$1} = $3;
+	    }
+
+	    $_ = &expand($_, keys %def);
+
+	    s/#.*//;
+	    s/\s*$//;
+	    next if /^\s*$/;
+	    if (/^\s+/) {
+		if (!defined $line) {
+		    print STDERR "first line cannot be a continuation\n";
+		    exit(1);
+		}
+		$line .= " ".$';
+	    }
+	    else {
+		&set_err($line) if defined $line;
+		$line = $_;
+	    }
+	}
+	close FILE;
+	&set_err($line) if defined $line;
+    }
+    elsif (&set($ARGV[0])) {
+	shift(@ARGV);
+    }
+    else {
+	&usage;
+    }
+}
+
+
+if ($printenv) {
+    foreach (sort { $a cmp $b } keys %env) {
+	print "$_=$env{$_}\n" if defined $env{$_};
+    }
+}
+else {
+    foreach (sort { $a cmp $b } keys %env) {
+	$env .= "$_=$env{$_}\0" if defined $env{$_};
+    }
+    if (length $env > $ENV_SIZE-5) {
+	# leave room for CRC and terminating \000
+	print STDERR sprintf("environment too big (%d > %d)\n",
+	  length $env, $ENV_SIZE-5);
+	exit(1);
+    }
+    $env .= "\000" x ($ENV_SIZE-4-length $env);
+    $crc = &do_crc32($env);
+    $env = pack("V", $crc).$env;
+    if (defined $outfile) {
+	open(FILE, ">$outfile") || die "$outfile: $!";
+	print FILE $env || die "$outfile: $!";
+	close(FILE) || die "$outfile: $!";
+    }
+    else {
+	print $env || die "print: $!";
+    }
+}

-- 
Debian packaging for uboot-envtools



More information about the pkg-fso-commits mailing list