#--------------------------------------------------------------------- package Utils; # # Copyright (c) Microsoft Corporation. All rights reserved. # # Version: # 1.00 1/23/2002 JeremyD: tired of copying and pasting #--------------------------------------------------------------------- use strict; use vars qw($VERSION); use IO::File; use Digest; use File::Basename; use File::Path (); $VERSION = '1.00'; sub inf_dir_name { my $sku = shift; $sku = lc $sku; my $infdir; if ($sku eq 'pro') { return; } elsif ($sku eq 'ads') { $infdir = 'entinf'; } else { $infdir = "${sku}inf"; } return $infdir; } sub inf_dir { my $sku = shift; return join '\\', $ENV{_NTPOSTBLD}, inf_dir_name($sku); } sub comp_inf_dir { my $sku = shift; return join '\\', $ENV{_NTPOSTBLD}, 'comp', inf_dir_name($sku); } sub inf_file { my $sku = shift; my $filename = shift; return join "\\", inf_dir($sku), $filename; } sub overlay_skus { my $sku = shift; $sku = lc $sku; my %skus = ( per => ['pro', 'per'], pro => ['pro'], srv => ['pro', 'srv'], bla => ['pro', 'srv', 'bla'], sbs => ['pro', 'srv', 'sbs'], ads => ['pro', 'srv', 'ent'], dtc => ['pro', 'srv', 'ent', 'dtc'] ); return @{$skus{$sku}}; } sub overlay_dirs { my $sku = shift; return map { inf_dir($_) } overlay_skus($sku); } sub overlay_file { my $sku = shift; my $filename = shift; for my $overlay_sku (reverse overlay_skus($sku)) { my $f = inf_file($overlay_sku, $filename); if (-e $f) { return $f; } } return; } sub arch_dir { my $arch = shift; $arch = lc $arch; return ($arch eq 'x86') ? 'i386' : $arch; } sub sys { my $cmd = shift; print "$cmd\n"; system($cmd); if ($?) { die "ERROR: $cmd ($?)\n"; } } my %arch_tags = ( 'x86' => 'i', 'ia64' => 'm', 'amd64' => 'm' ); my %sku_tags = ( 'per' => 'c', 'pro' => 'p', 'srv' => 's', 'bla' => 'b', 'sbs' => 'l', 'ads' => 'a', 'dtc' => 'd' ); sub tag_letter { my $thing = shift; return $arch_tags{lc $thing} || $sku_tags{lc $thing}; } sub file_info { my $file = shift; my $root = shift; my $fh = IO::File->new("$file", 'r') or die "Unable to open file $file: $!"; binmode($fh); my $filename; if ($file =~ /_$/) { $fh->seek(0x3c,0); for (;;) { my $c = $fh->getc; if (ord($c) == 0 or $fh->eof) { last } $filename .= "$c"; } $fh->seek(0,0); } else { $filename = basename($file); } my ($size, $mtime) = ($fh->stat)[7,9]; my $digest = Digest->new('SHA-1')->addfile($fh); (my $relative_name = $file) =~ s/^\Q$root\E\\//i; return ($relative_name, $filename, $size, $mtime, $digest->hexdigest); } sub mkdir { my $dir = shift; File::Path::mkpath($dir); } 1; __END__ =head1 NAME Utils - a collection of functions use frequently by SP scripts =head1 DESCRIPTION This module is temporary until these functions are available in postbuild. =head1 AUTHOR JeremyD =head1 COPYRIGHT Copyright (c) Microsoft Corporation. All rights reserved. =cut