home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
World of A1200
/
World_Of_A1200.iso
/
programs
/
disk
/
misc
/
filecache
/
testcache.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-02-27
|
6KB
|
271 lines
/**********************************/
/* Programme de test de FileCache */
/* Sun Feb 7 16:04:58 1993 */
/**********************************/
#include <exec/types.h>
#include <exec/ports.h>
#include "FileCache.h"
/* some prototypes */
struct MsgPort *FindPort(char *);
struct MsgPort *CreatePort(char *, ULONG);
/* the two ports and the message */
struct FileCacheMsg msg; /* the request message */
struct MsgPort *ReplyPort; /* reply port */
struct MsgPort *FileCachePort; /* request port */
UBYTE FileName[250]; /* Buffer for the filename */
STRPTR Dir[] = /* array of directory */
{
"", /* "" means current dir */
"ram:",
"include:",
NULL
/* NOTE the NULL at the end of the Directory list */
};
/* Errors replied by FileCache corresponding to FC_ERR_xxx in FileCache.h */
STRPTR err_msg[]=
{ "Ok",
"Not enough memory",
"Can't lock file",
"Can't cache a directory",
"Read error on file",
"File bigger than the cache",
"Can't open file",
"FileCache still in use",
"Update error",
"File not in cache",
"Bad command"
};
/* write the Menu */
VOID PrintMenu()
{
puts("\nMenu :");
puts(" 1...Load a file");
puts(" 2...Flush the cache");
puts(" 3...Set the size of the cache");
puts(" 4...Get info on cache");
puts(" 5...Delete a file");
puts(" 6...Quit FileCache");
puts(" 7...Quit and kill FileCache");
}
/* some definitions for the menu */
#define MENU_LOAD '1'
#define MENU_FLUSH '2'
#define MENU_SIZE '3'
#define MENU_INFO '4'
#define MENU_DELETE '5'
#define MENU_QUIT '6'
#define MENU_KILL '7'
#define MENU_FIRST MENU_LOAD
#define MENU_LAST MENU_KILL
/* Get the user choice */
UBYTE GetUserChoice()
{
UBYTE car;
printf(" Your choice : ");
scanf("%c",&car);
return (car);
}
VOID main()
{
/* look out for FileCache server */
FileCachePort = FindPort(FILECACHEPORTNAME);
if (FileCachePort == NULL)
{
/* No FileCache Server */
puts("FileCache is not installed");
puts("Please run FileCache server an try again");
exit(0);
}
/* Server is installed so creates the port for the replies */
ReplyPort = CreatePort(NULL, 0L);
if (ReplyPort == NULL)
{
puts("Can't allocate a reply port");
exit(0);
}
BOOL finish, kill;
/* init the struct fcm_Msg before sending a request */
msg.fcm_Msg.mn_Node.ln_Type = NT_MESSAGE;
msg.fcm_Msg.mn_Length = sizeof(struct FileCacheMsg);
msg.fcm_Msg.mn_ReplyPort = ReplyPort;
/* First you must send a FC_CMD_GETTOKEN request to lock FileCache */
/* so you are sure that nobody will kill it. REMEMBER to UNLOCK it */
/* after use. */
/* Since the first FindPort, the port may have disappear so we must */
/* look for it again before sending the FC_CMD_GETTOKEN command. */
msg.fcm_Command = FC_CMD_GETTOKEN;
Forbid();
if (FileCachePort = FindPort(FILECACHEPORTNAME))
{
/* The Server is still here */
PutMsg(FileCachePort, &msg); /* send request to FileCache Server */
Permit();
}
else
{
/* the Port have disappear so good bye */
Permit();
DeletePort(ReplyPort); /* delete the reply port */
puts("Sorry the FileCache Server is gone away !!!");
exit(0);
}
WaitPort(ReplyPort); /* wait for the reply */
GetMsg(ReplyPort); /* remove the reply from msglist */
/* Now the FileCache Server is locked so we don't need to FindPort it */
/* again */
/* main loop */
finish = kill = FALSE;
while (!finish)
{
UBYTE choice;
PrintMenu();
/* get the user's choice */
do
{
choice = GetUserChoice();
}
while ( (choice < MENU_FIRST) || (choice > MENU_LAST) );
/* reset the flags */
msg.fcm_Flags = 0;
switch (choice)
{
case MENU_LOAD:
printf("Enter filename : ");
scanf("%s",FileName);
msg.fcm_FileName = FileName;
msg.fcm_Directory = Dir;
msg.fcm_Flags = FC_MULTIPLEDIR;
msg.fcm_Command = FC_CMD_LOAD;
break;
case MENU_FLUSH:
msg.fcm_Command = FC_CMD_FLUSH;
break;
case MENU_SIZE:
ULONG size;
printf("Enter size of cache (in Kbytes) : ");
scanf("%ld",&size);
msg.fcm_CacheSize = size * 1024;
msg.fcm_Command = FC_CMD_SETMEM;
break;
case MENU_INFO:
msg.fcm_Command = FC_CMD_INFO;
break;
case MENU_DELETE:
printf("Enter filename : ");
scanf("%s",FileName);
msg.fcm_FileName = FileName;
msg.fcm_Directory = Dir;
msg.fcm_Flags = FC_MULTIPLEDIR;
msg.fcm_Command = FC_CMD_DELETE;
break;
case MENU_QUIT:
finish = TRUE;
msg.fcm_Command = FC_CMD_DELTOKEN; /* unlock FileCache */
break;
case MENU_KILL:
finish = TRUE;
kill = TRUE;
msg.fcm_Command = FC_CMD_DELTOKEN; /* unlock FileCache */
break;
}
/* send a request to FileCache Server */
PutMsg(FileCachePort, &msg);
/* Wait for the reply and remove it from msglist */
WaitPort(ReplyPort);
GetMsg(ReplyPort);
if (choice == MENU_INFO)
{
printf("\nCache size is %ld bytes\n", msg.fcm_CacheSize);
printf(" - %ld Bytes used for cache\n", msg.fcm_MemoryUsed);
printf(" - %ld Files in cache\n", msg.fcm_NbFiles);
printf(" - %ld Locks on FileCache\n",msg.fcm_NbLocks);
}
/* print info for the file loaded */
if ((choice == MENU_LOAD) && (msg.fcm_Error == FC_ERR_OK))
{
printf("File ");
/* if you use multiple dirs you'll find the correct dir with fcm_DirIndex */
if (msg.fcm_Flags & FC_MULTIPLEDIR)
printf("%s", msg.fcm_Directory[msg.fcm_DirIndex]);
printf("%s loaded successfully\n", msg.fcm_FileName);
printf("at address 0x%lx with size of %ld bytes.\n", msg.fcm_FileBuffer, msg.fcm_FileLength);
}
/* print the error replied */
printf("%s\n",err_msg[msg.fcm_Error]);
}
if (kill)
{
/* the FC_CMD_QUIT request must be send after you have unlocked */
/* FileCache else you will have a FC_ERR_INUSE error. */
/* The FC_CMD_QUIT request will be effective if no other tasks */
/* have locked FileCache */
msg.fcm_Command = FC_CMD_QUIT;
msg.fcm_Flags = 0;
/* After unlocking FileCache; it can be killed by anybody so you must */
/* be sure that the port still exist before sending the request */
Forbid();
if (FileCachePort = FindPort(FILECACHEPORTNAME))
{
PutMsg(FileCachePort, &msg);
Permit();
WaitPort(ReplyPort);
GetMsg(ReplyPort);
printf("%s\n",err_msg[msg.fcm_Error]);
}
else
Permit();
}
/* delete the reply port */
DeletePort(ReplyPort);
}