home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
118.lha
/
showlocks.c
< prev
next >
Wrap
C/C++ Source or Header
|
1986-11-20
|
4KB
|
141 lines
/*
* showlocks.c
*
* Written 13-Mar-88 by Chuck McManis
* Copyright 1988 Charles McManis, All rights reserved.
* This file may be freely redistributed and used as long as this notice remains
* with it.
*
* This program will list out all of the locks that are being held on the
* specified volume. You can enter either a volume name or disk device.
*
* The output of this program is :
* Lock #0 : 'Path'
* Lock #1 : 'Path'
* ...
*/
#include <exec/types.h>
#include <exec/memory.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
extern struct DosLibrary *DOSBase;
char *GetPath();
void
main(argc,argv)
int argc;
char *argv[];
{
int j,NumVols;
struct DeviceList *dl,*vols[20];
struct RootNode *rn;
struct DosInfo *di;
char *t,tmpname[40];
if (argc != 2) {
printf("Usage is : ShowLocks Volumename:\n");
exit(0);
}
NumVols=0;
if (strcmp(argv[1],"all") == 0) {
/* Find the device list */
rn = (struct RootNode *)DOSBase->dl_Root;
di = (struct DosInfo *)BADDR(rn->rn_Info);
/* While searching the list we lock out Multitasking */
Forbid();
for (dl = (struct DeviceList *)BADDR(di->di_DevInfo); dl;
dl = (struct DeviceList *)BADDR(dl->dl_Next))
if (dl->dl_Type == DLT_VOLUME) vols[NumVols++] = dl;
Permit(); /* Back to multitasking mode */
}
printf("Lock Monitor, prints out outstanding locks on a given volume.\n");
if (NumVols) {
for (j=0; j<NumVols; j++) {
t = (char *)BADDR(vols[j]->dl_Name);
t++; /* point past the length */
strcpy(tmpname,t); /* Put the name in here... */
strcat(tmpname,":"); /* and append a colon ... */
/*BUG*BUG*BUG*BUG*BUG*BUG*BUG*BUG*BUG*/
/* Delete this line when you get 1.3 */
if (strcmp(t,"RAM Disk") == 0) continue;
if (vols[j]->dl_Task) {
printf("Locks held on Volume %s\n",tmpname);
PrintLocks(tmpname);
} else printf("Volume %s is not mounted.\n",tmpname);
}
} else {
printf("Locks held on Volume %s\n",argv[1]);
PrintLocks(argv[1]);
}
}
PrintLocks(str)
char *str;
{
ULONG thislock;
struct FileLock *fl;
int i;
thislock = Lock(str,ACCESS_READ);
i = 0;
for (fl = (struct FileLock *)(BADDR(thislock)); fl;
fl = (struct FileLock *)(BADDR(fl->fl_Link)))
printf(" Lock #%d : '%s'\n",i++,GetPath((ULONG)(fl) >> 2));
if (thislock) UnLock(thislock);
return(0);
}
/*
* Function GetPath()
*
* This function will return a pointer to a string with the path of
* the passed lock.
*/
char *
GetPath(Lck)
ULONG Lck;
{
static char LockPath[256];
UWORD FDATA[sizeof(struct FileInfoBlock)/2+1];
ULONG CurLock,NewLock;
char *s;
struct FileInfoBlock *fi;
/* Initialize LockPath to the NULL string */
LockPath[0] = '\0';
if ((Lck == 0) || (Lck == ~0L))
return(LockPath); /* If Lock is on root (0) return */
/* Initialize fi so that it is on a long word boundary */
if ((long)(FDATA) & 2) fi = (struct FileInfoBlock *)(&FDATA[1]);
else fi = (struct FileInfoBlock *)FDATA;
CurLock = DupLock(Lck); /* Make a copy of the Lock passed */
while (CurLock != NULL) {
Examine(CurLock,fi);
if ((CurLock != 0) && (fi->fib_DiskKey != 0)) {
if (strlen(LockPath)) strins(LockPath,"/");
strins(LockPath,fi->fib_FileName);
}
NewLock = ParentDir(CurLock);
UnLock(CurLock);
CurLock = NewLock;
}
/* Fix up the volume name to include a colon */
for (s = LockPath; *s; s++) if (*s == '/') {*s = ':'; break;}
if (!(*s)) strcat(LockPath,":");
return(LockPath);
}