add directory Linux-0.11

This commit is contained in:
gohigh
2024-02-19 00:21:01 -05:00
parent ca9fe7ce11
commit 26e015eb99
85 changed files with 8336 additions and 0 deletions

View File

@@ -0,0 +1,10 @@
curses.tar.Z contains the curses library from bsd-net-2, with
pre-installed diffs & RCS files for linux changes.
You'll need to use 'pmake' to build it, or reconstruct the Makefile.
I'm not completely certain that I got all of the raw(), crmode() etc
stuff right. If you have applications that use curses, try them out and
send back patches if you find bugs.
John Kohl <jtkohl@cs.berkeley.edu>

Binary file not shown.

View File

@@ -0,0 +1,103 @@
/* df.c: Copywrite (92) Peter MacDonald: distribute freely, don't restrict. */
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <linux/fs.h>
char *hdr1="\n inodes inodes inodes blocks blocks blocks mount";
char *hdr2= "device total used free total used free point";
char *hdr3= "--------------------------------------------------------------------";
char *fmt = "%-9s %-7d %-7d %-7d %-7d %-7d %-7d %s\n";
void do_df(char *dev, char *dir);
int main(int argc, char *argv[])
{ int i;
sync();
puts(hdr1);
puts(hdr2);
puts(hdr3);
if (argc != 1)
for (i=1; i<argc; i++)
do_df(argv[i],"");
else
{ FILE *F = fopen("/etc/mtab","r");
if (!F)
{ fprintf(stderr,"/etc/mtab not found\n");
exit(1);
}
do
{ char buf[200], dev[40], dir[150];
fgets(buf,200,F);
if (feof(F) || (strlen(buf)<6))
break;
sscanf(buf,"%s %s",dev,dir);
do_df(dev,dir);
} while (1);
}
exit(0);
}
#define oops(str,arg) { fprintf(stderr,str,arg); close(fd); return; }
int fd;
int nibblemap[] = { 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4 };
ino_t count(unsigned numblocks, unsigned numbits)
{ unsigned i, j, end, sum = 0;
char buf[BLOCK_SIZE];
for (i=0; (i<numblocks) && numbits; i++)
{
if (read(fd,buf,sizeof(buf))<0)
return(0);
if (numbits >= (8*BLOCK_SIZE))
{
end = BLOCK_SIZE;
numbits -= 8*BLOCK_SIZE;
}
else
{ int tmp;
end = numbits >> 3;
numbits &= 0x7;
tmp = buf[end] & ((1<<numbits)-1);
sum += nibblemap[tmp&0xf] + nibblemap[(tmp>>4)&0xf];
numbits = 0;
}
for (j=0; j<end; j++)
sum += nibblemap[buf[j] & 0xf] + nibblemap[(buf[j]>>4)&0xf];
}
return(sum);
}
void do_df(char *dev, char *dir)
{ int it,iu,bt,bu;
struct super_block supstruct;
if ((fd=open(dev,O_RDONLY))<0)
oops("df can't open device: %s",dev);
lseek(fd,BLOCK_SIZE,SEEK_SET);
if (read(fd,(char*)&supstruct,sizeof(struct super_block))
!= sizeof(struct super_block))
oops("super block unreadable: %s",dev);
lseek(fd,BLOCK_SIZE*2,SEEK_SET);
if (supstruct.s_magic != SUPER_MAGIC)
oops("not a valid file system: %s",dev);
it = supstruct.s_ninodes;
iu = count(supstruct.s_imap_blocks,supstruct.s_ninodes+1);
bt = supstruct.s_nzones << supstruct.s_log_zone_size;
bu = count(supstruct.s_zmap_blocks,supstruct.s_nzones) <<
supstruct.s_log_zone_size;
printf(fmt,dev,it,iu,it-iu,bt,bu,bt-bu,dir);
}

View File

@@ -0,0 +1,645 @@
/*
* fsck.c - a file system consistency checker for Linux.
*
* (C) 1991 Linus Torvalds. This file may be redistributed as per
* the Linux copyright.
*/
/*
* 09.11.91 - made the first rudimetary functions
*
* 10.11.91 - updated, does checking, no repairs yet.
* Sent out to the mailing-list for testing.
*
* 14.11.91 - Testing seems to have gone well. Added some
* correction-code, and changed some functions.
*
* 15.11.91 - More correction code. Hopefully it notices most
* cases now, and tries to do something about them.
*
* 16.11.91 - More corrections (thanks to Matti Jalava). Most
* things seem to work now.
*
* I've had no time to add comments - hopefully the function names
* are comments enough. As with all file system checkers, this assumes
* the file system is quiescent - don't use it on a mounted device
* unless you can be sure nobody is writing to it (and remember that the
* kernel can write to it when it searches for files).
*
* Usuage: fsck [-larvsm] device
* -l for a listing of all the filenames
* -a for automatic repairs (not implemented)
* -r for repairs (interactive) (not implemented)
* -v for verbose (tells how many files)
* -s for super-block info
* -m for minix-like "mode not cleared" warnings
*
* The device may be a block device or a image of one, but this isn't
* enforced (but it's not much fun on a character device :-).
*/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <ctype.h>
#include <stdlib.h>
#include <termios.h>
#include <sys/stat.h>
#include <linux/fs.h>
#ifndef __GNUC__
#error "needs gcc for the bitop-__asm__'s"
#endif
#ifndef __linux__
#define volatile
#endif
#define ROOT_INO 1
#define UPPER(size,n) ((size+((n)-1))/(n))
#define INODE_SIZE (sizeof(struct d_inode))
#define INODE_BLOCKS UPPER(INODES,INODES_PER_BLOCK)
#define INODE_BUFFER_SIZE (INODE_BLOCKS * BLOCK_SIZE)
#define BITS_PER_BLOCK (BLOCK_SIZE<<3)
static char * program_name = "fsck";
static char * device_name = NULL;
static int IN;
static int repair=0, automatic=0, verbose=0, list=0, show=0, warn_mode=0;
static int directory=0, regular=0, blockdev=0, chardev=0, links=0, total=0;
/* this is used to implement the (coming) two-pass zone checking. */
static int trust_zone_bit_map=0;
static int changed = 0; /* flags if the filesystem has been changed */
/* File-name data */
#define MAX_DEPTH 50
static int name_depth = 0;
static char name_list[MAX_DEPTH][NAME_LEN+1];
static char * inode_buffer = NULL;
#define Inode (((struct d_inode *) inode_buffer)-1)
static char super_block_buffer[BLOCK_SIZE];
#define Super (*(struct super_block *)super_block_buffer)
#define INODES ((unsigned long)Super.s_ninodes)
#define ZONES ((unsigned long)Super.s_nzones)
#define IMAPS ((unsigned long)Super.s_imap_blocks)
#define ZMAPS ((unsigned long)Super.s_zmap_blocks)
#define FIRSTZONE ((unsigned long)Super.s_firstdatazone)
#define ZONESIZE ((unsigned long)Super.s_log_zone_size)
#define MAXSIZE ((unsigned long)Super.s_max_size)
#define MAGIC (Super.s_magic)
#define NORM_FIRSTZONE (2+IMAPS+ZMAPS+INODE_BLOCKS)
static char inode_map[BLOCK_SIZE * I_MAP_SLOTS];
static char zone_map[BLOCK_SIZE * Z_MAP_SLOTS];
static unsigned char * inode_count = NULL;
static unsigned char * zone_count = NULL;
void recursive_check(unsigned int ino);
#define bitop(name,op) \
static inline int name(char * addr,unsigned int nr) \
{ \
int __res; \
__asm__("bt" op " %1,%2; adcl $0,%0" \
:"=g" (__res) \
:"r" (nr),"m" (*(addr)),"0" (0)); \
return __res; \
}
bitop(bit,"")
bitop(setbit,"s")
bitop(clrbit,"c")
#define inode_in_use(x) (bit(inode_map,(x)))
#define zone_in_use(x) (bit(zone_map,(x)-FIRSTZONE+1))
#define mark_inode(x) (setbit(inode_map,(x)),changed=1)
#define unmark_inode(x) (clrbit(inode_map,(x)),changed=1)
#define mark_zone(x) (setbit(zone_map,(x)-FIRSTZONE+1),changed=1)
#define unmark_zone(x) (clrbit(zone_map,(x)-FIRSTZONE+1),changed=1)
/*
* Volatile to let gcc know that this doesn't return. When trying
* to compile this under minix, volatile gives a warning, as
* exit() isn't defined as volatile under minix.
*/
volatile void fatal_error(const char * fmt_string)
{
fprintf(stderr,fmt_string,program_name,device_name);
exit(1);
}
#define usage() fatal_error("Usage: %s [-larvsm] /dev/name\n")
#define die(str) fatal_error("%s: " str "\n")
/*
* This simply goes through the file-name data and prints out the
* current file.
*/
void print_current_name(void)
{
int i=0;
while (i<name_depth)
printf("/%.14s",name_list[i++]);
}
int ask(const char * string,int def)
{
int c;
if (!repair) {
printf("\n");
return 0;
}
if (automatic) {
printf("\n");
return def;
}
printf(def?"%s (y/n)? ":"%s (n/y)? ",string);
for (;;) {
fflush(stdout);
if ((c=getchar())==EOF)
return def;
c=toupper(c);
if (c == 'Y') {
def = 1;
break;
} else if (c == 'N') {
def = 0;
break;
} else if (c == ' ' || c == '\n')
break;
}
if (def)
printf("y\n");
else
printf("n\n");
return def;
}
/*
* check_zone_nr checks to see that *nr is a valid zone nr. If it
* isn't, it will possibly be repaired. Check_zone_nr returns != 0
* if it changed the nr.
*/
int check_zone_nr(unsigned short * nr)
{
if (!*nr)
return 0;
if (*nr < FIRSTZONE)
printf("Zone nr < FIRSTZONE in file `");
else if (*nr >= ZONES)
printf("Zone nr > ZONES in file `");
else
return 0;
print_current_name();
printf("'.");
if (ask("Remove block",1)) {
*nr=0;
changed = 1;
return 1;
}
return 0;
}
/*
* read-block reads block *nr into the buffer at addr. It returns
* 0 if the *nr is unchanged, 1 if it was changed.
*/
int read_block(unsigned short * nr, char * addr)
{
int blk_chg = check_zone_nr(nr);
if (!*nr || *nr >= ZONES) {
memset(addr,0,BLOCK_SIZE);
return changed;
}
if (BLOCK_SIZE*(*nr) != lseek(IN, BLOCK_SIZE*(*nr), SEEK_SET))
die("seek failed in read_block");
if (BLOCK_SIZE != read(IN, addr, BLOCK_SIZE)) {
printf("Read error: bad block in file '");
print_current_name();
printf("'\n");
memset(addr,0,BLOCK_SIZE);
}
return blk_chg;
}
/*
* write_block writes block nr to disk.
*/
inline void write_block(unsigned int nr, char * addr)
{
if (!nr)
return;
if (nr < FIRSTZONE || nr >= ZONES) {
printf("Internal error: trying to write bad block\n"
"Write request ignored\n");
return;
}
if (BLOCK_SIZE*nr != lseek(IN, BLOCK_SIZE*nr, SEEK_SET))
die("seek failed in write_block");
if (BLOCK_SIZE != write(IN, addr, BLOCK_SIZE)) {
printf("Write error: bad block in file '");
print_current_name();
printf("'\n");
}
}
/*
* mapped-read-block reads block nr blknr from the specified file.
* it returns 1 if the inode has been changed due to bad zone nrs
*/
inline int mapped_read_block(struct d_inode * inode,
unsigned int blknr, char * addr)
{
unsigned short ind[BLOCK_SIZE>>1];
unsigned short dind[BLOCK_SIZE>>1];
int result;
if (blknr<7)
return read_block(blknr + inode->i_zone,addr);
blknr -= 7;
if (blknr<512) {
result = read_block(7 + inode->i_zone, (char *) ind);
if (read_block(blknr + ind,addr))
write_block(inode->i_zone[7], (char *) ind);
return result;
}
blknr -= 512;
result = read_block(8 + inode->i_zone, (char *) dind);
if (read_block(blknr/512 + dind, (char *) ind))
write_block(inode->i_zone[8], (char *) dind);
if (read_block(blknr%512 + ind,addr))
write_block(dind[blknr/512], (char *) ind);
return result;
}
void write_tables(void)
{
if (BLOCK_SIZE != lseek(IN, BLOCK_SIZE, SEEK_SET))
die("seek failed in write_tables");
if (BLOCK_SIZE != write(IN, super_block_buffer, BLOCK_SIZE))
die("unable to write super-block");
if (IMAPS*BLOCK_SIZE != write(IN,inode_map,IMAPS*BLOCK_SIZE))
die("Unable to write inode map");
if (ZMAPS*BLOCK_SIZE != write(IN,zone_map,ZMAPS*BLOCK_SIZE))
die("Unable to write zone map");
if (INODE_BUFFER_SIZE != write(IN,inode_buffer,INODE_BUFFER_SIZE))
die("Unable to write inodes");
}
void read_tables(void)
{
memset(inode_map,0,sizeof(inode_map));
memset(zone_map,0,sizeof(zone_map));
if (BLOCK_SIZE != lseek(IN, BLOCK_SIZE, SEEK_SET))
die("seek failed");
if (BLOCK_SIZE != read(IN, super_block_buffer, BLOCK_SIZE))
die("unable to read super block");
if (MAGIC != SUPER_MAGIC)
die("bad magic number in super-block");
if (ZONESIZE != 0 || BLOCK_SIZE != 1024)
die("Only 1k blocks/zones supported");
if (!IMAPS || IMAPS > I_MAP_SLOTS)
die("bad s_imap_blocks field in super-block");
if (!ZMAPS || ZMAPS > Z_MAP_SLOTS)
die("bad s_zmap_blocks field in super-block");
inode_buffer = malloc(INODE_BUFFER_SIZE);
if (!inode_buffer)
die("Unable to allocate buffer for inodes");
inode_count = malloc(INODES);
if (!inode_count)
die("Unable to allocate buffer for inode count");
zone_count = malloc(ZONES);
if (!zone_count)
die("Unable to allocate buffer for zone count");
if (IMAPS*BLOCK_SIZE != read(IN,inode_map,IMAPS*BLOCK_SIZE))
die("Unable to read inode map");
if (ZMAPS*BLOCK_SIZE != read(IN,zone_map,ZMAPS*BLOCK_SIZE))
die("Unable to read zone map");
if (INODE_BUFFER_SIZE != read(IN,inode_buffer,INODE_BUFFER_SIZE))
die("Unable to read inodes");
if (NORM_FIRSTZONE != FIRSTZONE)
printf("Warning: Firstzone != Norm_firstzone\n");
if (show) {
printf("%d inodes\n",INODES);
printf("%d blocks\n",ZONES);
printf("Firstdatazone=%d (%d)\n",FIRSTZONE,NORM_FIRSTZONE);
printf("Zonesize=%d\n",BLOCK_SIZE<<ZONESIZE);
printf("Maxsize=%d\n\n",MAXSIZE);
}
}
struct d_inode * get_inode(unsigned int nr)
{
struct d_inode * inode;
if (!nr || nr > INODES)
return NULL;
total++;
inode = Inode + nr;
if (!inode_count[nr]) {
if (!inode_in_use(nr)) {
printf("Inode %d marked not used, but used for file '",
nr);
print_current_name();
printf("'\n");
if (repair)
if (ask("Mark in use",1))
mark_inode(nr);
}
if (S_ISDIR(inode->i_mode))
directory++;
else if (S_ISREG(inode->i_mode))
regular++;
else if (S_ISCHR(inode->i_mode))
chardev++;
else if (S_ISBLK(inode->i_mode))
blockdev++;
} else
links++;
if (!++inode_count[nr]) {
printf("Warning: inode count too big.\n");
inode_count[nr]--;
}
return inode;
}
void check_root(void)
{
struct d_inode * inode = Inode + ROOT_INO;
if (!inode || !S_ISDIR(inode->i_mode))
die("root inode isn't a directory");
}
static int add_zone(unsigned short * znr)
{
int result;
result=check_zone_nr(znr);
if (!*znr || *znr >= ZONES)
return result;
if (zone_count[*znr]) {
printf("Block has been used before. Now in file `");
print_current_name();
printf("'.");
if (ask("Clear",1)) {
*znr = 0;
changed = 1;
}
}
if (!*znr || *znr >= ZONES)
return result;
if (!zone_in_use(*znr)) {
printf("Block %d in file `",*znr);
print_current_name();
printf("' is marked not in use.");
if (ask("Correct",1))
mark_zone(*znr);
}
if (!++zone_count[*znr])
zone_count[*znr]--;
return result;
}
static int add_zone_ind(unsigned short * znr)
{
static char blk[BLOCK_SIZE];
int i, result, chg_blk=0;
result = add_zone(znr);
if (!*znr || *znr>=ZONES)
return result;
read_block(znr,blk);
for (i=0 ; i < (BLOCK_SIZE>>1) ; i++)
chg_blk |= add_zone(i + (unsigned short *) blk);
if (chg_blk)
write_block(*znr,blk);
return result;
}
static int add_zone_dind(unsigned short * znr)
{
static char blk[BLOCK_SIZE];
int i, result, blk_chg=0;
result = add_zone(znr);
if (!*znr || *znr >= ZONES)
return result;
read_block(znr,blk);
for (i=0 ; i < (BLOCK_SIZE>>1) ; i++)
blk_chg |= add_zone_ind(i + (unsigned short *) blk);
if (blk_chg)
write_block(*znr,blk);
return result;
}
void check_zones(unsigned int i)
{
struct d_inode * inode;
if (!i || i >= INODES)
return;
if (inode_count[i] > 1) /* have we counted this file already? */
return;
inode = Inode + i;
if (!S_ISDIR(inode->i_mode) && !S_ISREG(inode->i_mode))
return;
for (i=0 ; i<7 ; i++)
add_zone(i + inode->i_zone);
add_zone_ind(7 + inode->i_zone);
add_zone_dind(8 + inode->i_zone);
}
void check_file(struct d_inode * dir, unsigned int offset)
{
static char blk[BLOCK_SIZE];
struct d_inode * inode;
int ino;
char * name;
changed |= mapped_read_block(dir,offset/BLOCK_SIZE,blk);
name = blk + (offset % BLOCK_SIZE) + 2;
ino = * (unsigned short *) (name-2);
inode = get_inode(ino);
if (!offset)
if (!inode || strcmp(".",name)) {
print_current_name();
printf(": bad directory: '.' isn't first\n");
} else return;
if (offset == 16)
if (!inode || strcmp("..",name)) {
print_current_name();
printf(": bad directory: '..' isn't second\n");
} else return;
if (!inode)
return;
if (name_depth < MAX_DEPTH)
strncpy(name_list[name_depth],name,14);
name_depth++;
if (list) {
if (verbose)
printf("%6d %07o ",ino,inode->i_mode);
print_current_name();
if (S_ISDIR(inode->i_mode))
printf(":\n");
else
printf("\n");
}
check_zones(ino);
if (inode && S_ISDIR(inode->i_mode))
recursive_check(ino);
name_depth--;
return;
}
void recursive_check(unsigned int ino)
{
struct d_inode * dir;
unsigned int offset;
dir = Inode + ino;
if (!S_ISDIR(dir->i_mode))
die("internal error");
for (offset = 0 ; offset < dir->i_size ; offset += 16)
check_file(dir,offset);
}
void check_counts(void)
{
int i;
for (i=1 ; i < INODES ; i++) {
if (!inode_in_use(i) && Inode[i].i_mode && warn_mode) {
printf("Inode %d mode not cleared.",i);
if (ask("Clear",1)) {
Inode[i].i_mode = 0;
changed = 1;
}
}
if (inode_in_use(i)*Inode[i].i_nlinks == inode_count[i])
continue;
if (!inode_count[i]) {
printf("Inode %d not used, marked used in the bitmap.",
i);
if (ask("Clear",1))
unmark_inode(i);
} else if (!inode_in_use(i)) {
printf("Inode %d used, marked unused in the bitmap.",
i);
if (ask("Set",1))
mark_inode(i);
}
if (inode_in_use(i) && Inode[i].i_nlinks != inode_count[i]) {
printf("Inode %d, i_nlinks=%d, counted=%d.",
i,Inode[i].i_nlinks,inode_count[i]);
if (ask("Set i_nlinks to count",1)) {
Inode[i].i_nlinks=inode_count[i];
changed=1;
}
}
}
for (i=FIRSTZONE ; i < ZONES ; i++) {
if (zone_in_use(i) == zone_count[i])
continue;
printf("Zone %d: %s in use, counted=%d\n",
i,zone_in_use(i)?"":"not",zone_count[i]);
}
}
void check(void)
{
memset(inode_count,0,INODES*sizeof(*inode_count));
memset(zone_count,0,ZONES*sizeof(*zone_count));
check_zones(ROOT_INO);
recursive_check(ROOT_INO);
check_counts();
}
int main(int argc, char ** argv)
{
struct termios termios,tmp;
if (argc && *argv)
program_name = *argv;
if (INODE_SIZE * INODES_PER_BLOCK != BLOCK_SIZE)
die("bad inode size");
while (argc-- > 1) {
argv++;
if (argv[0][0] != '-')
if (device_name)
usage();
else
device_name = argv[0];
else while (*++argv[0])
switch (argv[0][0]) {
case 'l': list=1; break;
case 'a': automatic=1; repair=1; break;
case 'r': automatic=0; repair=1; break;
case 'v': verbose=1; break;
case 's': show=1; break;
case 'm': warn_mode=1; break;
default: usage();
}
}
if (!device_name)
usage();
if (repair && !automatic) {
if (!isatty(0) || !isatty(1))
die("need terminal for interactive repairs");
tcgetattr(0,&termios);
tmp = termios;
tmp.c_lflag &= ~(ICANON|ECHO);
tcsetattr(0,TCSANOW,&tmp);
}
IN = open(device_name,repair?O_RDWR:O_RDONLY);
if (IN < 0)
die("unable to open '%s'");
read_tables();
check_root();
check();
if (verbose) {
int i, free;
for (i=1,free=0 ; i<INODES ; i++)
if (!inode_in_use(i))
free++;
printf("\n%6d inodes used (%d%%)\n",(INODES-free),
100*(INODES-free)/INODES);
for (i=FIRSTZONE,free=0 ; i<ZONES ; i++)
if (!zone_in_use(i))
free++;
printf("%6d zones used (%d%%)\n",(ZONES-free),
100*(ZONES-free)/ZONES);
printf("\n%6d regular files\n"
"%6d directories\n"
"%6d character device files\n"
"%6d block device files\n"
"%6d links\n"
"------\n"
"%6d files\n",
regular,directory,chardev,blockdev,
links-2*directory+1,total-2*directory+1);
}
if (changed) {
write_tables();
printf( "----------------------------\n"
"FILE SYSTEM HAS BEEN CHANGED\n"
"----------------------------\n");
}
if (repair && !automatic)
tcsetattr(0,TCSANOW,&termios);
return (0);
}

Binary file not shown.

View File

@@ -0,0 +1,96 @@
/* kill.c : copyright (92) Peter MacDonald: Distribute freely, don't restrict*/
#include <sys/types.h>
#include <signal.h>
#include <strings.h>
#define ERR 2
const char *usagestr = "usage: kill [-signal] pid ...\n";
void oops(void)
{ write(ERR,usagestr,strlen(usagestr));
exit(1);
}
void oops2(char *str1, char *str2)
{
write(ERR,str1,strlen(str1));
write(ERR,str2,strlen(str2));
write(ERR,"\n",1);
exit(1);
}
char *itoa(int num)
{ int sign = 0;
static char buf[15];
char *cp = buf+sizeof(buf)-1;
if (num<0)
{ sign = 1;
num = -num;
}
do
{
*cp-- = '0'+num%10;
num /= 10;
} while (num);
if (sign)
*cp-- = '-';
return(cp+1);
}
const char *signames[] = {
"HUP", "INT", "QUIT", "ILL", "TRAP", "ABRT", "UNUSED",
"FPE", "KILL", "USR1", "SEGV", "USR2", "PIPE", "ALRM", "TERM",
"STKFLT", "CHLD", "CONT", "STOP", "TSTP", "TTIN", "TTOU", 0 };
int main(int argc, char *argv[])
{
int i, signum = SIGTERM;
if (argc < 2)
oops();
if ((argc>1) && ('-' == *argv[1]))
{
if ('?' == argv[1][1])
for (i=0; i<NSIG; i++)
if (!signames[i])
{ write(ERR,"\n",1);
exit(0);
}
else
{ write(ERR,signames[i],strlen(signames[i]));
write(ERR," ", 1);
if (i==10)
write(ERR,"\n",1);
}
for (i=0; i<NSIG; i++)
if (!signames[i])
{ i = NSIG;
break;
}
else
if (!strcmp(signames[i],argv[1]+1))
break;
if (i < NSIG)
signum = i+1;
else
if ((!(signum = atoi(argv[1]+1))) || (signum<=0) || (signum>NSIG))
oops();
argc--;
argv++;
}
while (--argc)
{
argv++;
if ((i = atoi(*argv)) <= 3)
oops();
if (kill(i,signum))
oops2( "kill: no such process ", itoa(i));
}
return(0);
}

View File

@@ -0,0 +1,365 @@
/*
* mkfs.c - make a linux (minix) file-system.
*
* (C) 1991 Linus Torvalds. This file may be redistributed as per
* the Linux copyright.
*/
/*
* 24.11.91 - time began. Used the fsck sources to get started.
*
* 25.11.91 - corrected some bugs. Added support for ".badblocks"
* The algorithm for ".badblocks" is a bit weird, but
* it should work. Oh, well.
*
* Usuage: mkfs [-c] device size-in-blocks
*
* -c for readablility checking (SLOW!)
*
* The device may be a block device or a image of one, but this isn't
* enforced (but it's not much fun on a character device :-).
*/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <ctype.h>
#include <stdlib.h>
#include <termios.h>
#include <sys/stat.h>
#include <linux/fs.h>
#ifndef __GNUC__
#error "needs gcc for the bitop-__asm__'s"
#endif
#ifndef __linux__
#define volatile
#endif
#define ROOT_INO 1
#define BAD_INO 2
#define TEST_BUFFER_BLOCKS 32
#define MAX_GOOD_BLOCKS 512
#define UPPER(size,n) ((size+((n)-1))/(n))
#define INODE_SIZE (sizeof(struct d_inode))
#define INODE_BLOCKS UPPER(INODES,INODES_PER_BLOCK)
#define INODE_BUFFER_SIZE (INODE_BLOCKS * BLOCK_SIZE)
#define BITS_PER_BLOCK (BLOCK_SIZE<<3)
static char * program_name = "mkfs";
static char * device_name = NULL;
static int DEV = -1;
static long BLOCKS = 0;
static int check = 0;
static int badblocks = 0;
#define ROOT_INO_STRING "\001\000"
#define BAD_INO_STRING "\002\000"
static char root_block[BLOCK_SIZE] =
ROOT_INO_STRING ".\0\0\0\0\0\0\0\0\0\0\0\0\0"
ROOT_INO_STRING "..\0\0\0\0\0\0\0\0\0\0\0\0"
BAD_INO_STRING ".badblocks\0\0\0\0";
static char * inode_buffer = NULL;
#define Inode (((struct d_inode *) inode_buffer)-1)
static char super_block_buffer[BLOCK_SIZE];
#define Super (*(struct super_block *)super_block_buffer)
#define INODES ((unsigned long)Super.s_ninodes)
#define ZONES ((unsigned long)Super.s_nzones)
#define IMAPS ((unsigned long)Super.s_imap_blocks)
#define ZMAPS ((unsigned long)Super.s_zmap_blocks)
#define FIRSTZONE ((unsigned long)Super.s_firstdatazone)
#define ZONESIZE ((unsigned long)Super.s_log_zone_size)
#define MAXSIZE ((unsigned long)Super.s_max_size)
#define MAGIC (Super.s_magic)
#define NORM_FIRSTZONE (2+IMAPS+ZMAPS+INODE_BLOCKS)
static char inode_map[BLOCK_SIZE * I_MAP_SLOTS];
static char zone_map[BLOCK_SIZE * Z_MAP_SLOTS];
static unsigned short good_blocks_table[MAX_GOOD_BLOCKS];
static int used_good_blocks = 0;
#define bitop(name,op) \
static inline int name(char * addr,unsigned int nr) \
{ \
int __res; \
__asm__ __volatile__("bt" op " %1,%2; adcl $0,%0" \
:"=g" (__res) \
:"r" (nr),"m" (*(addr)),"0" (0)); \
return __res; \
}
bitop(bit,"")
bitop(setbit,"s")
bitop(clrbit,"r")
#define inode_in_use(x) (bit(inode_map,(x)))
#define zone_in_use(x) (bit(zone_map,(x)-FIRSTZONE+1))
#define mark_inode(x) (setbit(inode_map,(x)))
#define unmark_inode(x) (clrbit(inode_map,(x)))
#define mark_zone(x) (setbit(zone_map,(x)-FIRSTZONE+1))
#define unmark_zone(x) (clrbit(zone_map,(x)-FIRSTZONE+1))
/*
* Volatile to let gcc know that this doesn't return. When trying
* to compile this under minix, volatile gives a warning, as
* exit() isn't defined as volatile under minix.
*/
volatile void fatal_error(const char * fmt_string)
{
fprintf(stderr,fmt_string,program_name,device_name);
exit(1);
}
#define usage() fatal_error("Usage: %s [-c] /dev/name blocks\n")
#define die(str) fatal_error("%s: " str "\n")
void write_tables(void)
{
if (BLOCK_SIZE != lseek(DEV, BLOCK_SIZE, SEEK_SET))
die("seek failed in write_tables");
if (BLOCK_SIZE != write(DEV, super_block_buffer, BLOCK_SIZE))
die("unable to write super-block");
if (IMAPS*BLOCK_SIZE != write(DEV,inode_map,IMAPS*BLOCK_SIZE))
die("Unable to write inode map");
if (ZMAPS*BLOCK_SIZE != write(DEV,zone_map,ZMAPS*BLOCK_SIZE))
die("Unable to write zone map");
if (INODE_BUFFER_SIZE != write(DEV,inode_buffer,INODE_BUFFER_SIZE))
die("Unable to write inodes");
}
void write_block(int blk, char * buffer)
{
if (blk*BLOCK_SIZE != lseek(DEV, blk*BLOCK_SIZE, SEEK_SET))
die("seek failed in write_block");
if (BLOCK_SIZE != write(DEV, buffer, BLOCK_SIZE))
die("write failed in write_block");
}
int get_free_block(void)
{
int blk;
if (used_good_blocks+1 >= MAX_GOOD_BLOCKS)
die("too many bad blocks");
if (used_good_blocks)
blk = good_blocks_table[used_good_blocks-1]+1;
else
blk = FIRSTZONE;
while (blk < ZONES && zone_in_use(blk))
blk++;
if (blk >= ZONES)
die("not enough good blocks");
good_blocks_table[used_good_blocks] = blk;
used_good_blocks++;
return blk;
}
void mark_good_blocks(void)
{
int blk;
for (blk=0 ; blk < used_good_blocks ; blk++)
mark_zone(good_blocks_table[blk]);
}
inline int next(int zone)
{
if (!zone)
zone = FIRSTZONE-1;
while (++zone < ZONES)
if (zone_in_use(zone))
return zone;
return 0;
}
void make_bad_inode(void)
{
struct d_inode * inode = &Inode[BAD_INO];
int i,j,zone;
int ind=0,dind=0;
unsigned short ind_block[BLOCK_SIZE>>1];
unsigned short dind_block[BLOCK_SIZE>>1];
#define NEXT_BAD (zone = next(zone))
if (!badblocks)
return;
mark_inode(BAD_INO);
inode->i_nlinks = 1;
inode->i_time = time(NULL);
inode->i_mode = S_IFREG + 0000;
inode->i_size = badblocks*BLOCK_SIZE;
zone = next(0);
for (i=0 ; i<7 ; i++) {
inode->i_zone[i] = zone;
if (!NEXT_BAD)
goto end_bad;
}
inode->i_zone[7] = ind = get_free_block();
memset(ind_block,0,BLOCK_SIZE);
for (i=0 ; i<512 ; i++) {
ind_block[i] = zone;
if (!NEXT_BAD)
goto end_bad;
}
inode->i_zone[8] = dind = get_free_block();
memset(dind_block,0,BLOCK_SIZE);
for (i=0 ; i<512 ; i++) {
write_block(ind,(char *) ind_block);
dind_block[i] = ind = get_free_block();
memset(ind_block,0,BLOCK_SIZE);
for (j=0 ; j<512 ; j++) {
ind_block[j] = zone;
if (!NEXT_BAD)
goto end_bad;
}
}
die("too many bad blocks");
end_bad:
if (ind)
write_block(ind, (char *) ind_block);
if (dind)
write_block(dind, (char *) dind_block);
}
void make_root_inode(void)
{
struct d_inode * inode = &Inode[ROOT_INO];
mark_inode(ROOT_INO);
inode->i_zone[0] = get_free_block();
inode->i_nlinks = 2;
inode->i_time = time(NULL);
if (badblocks)
inode->i_size = 48;
else
inode->i_size = 32;
inode->i_mode = S_IFDIR + 0755;
write_block(inode->i_zone[0],root_block);
}
void setup_tables(void)
{
int i;
memset(inode_map,0xff,sizeof(inode_map));
memset(zone_map,0xff,sizeof(zone_map));
memset(super_block_buffer,0,BLOCK_SIZE);
MAGIC = SUPER_MAGIC;
ZONESIZE = 0;
MAXSIZE = (7+512+512*512)*1024;
ZONES = BLOCKS;
/* some magic nrs: 1 inode / 3 blocks */
INODES = BLOCKS/3;
/* I don't want some off-by-one errors, so this hack... */
if ((INODES & 8191) > 8188)
INODES -= 5;
if ((INODES & 8191) < 10)
INODES -= 20;
IMAPS = UPPER(INODES,BITS_PER_BLOCK);
ZMAPS = 0;
while (ZMAPS != UPPER(BLOCKS - NORM_FIRSTZONE,BITS_PER_BLOCK))
ZMAPS = UPPER(BLOCKS - NORM_FIRSTZONE,BITS_PER_BLOCK);
FIRSTZONE = NORM_FIRSTZONE;
for (i = FIRSTZONE ; i<ZONES ; i++)
unmark_zone(i);
for (i = ROOT_INO ; i<INODES ; i++)
unmark_inode(i);
inode_buffer = malloc(INODE_BUFFER_SIZE);
if (!inode_buffer)
die("Unable to allocate buffer for inodes");
memset(inode_buffer,0,INODE_BUFFER_SIZE);
printf("%d inodes\n",INODES);
printf("%d blocks\n",ZONES);
printf("Firstdatazone=%d (%d)\n",FIRSTZONE,NORM_FIRSTZONE);
printf("Zonesize=%d\n",BLOCK_SIZE<<ZONESIZE);
printf("Maxsize=%d\n\n",MAXSIZE);
}
void check_blocks(void)
{
unsigned int current_block=0;
int try,got;
static char buffer[BLOCK_SIZE * TEST_BUFFER_BLOCKS];
while (current_block < ZONES) {
if (lseek(DEV,current_block*BLOCK_SIZE,SEEK_SET) !=
current_block*BLOCK_SIZE)
die("seek failed in check_blocks");
try = TEST_BUFFER_BLOCKS;
if (current_block + try > ZONES)
try = ZONES-current_block;
got = read(DEV, buffer, try * BLOCK_SIZE);
if (got<0)
got = 0;
if (got & (BLOCK_SIZE-1))
printf("Weird values in check_blocks: probably bugs\n");
got /= BLOCK_SIZE;
current_block += got;
if (got == try)
continue;
if (current_block < FIRSTZONE)
die("bad blocks before data-area: cannot make fs");
mark_zone(current_block);
badblocks++;
current_block++;
}
if (badblocks)
printf("%d bad block%s\n",badblocks,(badblocks>1)?"s":"");
}
int main(int argc, char ** argv)
{
char * tmp;
struct stat statbuf;
if (argc && *argv)
program_name = *argv;
if (INODE_SIZE * INODES_PER_BLOCK != BLOCK_SIZE)
die("bad inode size");
while (argc-- > 1) {
argv++;
if (argv[0][0] != '-')
if (device_name) {
BLOCKS = strtol(argv[0],&tmp,0);
if (*tmp)
usage();
} else
device_name = argv[0];
else while (*++argv[0])
switch (argv[0][0]) {
case 'c': check=1; break;
default: usage();
}
}
if (!device_name || BLOCKS<10 || BLOCKS > 65536)
usage();
DEV = open(device_name,O_RDWR);
if (DEV<0)
die("unable to open %s");
if (fstat(DEV,&statbuf)<0)
die("unable to stat %s");
if (!S_ISBLK(statbuf.st_mode))
check=0;
else if (statbuf.st_rdev == 0x0300 || statbuf.st_rdev == 0x0305)
die("Will not try to make filesystem on '%s'");
setup_tables();
if (check)
check_blocks();
make_root_inode();
make_bad_inode();
mark_good_blocks();
write_tables();
return 0;
}

Binary file not shown.

View File

@@ -0,0 +1,54 @@
/* nice.c: copywrite (92) Peter MacDonald: Distribute freely, don't restrict */
#include <sys/types.h>
#include <signal.h>
#include <string.h>
/* link nice to renice to change running processes priorities. */
int is_nice;
void usage()
{
if (is_nice)
puts("usage: nice [-n] command");
else
puts("usage: renice [-n] pid");
exit(-1);
}
int renice(int priority, int pid)
{
puts("renice system call not yet implemented");
return(0);
}
int main(int argc, char *argv[])
{
int priority = 10;
is_nice = (strcmp(*argv+strlen(*argv)-6,"renice"));
if ((argc>1) && (argv[1][0] == '-'))
{ priority = atoi(argv[1]+1);
if ((priority>19) || (priority<-20))
usage();
argc--;
argv++;
}
if (argc<2)
usage();
if (!is_nice)
if (renice(priority,atoi(argv[1])))
usage();
else
return(0);
if (nice(priority))
usage();
execvp(argv[1], argv+1);
puts("can not execute");
exit(-1);
}

View File

@@ -0,0 +1,481 @@
From: hns@regent.e-technik.tu-muenchen.dbp.de (Henning Spruth)
Newsgroups: alt.os.linux
Subject: DOS program to set root device
Date: 25 Mar 92 09:06:28 GMT
Here is a small DOS program I hacked using Turbo C to be able to
conveniently set the root partition. It is quite primitive, as it
requires major/minor device numbers and can only access a boot disk in
drive A:, but it works. Using it, installing Linux can be done in
these steps:
1. boot the Linux boot disk
2. make HD file system
3. run install script
4. sync
5. boot DOS
6. run setroot.exe to set root file system to HD
7. boot the Linux boot disk again
Here's the source:
------------------------- begin setroot.c ------------------------------
#include <stdio.h>
#include <bios.h>
#include <conio.h>
char buffer[512];
void check(int res)
{
if(res==0) return;
printf("Disk error status: %x\n",res);
exit(1);
}
main()
{
int result,x;
char in[80];
unsigned int major, minor;
printf("\n\nInsert Linux boot disk into drive A: and hit a key ...");
getch();
printf("\n");
printf("Resetting controller ...\n");
result=biosdisk(0,0,0,0,1,1,buffer);
check(result);
printf("Loading boot sector ...\n");
result=biosdisk(2,0,0,0,1,1,buffer);
if(result==6) result=biosdisk(2,0,0,0,1,1,buffer);
check(result);
printf("Current major boot device: %d\n",buffer[509]);
printf("Current minor boot device: %d\n",buffer[508]);
printf("\n");
printf("New device values:\n");
printf("Enter new major device: ");
gets(in);
sscanf(in,"%d",&major);
printf("Enter new minor device: ");
gets(in);
sscanf(in,"%d",&minor);
printf("\nCheck: changing root disk to major %d, minor %d\n",major,minor);
printf("Is this OK (y/n)? ");
x=getch(); printf("\n");
if(x!='y')
{ printf("Aborting ...\n");
exit(0);
}
buffer[508]=minor;
buffer[509]=major;
printf("Writing boot sector ...\n");
result=biosdisk(3,0,0,0,1,1,buffer);
check(result);
printf("Root device changed!\n");
}
------------------------- end setroot.c ------------------------------
Here is the uuencoded executable:
------------------------- begin setroot.uue ----------------------------
begin 664 setroot.exe
M35KP 1D P @ ___W H /@ $ ^S!J<@
M ! W@ ! !
M
M
M
M
M
M
M
M
M
M "Z;0(NB18U K0PS2&++@( BQXL ([:HY C :.
M (D>B@")+J8 Z#T!Q#Z( (O'B]BY_W_\\J[C84,F. 5U]H#-@/?9B0Z( +D!
M -/C@\,(@^/XB1Z, (S:*^J+/K@$@?\ G,'OP "B3ZX!(''G@AR* ,^L 1R
M(K$$T^]'.^]R&8,^N 0 = >#/K $ '4.OP 0.^]W!XO]ZP/IA &+WP/:B1Z>
M (D>H@"AC@ KV([ M$I7S2%?T^?ZCM*+Y_LSP"Z.!C4"OUH&N9X(*\_\\ZJT
M ,T:B1:4 (D.E@ S[;AL H[8O@ OPP Z.H +HX>-0+_-H8 _S:$ /\V@@#H
M6P$NQ@;G 7(NQ@;6 0!0Z$8$N&P"CMB^# "_# #HN NCAXU O\60@/_%D0#
M_Q9& RZ.'C4"Z'( ,\"+\+DM ($@-0 1N+X+:4,= FY&0"Z+0#HQ0"+[+1,
MBD8"S2&Y#@"Z1@#IP0 >N US2&)'G( C 9T +@$-<TAB1YV (P&> "X!37-
M(8D>>@",!GP N 8US2&)'GX C : +@ )8S*CMJZ7 '-(1_#'K@ )<46<@#-
M(1\>N 0EQ19V ,TA'QZX!27%%GH S2$?'K@&)<46?@#-(1_#M/^+UXO>.]]T
M%( __W0*.&<!=P6*9P&+TX/#!NOH.]=T((O:'@<&@#\ Q@?_+HX>-0)T!R;_
M7P(?Z\4F_U<"'^N^P[1 NP( S2'#N1X NE0 +HX>-0+HZO^X P!0Z/G^ !
M %6+[(-^! !U NL4_W8$N*@ 4.A_!EE9N $ 4.C^ EE=PU6+[(/L5%97N+\
M4.AD!EGH"!.X^ !0Z%D&6;CZ %#H4099N%H&4+@! %"X 0!0,\!0,\!0,\!0
M,\!0Z-L.@\0.B_!6Z)C_6;@4 5#H) 99N%H&4+@! %"X 0!0,\!0,\!0,\!0
MN ( 4.BM#H/$#HOP@_X&=2&X6@90N $ 4+@! % SP% SP% SP%"X @!0Z(<.
M@\0.B_!6Z$3_6:!7")A0N"T!4.C+!5E9H%8(F%"X3 %0Z+T%65FX:P%0Z+0%
M6;AM 5#HK 59N($!4.BD!5F-1JQ0Z @$68U&_E"XF@%0C4:L4.BC#(/$!KB=
M 5#H@@59C4:L4.CF UF-1OQ0N+8!4(U&K%#H@0R#Q ;_=OS_=OZXN0%0Z%H%
M@\0&N.L!4.A0!5GH]!&+^+C^ 5#H0P59@_]Y= ^X )0Z#8%63/ 4.BW 5F*
M1ORB5@B*1OZB5PBX#@)0Z!L%6;A:!E"X 0!0N $ 4#/ 4#/ 4#/ 4+@# %#H
MI V#Q Z+\%;H8?Y9N"<"4.CM!%E?7HOE7<-5B^R#/CX"('4%N $ ZQ.+'CX"
MT>.+1@2)AUH(_P8^ C/ 7<-5B^R#[ C&1OL Z!\,M ")1O[H%PRQ"-/HM ")
M1OSIWP"+7@C_1@B*!XA&^[0 +0< B]B#^P9W+M'C+O^G, 6T#K 'Z .ZW:@
MO 2T #M&_GUL_T[^ZV>@O 2T (E&_NM=_T;\ZUB@Q02T O =2Z#/LL$ '0G
MBB; !(I&^XE&^(M&_D!0BT;\0%#HDAY24!:-1OA0N $ 4.BJ'NL>BE;^BG;\
MM *W .B<#8H>P 2*1ONT";< N0$ Z(L-_T;^H+X$M [1OY]$J"\!+0 B4;^
MBT;\ P:Z!(E&_*"_!+0 .T;\?1RP!E"@O 10H+T$4*"^!%"@OP10L %0Z!@(
M_T[\BT8&_TX&"\!T ^D4_XI6_HIV_+0"MP#H+ V*1ONT (OE7<(& $H$4P1Q
M!&P$<01Q!&($58OLN L$4#/ 4/]V!(U&!E#H%!E=P\-5B^SK"HL>/@+1X_^7
M6@BA/@+_#CX""\!UZ_]V!.B:^UE=PU6+[%97BW8$"_9U!>AS .MK.70.= 6X
M___K8X,\ 'PI]T0"" !U"HO&!04 .40*=1;'! B\8%!0 Y1 IU"(M$"(E$
M"NLUZS.+1 8#!$"+^(L$*\>)!%>+1 B)1 I0BD0$F%#HA J#Q 8[QW0.]T0"
M )U!X%, A ZYHSP%]>7<-5B^Q,3%97QT;^ "_% "^2 /K$O=$ @, = A6
MZ%__6?]&_H/&$(O'3PO =>>+1OY?7HOE7<-5B^Q65XM>!(,_ 'T(BT<& P=
MZPJ+7@2+!YDSPBO"B_"+R(M>!/=' D = +K+XM>!(M_"H,_ 'T=ZPE/B]^
M/PIU 4&+QDX+P'7PZQ"+WT> /PIU 4&+QDX+P'7PB\%?7EW" @!5B^Q6BW8$
M5NC7_ED+P'0%N/__ZTJ#?@H!=1"#/ !^"U;H=O^9*48&&58(@60"7_['!
MBT0(B40*_W8*_W8(_W8&BD0$F%#H- ^#Q B#^O]U"CW__W4%N/__ZP(SP%Y=
MPU6+[(/L!%:+=@2*1 284.@5"5F)1OR)5OZ#/ !]#5;H%O^9 4;\$5;^ZPM6
MZ G_F2E&_!E6_HM6_HM&_%Z+Y5W#58OL3$Q65XM^!(OWZP:*1OZ(!$:A2 -(
MHT@#"\!\#HL>4@/_!E(#B@>T .L(N$@#4.A(#5F)1OX]__]T!3T* '7,@W[^
M_W4(._=U!#/ ZQ'&! #W!DH#$ !T!#/ ZP*+QU]>B^5=PU6+[%97_W8$_W8&
M_W8(_W8*Z L%"\!U!#/ ZR^+1@@K1@1 B_B+=@;K&1[_=@S_=@16Z%4;4E!7
MZ*<$B\?1X %&#$8[=@I^XK@! %]>7<-5B^Q65XM&""M&!$"+^(MV!NL9_W8$
M5N@A&U)0'O]V#%?H;P2+Q]'@ 48,1CMV"G[BN $ 7UY=PU6+[(/L!E97BWX&
M_W8$5_]V"/]V"NB ! O ="3_=@S_=@Z+1@@K1@2+5@P#T%*+1@HKQXM6#@/0
M4NA<! O =00SP.M<B7[^BT8*B4;\QT;Z 0 [?@Y]#HM&"HE&_HE^_,=&^O__
MBW;^ZRG_=@R+QBO'BU8. ]!2Z(D:4E#_=@16Z( :4E"+1@@K1@1 4.C+ P-V
M^HM&_ -&^CO&=<VX 0!?7HOE7<-5B^RX% I0N%@#4/]V!(U&!E#HA!5=PU6+
M[%:+=@:+!$B)!%:*1@284.@% %E97EW#58OL5HMV!HI&!**:"(,\_WTWBP1
MB02+7 K_1 J@F@B(!_=$ @@ =!V /IH("G0'@#Z:" UU#U;H/_Q9"\!T!KC_
M_^FY .FQ /=$ I =0?W1 (" '4'@4P"$ #KXH%, @ !@WP& '1$@SP = M6
MZ C\60O = +KQXM$!O?8B02+7 K_1 J@F@B(!_=$ @@ =!F /IH("G0'@#Z:
M" UU"U;HUOM9"\!T NN5ZTV /IH("G4?]T0"0 !U&+@! %"XL@10BD0$F%#H
M !J#Q 8] 0!U&+@! %"XF@A0BD0$F%#HZ!F#Q 8] 0!T#_=$ @ "=0B!3 (0
M .E&_Z":"+0 7EW#58OL5HMV!+A8 U!6Z._^65E>7<-5B^Q,3%97BWX&BW8$
MB7[^]T0"" !T)NL:5HM>"/]&"(H'F%#HP_Y963W__W4%,\#I]P"+QT\+P'7?
MZ>H ]T0"0 !U ^F# (-\!@!T93E\!G,H@SP = M6Z G[60O = +KS%?_=@B*
M1 284.A'&8/$!CO'<P+KM^FM (L$ \=\&H,\ '4*N/__*T0&B03K"U;HT?I9
M"\!T NN45_]V"/]T"NAI#(/$!HL$ \>)! %\"NMU5_]V"(I$!)A0Z/<8@\0&
M.\=S ^EF_^M=@WP& '1!ZS:+!$")! O ?1:+7 K_1 I3BUX(_T8(B@=;B >T
M .L/5HM>"/]&"(H'4.C2_5E9/?__=0/I)O^+QT\+P'7#ZQ97_W8(BD0$F%#H
M,@6#Q 8[QW,#Z0?_BT;^7UZ+Y5W"!@!5B^R-1@10N $ 4#/ 4.BT^%W#58OL
M3$R+1@31Z(O(H,0$M !0B\$STEOW\XA&_[0 BA;$!+8 ]^J*T2K0B%;^BF;_
MBL*+Y5W"! !5B^Q65XM^!HMV!(L5.Q1T";< M +HJ :)%/[".A;$!'($_L:R
M (D57UY=P@0 58OL@^P*5E?H;02)1OB)1OJ+1@P[!LD$=06X 0#K C/ B4;V
M"\!T#/]V#/]V"NAI_XE&_HM&"#L&R01U!;@! .L",\"+^ O =%W_=@C_=@;H
M1_^)1OSK3PO_=!:-1OQ0C4;Z4.AK_[< M CH) :+\.L*Q%X&)HLW@T8& H-^
M]@!T&XU&_E"-1OI0Z$7_B\:*W+D! +< M GH]P7K"L1>"B:)-X-&"@*+1@3_
M3@0+P'6GBU;XMP"T NC7!5]>B^5=P@H 58OLH,4$M +P'4;@S[+! !T%/]V
M#/]V"O]V"/]V!O]V!.BI%NL2_W8,_W8*_W8(_W8&_W8$Z 3_7<(* %6+[*#$
M!+0 B\B@PP2T (O0.4X*=R0Y3@9W'XM&"CM&!G\7.58(=Q(Y5@1W#8M&"#M&
M!'\%N $ ZP(SP%W"" !5B^Q65XMV"(M^!HL,L2#K!8D,1D9'.WX$?O9?7EW"
M!@!5B^R![* H,4$M +P'0#Z3@!@S[+! !U ^DN 8!^! %T ^DE ?Y&#/Y&
M"OY&"/Y&!H!^#@9T ^F( (I&"K0 4(I&#+0 4(I&!K0 4(I&"+0 4(I&"K0
M0%"*1@RT %#HI/J#Q R-AF#_4(I&!K0 4(I&#+0 4(I&!K0 4(I&#+0 4.CZ
M^8/$"HV&8/]0BD8,M !0BD8(M !0Z$+_C89@_U"*1@:T %"*1@BT %"*1@:T
M %"*1@RT %#H$OJ#Q KIH0"*1@JT $!0BD8,M !0BD8&M !(4(I&"+0 4(I&
M"K0 4(I&#+0 4.@;^H/$#(V&8/]0BD8*M !0BD8,M !0BD8*M !0BD8,M !0
MZ''Y@\0*C89@_U"*1@RT %"*1@BT %#HN?Z-AF#_4(I&"K0 4(I&"+0 4(I&
M"K0 4(I&#+0 4.B)^8/$"NL9BC[ !(IF#HI&!(IN"HI.#(IV!HI6".C- XOE
M7<(, *!, YA0Z'('60O =0:!)DH#__VX )0A09* W0%N $ ZP(SP% SP%"X
M2 -0Z#8 @\0(H%P#F%#H0 =9"\!U!H$F6@/__;@ E"%!EH#= 6X @#K C/
M4#/ 4+A8 U#H! "#Q C#58OL5E>+=@2+?@HY= YU#(-^" )_!H'__W]V!KC_
M_^FF (,^M@0 =0Z!_E@#=0C'!K8$ 0#K$X,^M 0 =0R!_D@#=0;'!K0$ 0"#
M/ !T$;@! % SP#/24%)6Z$KW@\0(]T0"! !T!_]T".CD%%F!9 +S_\=$!@
MB\8%!0")1 B)1 J#?@@"=#T+_W8YQP9" U(1@WX& '465^B#%5F)1@8+P'0'
M@4P"! #K ^EM_XM&!HE$"HE$"(E\!H-^" %U!8%, @@ ,\!?7EW#58OL5HM>
M!(LW_P>*!(K0"L!U!;C__^L$BL*T %Y=PU6+[(M>!O\/7<-5B^R-1@A0_W8&
MC48$4+C:#U"XNP]0Z!0(@\0*7<-5B^S_=@C_=@:-1@10N-H/4+B[#U#H]P>#
MQ I=PU6+[+@! % SP#/24%+_=@3HXP6#Q A=P[0#MP#H$P*+PL/H\_^T (H6
MO 2V "O"0,/HY/^Q"-/HM "*%KT$M@ KPD##58OL@>R* %97BT8(0#T" ',%
M,\#IT@"+7@31X_>'B 0 @'02_W8(_W8&_W8$Z#83@\0&Z;, BUX$T>.!IX@$
M__V+1@:)1OB+1@B)1OSK5?]._(M>^/]&^(H'B$;[/ IU!,8$#4:*1ON(!$:-
MAG;_B]8KT('Z@ !\,8O6*]"+^E)0_W8$Z-\2@\0&B4;^.\=T$PO <P6X___K
M2HM&""M&_.L]ZT"-AG;_B_"#?OP =9^-AG;_B]8KT(OZB\(+P'8F4HV&=O]0
M_W8$Z)H2@\0&B4;^.\=T$ O <P+KN8M&" -&_BO'ZP.+1@A?7HOE7<-65[\$
M +Y( ^L0]T0" P!T!5;H$?193X/&$ O_=>Q?7L-5B^P>!XIF!(I&#HM>$(M.
M"M'IT>F X< "3@R*;@J*=@B*5@;-$X!^! AU!8D/B5<"BL2T %W#58OLBT8$
MB]2!Z@ ".\)S!Z.: #/ ZPG'!I( " "X__]=PU6+[(M&!(M6!@,&F@"#T@"+
MR O2=1"!P0 "<@H[S',&AP:: .L)QP:2 @ N/__7<-5B^S_=@3HI/]97<-5
MB^R+1@294E#HM_]965W#58OL5HMV!.L4Q%X&_T8&)HH'B]Y&.@=T!#/ ZPB
M/ !UY[@! %Y=P@8 M!*S$.@' (K#!/"T ,-5'E&Y0 ".V5F _ !T"8#\#W16
MS1#K:CP#=1JX !K-$#P:= 6 )H< _K0!N0<&S1"X P#KWCQ ==JS$+02S1"
M^Q!T/;@2$3+;S1"X !*S(,T0N :S1 \&G0F@ Z' &T ;D !LT0ZQC-$#P#
M=1)0Z'__"L!8= F /H0 &'0"L$ ?7<.T#^AW_U#H%P!9M BW .AK_XK$)'^*
MX(@FP02()L $PU6+[(I&!*+"!+0/Z$[_B";$!#H&P@1T+:#"!+0 Z#S_M _H
M-_^BP@2()L0$@#["! -U$KA ([ )H ^A 8?@7&!L($0( ^P@0#=A. /L($
M0',,@#["! =T!;@! .L",\"BQ02 /L($0'0$L!GK"[A ([ )J"$ /[ HL,$
M@#["! =T'[@ \+KJ_U!2N,T$4.B1_@O =0SHM/X+P'4%N $ ZP(SP*+&!( ^
MP@0'=06X +#K [@ N*/)!,<&QP0 + HKT$HKP$H,0$!/^BO@2@PP0$_Z*_
M!%W#58OL@^P$BUX$T>/WAX@$ )T!;@! .M,N !$BUX$S2%R/O;"@'4UN %"
M,\F+T<TA<BY24+@"0C/)B]'-(8E&_(E6_EI9<AFX $+-(7(2.U;^<@EW!3M&
M_'("Z[<SP.L$4.B4 8OE7<-65[\4 +Y( ^L3BT0")0 #/0 #=056Z"CQ68/&
M$(O'3PO =>9?7L-5B^Q6BW8$]T0" )T ^C(__]T!HM$"(E$"E"*1 284.C!
M H/$!HD$"\!^"(-D M\SP.L>@SP =0Z+1 (E?_X-( ")1 +K",<$ "#3 (0
MN/__7EW" @!5B^Q6BW8$BP1 B016Z 0 65Y=PU6+[%:+=@2#/ !^$(L$2(D$
MBUP*_T0*B@?I@@"#/ !\!_=$ A != F#3 (0N/__ZV^!3 * (-\!@!T#%;H
M5?\+P'0"Z^;KQ/=$ @ "= /H'/^X 0!0N)P(4(I$!)A0Z,P"@\0&"\!U((I$
M!)A0Z)7^63T! '0"ZZ^+1 (E?_X-( ")1 +KI>NC@#Z<" UU!_=$ D =+&#
M9 +?H)P(M !>7<.X2 -0Z%;_6<. /M0$ '0*Q@;4! "@U03K!;@ !\TAM ##
M5H ^U 0 = ?HW/^+\.L*Z-7_B_!0Z*#U68O&7L-5B^R /M0$ '0%N/__ZPO&
M!M0$ 8M&!*+5!%W#58OL5HMV! OV?!6#_EA^ [Y7 (DVU@2*A-@$F(OPZQ&+
MQO?8B_ ](P!_Y<<&U@3__XDVD@"X__]>7<(" %6+[+@ 1(M>!,TADB6 %W#
M58OLBUX$T>.!IX@$__VT0HI&"HM>!(M."(M6!LTA<@+K!5#HC/^97<-5B^R#
M[")65P:+?@H>!XM>"(/[)'=8@/L"<E.+1@R+3@X+R7T1@'X& '0+Q@4M1_?9
M]]B#V0"-=M[C#Y$KTO?SD??SB!1&XPGK\2O2]_.(%$8+P'7UC4[>]]D#SOQ.
MB@0L"G,$!#KK P)&!*KB[[ J@>+1@I?7HOE7<(, %6+[(-^" IU!HM&!)GK
M!8M&!#/24E#_=@;_=@BP 5"P85#H7O]=PU6+[/]V!O]V!/]V"/]V"K 4+!A
M4.A$_UW#58OL_W8&_W8$_W8(_W8*@WX*"G4%N $ ZP(SP%"P85#H'_]=PU6+
M[%97C-B.P(M^!(MV!HM."-'I_/.E<P&DBT8$7UY=PU6+[(/L!%97BT8(0#T"
M '(-BUX$T>/WAX@$ )T!3/ Z8P _W8(_W8&_W8$Z(8 @\0&B4;^0#T" '(-
MBUX$T>/WAX@$ (!T!8M&_NMBBT[^BW8&'@>+_HO>_*P\&G0M/ UT!:KB].L<
MXO &4[@! %"-1OU0_W8$Z#L @\0&6P?\BD;]JCO[=0+KF>L@4[@! %#WV1O
M4%'_=@3H-OZ#Q B+7@31XX&/B 0 ELK^Y=?7HOE7<-5B^RT/XM>!(M."(M6
M!LTA<@+K!%#HN/U=PU6+[(/L*E97QT;\ #'1OH .L9BWX,]D;_('0'Q#V#
M1@P$PXL]'@>#1@P"PP;\BW8*K K =%T\)71<F)?_1OK_=@C_5@19"\!\)0O_
M>#* O3(% 74KDPK;>!B OS(% 741_T;Z_W8(_U8$60O ?^;I30/_=@A3_U8&
M65G_3OKKL3O'=*W_=@A0_U8&65G_3OKI0 /I/0/'1O;__\9&_P"LF(EV"I<+
M_WP9BITR!3+_@_L5=@/I" /1XR[_IW@<E^EX_^D. X!._P'KU(/O,(=^]@O_
M?,JX"@#WYP%&]NO @$[_".NZ@$[_!.NT@$[_ NNN@&;_W^NH@$[_(.NBBT;Z
M*]+V1O\!=$_KE;X( .L,O@H ZP>^$ #K C/V]\<@ '4(BD;_# 2(1O^-1OA0
MC4;Z4(M&]B7_?U!6_W8(_W8&_W8$Z'@#@\0.@W[X 'X8]D;_ 74/_T;\Z+G^
MJ_9&_P1T I*KZ<C^? /I: +I40+H #I9@+_=@A0_U8&65G_3OJ!9O;_?^@
M .EU E(\.G05"\!^#/]V"%#_5@996?].^EJ,V^L;Z Z54"6PO ?A!24_]V
M"%#_5@996?].^EM:]D;_ 740Z$K^_T;\DJOV1O\@= *3J^E5_NGC 8U&^%"-
M1OI0N/]_(T;V4/]V"/]V!O]V!.@J"H/$#(-^^ !^.(I&_YBI 0!U*>@'_O]&
M_/9&_P1T!;@$ .L-]D;_"'0%N @ ZP(SP%!7Z/D)@\0$Z?S]Z/0)Z?;]Z.X)
M?)SIDP'H #IE 'V1O\!=0;HQ/W_1OR!9O;_?W0I]D;_ 74!JO]&^@;_=@C_
M5@19!PO ?A(*P'@)DX"_,@4!DWX%_T[V?]<&_W8(4/]6!EE9!_].^O9&_P%U
M [ JNF2_?9&_P%U ^AN_8MV]@OV?0.^ 0!T&O]&^@;_=@C_5@19!PO ?!;V
M1O\!=0&J3G_F]D;_ 74#_T;\Z5?]Z>4 *\#\%@>-?M:Y$ #SJZR 9O_O/%YU
M!8!._Q"LM "*T(OXL0/3[[D' 2+*TN4(:]:L/ !T)CQ=="4\+77A.A1WW8 \
M7738K"K"=.4"T-#%@]< "&O6_LAU].O5Z9P B78*@6;V_W^+=O;V1O\!=0/H
MR/Q.?%#_1OH&_W8(_U8$60<+P'Q/EHO>L0/3[KD' 2++TN6$:M:6DW0(]D;_
M$'0(ZP_V1O\0= GV1O\!=<2JZ\$&_W8(4/]6!EE9!_].^D8[=O9]"?9&_P%U
M!O]&_+ JNF!_$8[=O9]#/9&_P%U!K JO]&_/]V"+C__U#_5@9968-^_ &#
M7OP !XM&_.F& /]&^O]V"/]6!%D+P'X3"L!X"9. OS(% 9-TY5F#P0/_X73X
M6>N_*]*Y! #_3O9\15)1_T;Z_W8(_U8$65E:"\!^-?[)?#&*Z(#M,'(J@/T*
M<A> [1%R((#]!G(*@.T@<A: _09S$8#%"M'BT>+1XM'B M7KMBO @/D$= 99
M@\$#_^%9Z5__7UZ+Y5W#Y1OE&^4;T!C7&-T8KAHA&2$9*QGN&?$8_1CW&!P9
M4AKL&@\9)AF &0,9"1E3@.LP<B* ^PEV$H#[*G<%@.L'ZP. ZR> ^PEV"SK9
M<P=$1/BW .L"6_G#58OL@^P&5E?&1O\ QT;\ #'1OH! /]&_/]V"/]6!%D+
MP'QHF)/VPX!U"+]! O8! 77CD_].#'Q:/"MT!SPM=1;^1O__3@Q\2O]&_/]V
M"/]6!%D+P'PU*_:+_HM."N--@_DD=RZ ^0)R*3PP=6N ^1!U9/].#'PR_T;\
M_W8(_U8$63QX=%$\6'1-ZW/'1OK__^L%QT;Z #_=@A0_U8&65G_3OPKP)GI
MIP#IE \,,=&"@H =2/_3@Q\[_]&_/]V"/]6!%G'1@H( #QX= 0\6'4MQT8*
M$ #K%XM."I/H]?Z3<K"6ZPJ6]V8* _ 3^G4L_TX,?$S_1OS_=@C_5@19BTX*
MD^C/_I-SW>LJEO?AEX?*]^(#]Q/!EQ+6=4?_3@Q\(/]&_/]V"/]6!%F+3@J3
MZ*/^DW/6_W8(4/]6!EE9_T[\B]>6@'[_ '0']]KWV(/: (M^#HM>_ $=BWX0
MBU[ZB1WK%KC__[K_?P)&_X#4 (/2 ,=&^@( Z]A?7HOE7<.*QN@" (K"U!"&
MX.@" (;@!) G%$ GJL-5B^R![)8 5E?'1NX ,=&[% QT;J #K1E>Y__\R
MP/*N]]%)7\,VB 5'_D[L?B]345(&C89J_ROXC89J_U!7_W8(_U8*"\!U!<=&
MZ@$ QT;L4 !?NZ-OFK_!UI96\,&_(V^:O^)?OR+?OR+=@:L"L!T$CPE=!$V
MB 5'_D[L?^[HK/_KZ>GK XEV\*P\)73GB7[\,\F)3O*)3OZ(3O7'1OC__\=&
M]O__ZP&L,N2+T(O8@.L@@/M@<Q.*G[D%@_L7=@/IG@/1XR[_I_HBZ90#@/T
M=_B#3OX!Z]" _0!W[8-._@+KQ8#] '?B@'[U*W0#B%;UZ[6#9O[?ZP2#3OX@
MM07KIX#] '=*]T;^ @!U*8-._@BU >N3Z4D#BWX$-HL%@T8$ H#] G,2"\!Y
M!O?8@T[^ HE&^+4#Z6__@/T$==>)1O;^Q>EB_X#]!'/*M03I6/^2+#"8@/T"
M=QFU H=&^ O ?-31X(O0T>#1X /" 4;XZ3;_@/T$=9Z'1O8+P'RXT>"+T-'@
MT> #P@%&]ND:_X-._A#I:/^!3OX 8-F_N_I7/^W".L*MPKK"K<0L^D"VL9&
M]0"(5OLSTHA6^HM^!#:+!>L0MPK&1OH!B%;[BWX$-HL%F4='B78&]T;^$ !T
M!3:+%4='B7X$C7Z["\!U+PO2=2N#?O8 =2F+?OR+3OCC&H/Y_W05BT;^)0@
M= 2R,.L"LB"*PN@,_N+YZ4S^@T[^!%)05XK'F%"*1OI04^BE]18'BU;V"])_
M ^GQ .G\ (A6^XEV!HU^NHM>!#;_-T-#B5X$]T;^( !T$#:+%T-#B5X$%@?H
M?OVP.JH6!UKH=?TVQ@4 QD;Z (-F_ON-3KHK^8?/BU;V.]%_ HO1Z9X B78&
MB%;[BWX$-HL%@T8$ A8'C7Z[,N0VB06Y 0#IN0")=@:(5ON+?@3W1OX@ '4-
M-HL]@T8$ AX'"__K"S;$/8-&! 2,P O'=04>![^R!>@V_3M.]G8#BT[VZWV)
M=@:(5ON+?@2+3O8+R7T#N08 5U&-7KM34K@! "-&_E"+1OZI %T";@( (-&
M! KK!X-&! BX!@!0Z)X"%@>-?KOW1OX( '08BU;X"])^$>C9_": /2UU 4DK
MT7X#B5;RBD;U"L!T$B: /2UT#(-N\@&#5O( 3R:(!>BO_(OWBW[\BU[XN 4
M(T;^/04 =1.*9ON _&]U#8-^\@!_!<=&\@$ ZQN _'AT!8#\6'41@T[^0$M+
M@V[R GT%QT;R #3O+W1OX" '4,ZP:P(.AH_$L[V7_V]T;^0 !T"[ PZ%?\
MBD;[Z%'\BU;R"])^)RO**]HFB@0\+70(/"!T!#PK=0<FK.@R_$E+A\KC![ P
MZ"?\XOF'RN,2*]DFK#:(!4?^3NQ_ ^@:_.+P"]M^"8O+L"#H!/SB^>E$_(EV
M!HM^!/=&_B =0LVBSV#1@0"'@?K!S;$/8-&! 2X4 J1NP#1NXFB07W1OX0
M '0'1T<FQP4 .D%_(MV\(M^_+ EZ+C[K K =?B ?NQ0?0/HL_L'@W[J '0%
MN/__ZP.+1NY?7HOE7<(( $P?-A^!'T$?KQ^Y'_<?_A\#(&H?+" *( X@$B"H
M(%0A^" 8(8XBRB+*(LHB7!]B'U6+[(M&!$B*%L0$M@#WZE"AQP1: \*+5@9*
M \+1X(L6R01=P@0 58OL3$Q65Z#&!+0 B4;^'HM.!.-:Q'X*Q78&_#OW<PJ+
MP4C1X /P _C]@W[^ '4$\Z7K.[K: XS C-L[PW01^NS0R'+[[-#(<_NE^^+Q
MZQ_Z[-#(<OOLT,AS^ZW[B]CLT,AR^^S0R'/[B\.K^^+A_!]?7HOE7<(* %6+
M[(M>!-'C]X>(! (=!.X @!0,\ STE!2_W8$Z"SR@\0(M$"+7@2+3@B+5@;-
M(7(/4(M>!-'C@8^(! 06.L$4.BY\5W#NAH&ZP.Z'P:Y!0"T0+L" ,TAN2<
MNB0&M$#-(>GQW?\F4@;_)E0&_R96!O\F6 8 5E>+](M<!H/K!'(..QY.!G0%
MZ$( ZP/H P!?7L,Y'DP&=".+=P+V! %T!HDV3@;K(#LV3 9T#8O>Z%0 BT<"
MHTX&ZPV+WC/ HTP&HTX&HU &4^@5[5O#_P\['DP&=!B+=P*+!*@!=0\#!XD$
MBS\#^XEU HO>ZP/H,@"+/P/[BP6H 70!PP$'B_<#\(E< HO?BW\&.]]T#HD^
M4 :+=P2)=02)? ;#QP90!@ PXLV4 8+]G00BWP&B5P&B5T$B7\&B7<$PXD>
M4 :)7P2)7P;#5E>+](M$!@O =%(%!0!R-B7^_ST( ',#N @ @SY,!@!T'XL>
M4 8+VW0-B],Y!W,:BU\&.]IU]>AF .LAZ(H ZQSH' #K%S/ ZQ.+\(/&"#DW
M<^GH:___!XO#!00 7U[#4#/ 4%#H5>Q;6R4! '0),])24.A'[%M;6% SVU-0
MZ#SL6UL]__]T%(O8B1Y,!HD>3@980(D'@\,$B\/#6S/ PU SVU-0Z!7L6UL]
M__]T%HO8H4X&B4<"B1Y.!EA B0>#PP2+P\-8,\##*0>+\P,WB_X#^$")!(E<
M HEU H/&!(O&PXOL4U!14.@5_UN+V O =!\>!_R+^(MV_HL,@\8$5H/I!='I
M\Z6)1O[H)/Y;BU[^@\0&PXO"@\((.]%W-8O1.QY.!G4/B0?_!P/#4U#H:NM;
M6^L>B_L#^(E= BO0*1>+]P/RB7P"0HD5B\N+W^@W_HO9@\,$PU9758OLBUX(
MBT8*"\!T-PO;="V#ZP2+#TF+T(/"!8/B_H/Z"',#N@@ .\IR#'<%@\,$ZPCH
MA__K ^A/_XO#ZPU0Z&7^ZP93Z)#],\!;75]>PP "B@X 0
MU1( 5'5R8F\@0RLK("T@0V]P>7)I9VAT(#$Y.3 @0F]R;&%N
M9"!);G1L+@!.=6QL('!O:6YT97(@87-S:6=N;65N= T*1&EV:61E(&5R<F]R
M#0I!8FYO<FUA;"!P<F]G<F%M('1E<FUI;F%T:6]N#0H
M )X(G@@ !$:7-K
M(&5R<F]R('-T871U<SH@)7@* H*26YS97)T($QI;G5X(&)O;W0@9&ES:R!I
M;G1O(&1R:79E($$Z(&%N9"!H:70@82!K97D@+BXN H 4F5S971T:6YG(&-O
M;G1R;VQL97(@+BXN"@!,;V%D:6YG(&)O;W0@<V5C=&]R("XN+@H 0W5R<F5N
M="!M86IO<B!B;V]T(&1E=FEC93H@)60* $-U<G)E;G0@;6EN;W(@8F]O="!D
M979I8V4Z("5D"@ * $YE=R!D979I8V4@=F%L=65S.@H 16YT97(@;F5W(&UA
M:F]R(&1E=FEC93H@ "5D $5N=&5R(&YE=R!M:6YO<B!D979I8V4Z( E9 *
M0VAE8VLZ(&-H86YG:6YG(')O;W0@9&ES:R!T;R!M86IO<B E9"P@;6EN;W(@
M)60* $ES('1H:7,@3TL@*'DO;BD_( * $%B;W)T:6YG("XN+@H 5W)I=&EN
M9R!B;V]T('-E8W1O<B N+BX* %)O;W0@9&5V:6-E(&-H86YG960A"@
M(" @(" @(" @(2$A(2$@(" @(" @(" @(" @(" @(" !0$! 0$! 0$! 0$!
M0$! @(" @(" @(" D! 0$! 0$ 4%!04%!0$! 0$! 0$! 0$! 0$! 0$! 0$
M!$! 0$! 0!@8&!@8& @(" @(" @(" @(" @(" @(" @(0$! 0"
M
M
M !4!50%5 4 D"
M $@# * @$ !8 P @(" : , $,"
M P '@# !" @0 "( P #_ F ,
M _P *@# /\ "X P #_
MR , _P -@# /\ #H P #_
M ^ , _P @$ /\ 8! #_
M * 0 _P #@$ /\ !(! #_
M 6 0 _P &@$ /\ !X! $@
M B "( 2@ J#_______________________________________\ T
M 0 0 ! $-/35!!40 !," @0%!@@("!05
M!1/_%@41 O________________\%!?____________________\/_R,"_P__
M____$___ @(%#P+___\3__________\C_____R/_$_\ (" @(" @(" 0$!
M 0$" @(" @(" @(" @(" @(" @(! @(" @," @("! (" @("!04%!04%!04%
M!0(" @(" @(" @('"A4*# D" @L"% X" @(" @@" A(" A "$ (" @("!@<*
M"@H,"0("#0(1#A," @\"" ("$@(" @(" @(H;G5L;"D !04 105%!04% (
M% ,$% D%!04%!04%!044%!04%!04%!04% \7#P@4%!0'%!84%!04%!04%!0-
M%!04%!04%!04%! *#P\/" H4% 84$@L.%!01% P4% T4%!04%!04 '!R:6YT
M('-C86YF(#H@9FQO871I;F<@<&]I;G0@9F]R;6%T<R!N;W0@;&EN:V5D#0H
M $"05)!4D%20
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M /M2"0(E!@ O B B !_ #, $ "< 0 ! $ \#$ !
M $ / 0 ( N 0 , "H 0 0 @ @ 4
M U @ 8 W @ < (@ Y @ & @ (0!: @ & D #G P H
M +! L ^!0 P '@!5!0 T !X!0 X #Z!0 \
M "6!@ ! #X!@ !$ &P Y!P !( "@!P !, #O!P !0
M G" !4 &0#-" !8 #D" !< #^" !@ "@ !D
M 4"@ !H !&"P !L ""# !P "_# !T @#0 !X
M "*#@ !\ #O#@ " 'P#D#P "$ "$ "( ?$ ",
M W$ "0 !!$ "4 !0$ "8 !C$ "< !2$0 "@
M&@!S$0 "D "J$0 "H #,$0 "L #]$0 "P )$@ "T
M !1$@ "X #5$@ "\ #U$@ # #/$P #$ "U% #(
M #)% #, #)% #0 !L%0 #4 '0!U%0 #8 ".%0 #<
M ".%0 #@ "K%0 #D "K%0 #H #'%0 #L $%@ #P
M 5%@ #T ^%@ #X "[%@ #\ #B%@ $ #\%@ $$
M A%P $( !"%P $, #W%P $0 1& $4 #/' $8
M !F'@ $< J(P $@ !0(P $D #)(P $H O) $L
M S) $P W) $T [) $X ! ) $\ /)0 %
M !F)@ %$ &T" %( !R &T" %, !V &T" %0 !Z &T" %4
M !^ &T" %8 "" &T" %< "$ &T" %@ "& &T" %D "( &T" %H
M "* &T" %L ", &T" %P ". &T" %T "0 &T" %X "0 &T" %\
M "1 &T" & "2 &T" &$ "4 &T" &( "8 &T" &, ": &T" &0
M "< &T" &4 "@ &T" &8 "D &T" &< ^ FT" &@ ! FT" &D
M !" VT" &H !$ VT" &L !& VT" &P !( VT" &T "(!&T" &X
M "P!&T" &\ "X!&T" ' "Z!&T" '$ "\!&T" '( #+!&T" ',
M #6!&T" '0 #8!&T" '4 !,!FT" '8 !.!FT" '< !0!FT" '@
M !2!FT" 'D !4!FT" 'H ( !:!FT" 'L !:"&T" 'P !7T
M !7X , !7\ $ !80 ! $ "H0 ! $ "H4
M"@#\_P H8 "@#^_P H< & "L_P H@ ! ' !(D ! & !(H
M"@ $ !HL !@ $ !H$ "# $)AP " $ 0 !
M $ C (T ".
M CP ) "1
M D@ ), "4
M E0 )8 "7
M F )D
M ": FP )P
M "= G@ )\
M "@ H0 *(
M "C I *4
M "F IP
M *@ "I J@
M *L "L K0
M *X "O L
M +$ "R LP
M +0 "U
MM@ +< "X
M N0 +H "[
M O (( JAIR& < .0() #P""@!$ @L 4 (,
M %@"#@!: A, 8@(4 &H"%0!M A8 =0(7 'T"& "= AD H@(: *H"&P#+ AP
M\0(= /8"'@ $ Q\ $@,@ !H#(0 B R( *@,C #(#) !$ R4 3 ,F %0#)P!F
M R@ =@,I 'X#*@"+ RL D ,L )@#+@"? R\ I0,P *L#,0"S S( U ,S -D#
M- #A X 0 .0(A ($ 0 ! / (> 6@*- 8( !0 #
M 8@*% 0( Y JX! 0 $ $ 0 ! $ 0 G ! 0
M @" ____?P 4 ( 0 (#___]_ & $ & (#___]_"
M 0 " _P D ( H /__ * $ , #_____
M#0 ! / ( ! H #@ !@ H ! P $
M !, /\ ' ( L @ *P "@ : !0 " ",
M @ 0 (P ! C < !4 ( ! ( (P ! C $
M ", @ 0 &@ ( @ C $ ", $ 7U]E>&ET8VQE86X
M7U]E>&ET %]?<F5S=&]R97IE<F\ 7V%B;W)T $1'4D]54$ 7U]-34]$14P
M7V-H96-K %]M86EN %]A=&5X:70 7U]#4%543@!?8W!R:6YT9@!?97AI= !?
M9F9L=7-H %]F;'5S:&%L; !?9G-E96L 7V9T96QL %]G971S %]G971T97AT
M %]P=71T97AT %]M;W9E=&5X= !?<')I;G1F %]?9G!U=&, 7V9P=71C %]F
M<'5T8VAA<@!?7T90551. %]P=71C: !?7U-#4D5%3DE/ %]?5D%,241!5$58
M60!?7U-#4D],3 !?7W-E='5P:6\ 7W-E='9B=68 7W-S8V%N9@!?=G-S8V%N
M9@!?=&5L; !?7W=H97)E>'D 7W=H97)E> !?=VAE<F5Y %]W<FET90!?7WAF
M9FQU<V@ 7V)I;W-D:7-K %]?7V)R:P!?7U]S8G)K %]B<FL 7W-B<FL 7U]6
M:61E;TEN= !?7V,P8W)T:6YI= !?7V-R=&EN:70 7V5O9@!?7V9G971C %]?
M3F9G971C %]F9V5T8P!?9F=E=&-H87( 7V=E=&-H %]?3F=E=&-H90!?9V5T
M8VAE %]?3G5N9V5T8V@ 7W5N9V5T8V@ 7U])3T524D]2 %]I<V%T='D 7VQS
M965K %]?3$].1U1/00!?:71O80!?=6QT;V$ 7VQT;V$ 7VUE;6-P>0!?<F5A
M9 !?7W)E860 7U]S8V%N;F5R %]?<V-A;G1O; !?7U904DE.5$52 %]?5E!4
M4@!?7U9204T 7U]W<FET90!?7U)%04Q#5E0 7U]S8V%N=&]D %]?<V-A;G)S
M;'0 7U]S8V%N<&]P %]F<F5E %]M86QL;V, 7W)E86QL;V, 1$%405-%1T
M7U]);G0P5F5C=&]R %]?26YT-%9E8W1O<@!?7TEN=#5696-T;W( 7U]);G0V
M5F5C=&]R %]?0S!A<F=C %]?0S!A<F=V %]?0S!E;G9I<F]N %]?96YV3&YG
M %]?96YV<V5G %]?96YV4VEZ90!?7W!S< !?7V]S;6%J;W( 7U]V97)S:6]N
M %]?;W-M:6YO<@!?97)R;F\ 7U]3=&%R=%1I;64 7U]?:&5A<&)A<V4 7U]?
M8G)K;'9L %]?:&5A<&)A<V4 7U]B<FML=FP 7U]H96%P=&]P %]?871E>&ET
M8VYT %]?8W1Y<&4 7U]E>&ET8G5F %]?97AI=&9O<&5N %]?97AI=&]P96X
M7U]S=')E86US %]?;W!E;F9D %]?:&5A<&QE;@!?7W-T:VQE;@!?7W=S8W)O
M;&P 7U]V:61E;P!?9&ER96-T=FED96\ 7U]D;W-E<G)N;P!?7V1O<T5R<F]R
M5&]35@!?7V9I<G-T %]?;&%S= !?7W)O=F5R %]?4F5A;$-V=%9E8W1O<@!?
M7U-C86Y4;V1696-T;W( 7V)U9F9E<@!?7V%T97AI='1B; !?7W1U<F)O0W)T
M %]?8W9T9F%K %]?04A32$E&5 !?7T%(24Y#4@!#,"Y!4TT 0S!3 %-%5%)/
M3U0N0P!315123T]4 ')E<P!M:6YO<@!M86IO<@!I;@!X ')E<W5L= !S:7IE
M7W0 9G!O<U]T $%415A)5 !#4%))3E1& $-465!% $58250 1D9,55-( $9)
M3$53 $9)3$53,@!&3%532$%,3 !&4T5%2P!'1513 $=05$585 !(14%03$5.
M $U/5D5415A4 %!224Y41@!0551# %!55$-( %-#4D5%3@!30U)/3$P 4T54
M55!)3P!315160E5& %-30T%.1@!35$M,14X 5$5,3 !72$5215A9 %=2251%
M %=30U)/3$P 6$9&3%532 !"24]31$E32P!"4DL 0U)424Y)5 !%3T8 1T54
M0P!'151#2 !)3T524D]2 $E3051460!,4T5%2P!,5$]! $U%34-060!214%$
M %)%041! %-#04Y.15( 4T-!3E1/3 !64%))3E1%4@!64D%- %=2251%00!#
?5E1&04L 4D5!3$-65 !30T%.5$]$ $Y%05)(14%0 !6
end
------------------------- end setroot.uue ----------------------------
If there is some demand, I can extend the program to use
standard HD device names instead of major/minor device numbers.
Enjoy,
Henning
------------------------------------------------------------------------
Henning Spruth spruth@regent.e-technik.tu-muenchen.de
Institute of Electronic Design Automation
Technical University of Munich, Germany
--
------------------------------------------------------------------------
Henning Spruth spruth@regent.e-technik.tu-muenchen.de
Institute of Electronic Design Automation
Technical University of Munich, Germany

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.