/*
	AddAssign V1.04e
	
	(c) 1991 Alexander Rawass

	Alexander Rawass
	Wilhelminenstr. 44
	6700 Ludwigshafen 15
	Germany
	0621/57 75 98
*/

#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <pragmas.h>
#include <libraries/arp.h>

#define	AR_USE_ARP
#include "ar_defs.h"
#include "ar_funcs.c"

#include "addassign.h"

struct	ArpBase		*ArpBase;
struct	DosLibrary	*DosBase;
struct	FileLock	*block;	
char	path[256];
struct	FileLock	*asslock;

struct	commandmessage	sendmsg;
struct	commandmessage	*waitmsg;
struct	MsgPort		*waitport,*sendport;
struct	MoreAssign	*manode;
struct	List		*malist;

STRPTR	CLI_Help="\x1b[1mAddAssign V1.04e\x1b[0m - (c) 1991 Alexander Rawass\nUsage : AddAssign [<device> <directory>] | [LIST]\n";

VOID	closeall()
{
/*	if(asslock)	UNLOCKC(asslock);	*/
	if(block)	UNLOCKC(block);
	if(DosBase)	CLOSELIBRARYC(DosBase);
	exit(NULL);
}

VOID	openall()
{
	DosBase=OpenLibrary(DOSNAME,0);
}

BOOL	checkassign(assign)
STRPTR	assign;
{
	struct	MsgPort		*mport;
	struct	RootNode	*rootnode;
	struct	DosInfo		*dosinfo;
	struct	DosList		*doslist;
	struct	FileLock	*lock;
	STRPTR	dosname;
	ULONG	dostype;

	rootnode=DosBase->dl_Root;
	dosinfo=BADDR(rootnode->rn_Info);

	doslist=BADDR(dosinfo->di_DevInfo);
	assign[strlen(assign)-1]=EOS;
	do{
		dosname=BSTRS(doslist->dol_Name);
		dostype=doslist->dol_Type;

		if(STREQU(dosname,assign)){
			assign[strlen(assign)]=':';
			return(TRUE);
		}

		doslist=BADDR(doslist->dol_Next);
	}
	while(doslist!=NULL);

	assign[strlen(assign)]=':';
	return(FALSE);
}

VOID	main(argc,argv)
int	argc;
STRPTR	argv[];
{

	openall();
	
	if(argc<2 || *argv[1]=='?'){
		printf("\x1b[1mAddAssign V1.04e\x1b[0m - (c) 1991 Alexander Rawass\n");
		printf("Usage : %s [<device> <directory>] | [LIST]\n",argv[0]);
		exit(NULL);
	}

	if(!(waitport=FindPort(waitportname))){
		printf("ERROR : AddAssign V1.04e not installed\n");
		exit(NULL);
	}
	
	sendport=CreatePort(sendportname,0);
	sendmsg.cmsg_message.mn_Node.ln_Type=NT_MESSAGE;
	sendmsg.cmsg_message.mn_ReplyPort=sendport;
	sendmsg.cmsg_message.mn_Length=sizeof(struct commandmessage);

	StrUpper(argv[1]);
	
	if(STREQU(argv[1],"LIST")){
		sendmsg.cmsg_command="list";
		PutMsg(waitport,&sendmsg);
		waitmsg=WaitPort(sendport);
		waitmsg=GetMsg(sendport);
		malist=(struct	List *)sendmsg.cmsg_assign;
		
		manode=malist->lh_Head;
		
		if(manode==(struct MoreAssign *)&malist->lh_Tail){
			printf("no entries found in internal assign list\n");
		}
		else{
			while((manode!=(struct MoreAssign *)&malist->lh_Tail)){
				printf("     %-10s assigned to %s\n",manode->ma_assignname,manode->ma_pathname);
				manode=manode->ma_node.ln_Succ;
			}
		}
		
	}
	else{
		if(!(checkassign(argv[1]))){
			printf("ERROR : %s is not assigned - use standard assign\n",argv[1]);
			closeall();
		}
		
		if(!(block=Lock(argv[2],SHARED_LOCK))){
			printf("ERROR : directory %s does not exist\n",argv[2]);
			closeall();
		}
		if(!(asslock=Lock(argv[1],SHARED_LOCK))){
			printf("ERROR : device %s does not exist\n",argv[1]);
			closeall();
		}
		if(!(PathName(block,path,256))){
			printf("ERROR : internal pathname error - pathname too long\n");
			closeall();
		}
		printf("assigning %s to %s\n",argv[1],path);
		sendmsg.cmsg_command="addassign";
		sendmsg.cmsg_assign=argv[1];
		sendmsg.cmsg_path=path;
		sendmsg.cmsg_lock=asslock;
		PutMsg(waitport,&sendmsg);
		waitmsg=WaitPort(sendport);
		waitmsg=GetMsg(sendport);
	}
	
	
	DeletePort(sendport);
	closeall();
}
