home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Developer CD v1.2
/
amidev_cd_12.iso
/
reference
/
amiga_mail_vol1
/
dos
/
harddiskii
< prev
next >
Wrap
Text File
|
1990-01-26
|
18KB
|
492 lines
(c) Copyright 1989 Commodore-Amiga, Inc. All rights reserved.
The information contained herein is subject to change without notice, and
is provided "as is" without warranty of any kind, either expressed or implied.
The entire risk as to the use of this information is assumed by the user.
Setting Up Your Hard Disk
for WorkBench V1.3
Part II
by Bill Koester
Part I of this article dealt with the physical details of setting up a hard
drive and the related system software. This article covers how to install
your application software for the best results.
If you followed the guidelines in Part I, you now have a hard disk divided
into two partitions, dh0: and fh0:. The fh0: partition should have all the
system software on it but ONLY ONE user directory, namely fh0:user. The idea
is to isolate system software from application software in order to make
upgrades, backups and file recovery as simple as possible. Use the standard
startup sequences on fh0:, but make the following two changes. First, add
these lines to fh0:s/startup-sequence just before the loadwb command:
IF EXISTS SYS:user/user.startup-sequence
execute sys:user/user.startup-sequence
ENDIF
Second, add these lines to fh0:s/shell-startup:
IF EXISTS SYS:user/user.shell-startup
execute sys:user/user.shell-startup
ENDIF
With this arrangement, all application files are isolated in the SYS:user
directory. Any additions to the startup-sequence or shell-startup files
neccessary for a particular application can be made in the user versions
(SYS:user/user.startup-sequence and SYS:user/user.shell-startup) since
they will now be executed automatically by the main startups.
Keeping user software isolated in its own directory makes it easier to back
up and easier to restore. If you make regular backups of the SYS:user
directory you can feel confident of your ability to reformat and properly
restore the system - simply reinstall the system (as in Part I of this
article) and then copy the files from your backup to the SYS:user
directory.
For more security, you could make two partitions - one for system files and
the other for user files - then use the V1.3 Lock command to protect the
system directories from over-writing. That way you can be sure you will not
change them.
Applications
Separating system files from user files makes it easier to manage your hard
disk. It is also easier if you keep the user files separate from each other.
Many applications need assignments or paths for their directories. These are
usually made in the main startup file but this makes moving or deleting an
application difficult once it has been installed.
For instance, suppose you have several applications that need special assigns.
You could put these assigns in the user.startup-sequence, but if you do it this
way, as you add applications, the user.startup-sequence could become too large
to easily edit or understand. If you decide to move or delete a directory
with paths or assigns to it, you will first have to remove all references to
that directory from the user.startup-sequence, reboot the machine and then
remove the directory.
A much better way is for the applications to do their own startups. That way,
the special assigns and paths that an application needs can be stored with
the application itself instead of in some generic, catch-all startup-sequence
in some other directory.
The Config Program
This is the purpose of the utility program Config. With Config you can create
a master startup-sequence which will call a local startup for each application
in turn. Config will automatically write the master startup script for you.
The command format for Config is:
Config Directory OutFile SearchName
Config will search a given directory and all its sub-directories for files with
the given name. Each time it finds a match, Config will write these two lines
to a separate file you specify:
cd Device:Dir/Dir/Dir
execute Device:Dir/Dir/Dir/Filename
The first line is a CD to the directory where the file was found. The second
line executes the file as a script while CD'ed to its directory. Adding these
two lines to a script will cause it to pass control to another script and then
return when that script is done. For instance assume the following directory
structure on fh0:
SYS:user(dir)
/ \
/ \
SuperPaint(dir) SuperC(dir)
.startup
The directory SYS:user contains two subdirectories. The subdirectory SuperPaint
contains the file .startup. If you give the following Config command:
Config SYS:user SYS:user/user.startup-sequence .startup
then Config will search all of SYS:user looking for files named .startup. When
Config finds SYS:user/SuperPaint/.startup it will add these two lines to the
SYS:user/user.startup-sequence file:
cd SYS:user/SuperPaint
execute SYS:user/SuperPaint/.startup
Now when the system boots, s:startup-sequence will call sys:user/user.startup-
sequence which will now call sys:user/SuperPaint/.startup and any other
.startup files found in the sys:user directory.
You can use the same method to add a separate shell-startup script file, called
.shell, for each application with the following Config command:
Config SYS:user SYS:user/user.shell-startup .shell
These two Config commands will take care of any set up needed for all
applications as long as they have local scripts called .startup and .shell.
For my system I made an IconX script so that these two lines execute from an
icon on my hard drive. This is convenient, as you will see, since you have to
reconfigure your system whenever you add or delete directories that had paths
or assigns to them.
Now let's consider the contents of the local .startup and .shell scripts.
Config requires us to write position-indpendent scripts. This means that any
.startup or .shell script should work regardless of its physical position in
the file system. Let's take SuperPaint as an example.
Suppose that SuperPaint needs the assignment SuperPaint: to function properly
and that you would also like to add a path to its directory so you can execute
it from the CLI. You could use this script:
assign SuperPaint: sys:user/superpaint
path sys:user/superpaint
However, this is not the best solution. If you decide to move the SuperPaint
directory to sys:user/Paint/SuperPaint, this script won't work anymore because
the absolute paths are wrong. However, if you write the script as:
assign SuperPaint /SuperPaint ;You could use "" instead of
path /SuperPaint add ;/SuperPaint to mean "right here"
echo "SuperPaint"
then the script will work regardless of its position. The echo command is
used here to show what is being configured and in what order.
The .shell files are similar to .startup files except that they get executed
every time a new shell is opened. I use .shell files to configure my source
code directory. For example, the .shell for my source directory is:
alias ls dir
alias mv rename
stack 50000
cd src:config
Each time I open a new shell, the above aliases are entered, my stack is set
to 50000 bytes and I wind up CD'ed to my working directory. If I change
projects, I can edit my .shell file to CD me to the right directory.
Using Config in this way, all information needed to set up an application is
kept in the same directory as the application. There is still one problem
with this scheme though - and that is how to handle paths to system directories
that may be needed. Hopefully a future operating system release will allow
multiple paths for system directories, such as:
assign fonts: sys:fonts ;First path...
assign fonts: sys:user/app1/fonts add ;this command does not exist yet
You can begin to plan for this now. For example, if an application needs
fonts, you can modify the .startup file for the application by adding the
following:
IF NOT EXISTS fonts:my_app_font ;Check if a local font has been copied
copy fonts fonts: ;if not, copy all fonts from here to the
ENDIF ;main fonts: directory
If this is the .startup file for SuperPaint and the directory SuperPaint/fonts
exists, then the above script fragment will copy the application-specific fonts
to the system's font directory where they can be found by all. The script
will only copy the fonts if they have not already been copied . This will
cut down on the user waiting time since these scripts are executed every time
the system boots.
Maintenance
If you follow the arrangement above, then your system files are separated from
your applications in SYS:user. Each application has its own sub-directory with
.startup and .shell files if needed. You also have an IconX script which will
create the master startup that calls on each application's local .startup file
in turn. For system maintenance you should also make a IconX script that
deletes the two files SYS:User/user.startup-sequence and SYS:User/user.shell-
startup. Maintenance involves three basic operations: adding, deleting and
moving applications.
Adding
To add a new application, make a directory for it in SYS:user or below. Copy
the application files to the new directory and create a .startup file if the
application needs fonts, libs, assigns, paths or any other set-up that only
needs doing once. Next create a .shell file if one is needed (most software
can be configured without a .shell). Now to install the application into the
system simply click on the IconX script that makes the master startup. The
old user.startup-sequence and user.shell-startup will be overwritten with the
new copy.
Deleting
Since it is not possible to delete a directory that has current assigns or
paths associated with it, you must first remove the assigns and paths. To do
this, click on the IconX script that deletes the SYS:User/user.startup-sequence
and SYS:User/user.shell-startup files. Now reboot the Amiga. Since the files
no longer exist, the assign and paths will not be set and you can delete the
application with:
delete sys:User/SuperPaint#? all quiet
After the desired applications have been removed click on the Config IconX
script to reconfigure the applications that remain. Now reboot and
everything will be in order.
Moving
To move an application directory, follow the same rules as for deletion, but
instead of deleting the directory after the first reboot, use rename to move
it to another part of the same partition or use copy to move it to another
drive (rename does not work across devices). Then delete the old copy of the
application, reconfigure and reboot.
Editing
You can edit .startup and .shell files without reconfiguring. But you will
have to reboot to activate the changes you have made to a .startup. For .shell
files, just close and reopen any shell windows and the changes will take effect.
As you can see the Amiga's user environment can be complicated. I hope the
information given here takes some of the hassle out of setting up your hard
drives. By following the procedures here upgrades, backups and restoring
files will be easier. You can extend these procedures for more than one
hard disk, or even to a network.
------------------------ Lauren, code starts here ---------------------
/*********************************************************************/
/* */
/* Config.c - Hard Drive Configure Utility by Bill Koester (CATS) */
/* */
/*********************************************************************/
/* Runs from the CLI only */
#include <exec/types.h>
#include <intuition/intuition.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
int gargc;
char *gargv2;
char *gargv3;
main(argc,argv)
int argc;
char *argv[];
{
int Error = 0;
struct FileLock *lock = 0;
struct FILE *fp = 0;
/*********************
* Usage Information
*********************/
if(argc!=4) {
printf("\nConfig Version 1.0 by Bill Koester (CATS)\n");
printf("Usage:\n");
/* argv[0] [1] [2] [3] */
printf(" Config Directory OutFile SearchName\n\n");
Error=5;
goto Cleanup;
}
/******************************
* Initialize globals (yikes!)
******************************/
gargc=argc;
gargv2=argv[2];
gargv3=argv[3];
/*************************
* Get lock on directory
*************************/
if((lock=(struct FileLock *)Lock(argv[1],ACCESS_READ))==0)
{
printf("Could not get lock on %s\n",argv[1]);
Error=5;
goto Cleanup;
}
/*************************
* Open output file
*************************/
if((fp=(struct FILE *)fopen(argv[2],"w+"))==0)
{
printf("Could not open file %s\n",argv[2]);
Error=5;
goto Cleanup;
}
/***************************************************
* Recursive routine to do this dir and all subdirs
***************************************************/
DoDir(lock,fp);
Cleanup:
if(lock) UnLock((BPTR)lock);
if(fp) fclose(fp);
return(Error);
}
/***********************************************************************
*
* DoDir(lock,fp)
*
* Starting at the 'lock'ed directory search all subdirectorys
* for files with the name pointed to by gargv3. for each file found
* write to the file whose name is pointed to by gargv2.
*
***********************************************************************/
DoDir(lock,fp)
struct FileLock *lock;
struct FILE *fp;
{
struct FileInfoBlock *FIB;
struct FileLock *OldLock;
struct FileLock *TempLock;
int Error =0;
OldLock=(struct FileLock *)CurrentDir((BPTR)lock);
/**************************
* Allocate a FileInfoBlock
**************************/
if((FIB=(struct FileInfoBlock *)AllocMem(sizeof(struct FileInfoBlock),0))==0)
{
printf("Could not allocate memory for FIB\n");
Error=5;
goto Cleanup;
}
/*******************
* Set up for ExNext
*******************/
if(Examine((BPTR)lock,FIB)==0)
{
printf("Examine failed\n");
Error=5;
goto Cleanup;
}
more:
/*********************************************
* If no more entries in this branch then exit
*********************************************/
if((ExNext((BPTR)lock,FIB)==0)&&(IoErr()==ERROR_NO_MORE_ENTRIES))
goto exit;
/**********************
* Is this a directory?
**********************/
if(FIB->fib_DirEntryType>0)
{
/**************************
* Yes, get lock on new dir
**************************/
if((TempLock=(struct FileLock *)Lock(FIB->fib_FileName,ACCESS_READ))==0)
{
printf("DoDir could not get a lock!\n");
}
else
{
/*****************************************************
* Call DoDir recursively to process the new directory
*****************************************************/
DoDir(TempLock,fp);
UnLock((BPTR)TempLock);
}
}
else
{
/***********************************
* No, It's a file so check its name
***********************************/
if(stricmp(gargv3,FIB->fib_FileName)==0)
{
/**********************************************
* We have a match so write an entry to OutFile
**********************************************/
fprintf(fp,"cd ");
PrintCurrentDir(lock,fp);
fseek(fp,-1L,1); /* Remove trailing backslash */
fprintf(fp,"\n");
fprintf(fp,"execute ");
PrintCurrentDir(lock,fp);
fprintf(fp,gargv3);
fprintf(fp,"\n");
}
}
goto more;
exit:
Cleanup:
CurrentDir((BPTR)OldLock);
if(FIB) FreeMem((char *)FIB,sizeof(struct FileInfoBlock));
return(Error);
}
/************************************************************************
*
* PrintCurrentDir(lock,fp);
*
* Prints to the file fp the full path name for the entity associated with
* 'lock'. This function is also recursive.
************************************************************************/
PrintCurrentDir(lock,fp)
struct FileLock *lock;
struct FILE *fp;
{
struct FileLock *parent;
struct FileInfoBlock *FIB;
/************************
* Allocate FileInfoBlock
************************/
if((FIB=(struct FileInfoBlock *)AllocMem(sizeof(struct FileInfoBlock),0))==0)
{
printf("PrintCurrentDir could not allocate memory for FIB!\n");
goto Cleanup;
}
/**************************************************************
* If there is no parent for this lock then we have the volume
* and our base case.
**************************************************************/
if((parent=(struct FileLock *)ParentDir((BPTR)lock))==0)
{
/*******************
* Print volume name
*******************/
Examine((BPTR)lock,FIB);
fprintf(fp,"%s:",FIB->fib_FileName);
goto Cleanup;
}
/**************************************************
* Recursively print the parent of the current lock
**************************************************/
PrintCurrentDir(parent,fp);
UnLock((BPTR)parent);
/*****************************************
* Then tack the current lock onto the end
*****************************************/
Examine((BPTR)lock,FIB);
fprintf(fp,"%s/",FIB->fib_FileName);
Cleanup:
if(FIB) FreeMem((char *)FIB,sizeof(struct FileInfoBlock));
return(0);
}