#include <sys/param.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <rpc/rpc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/ipc.h>
#include <sys/msg.h>

#include "extnDefn.h"
#include "LockList.h"
#include "LockReqList.h"
#include "../commonIncludes/msgq.h"

//#define PRINT

IntArr              pidArr;
extern int          clntFlag ;

LockArr             tmpLockArr;  
LocalLockArr        *locksAvailable = NULL;  
LockRequest         lockRequest;
extern LockRequest  lockPerm;
extern LockList*    localLockList;
//LockReqList*        requestedList = NULL;
String              localStr;
extern int          msgQueueId;  
extern long         GetProgNum();
extern void         ExecuteFile();
extern MagicNumber* Calculate_cur_magicnum();

static struct timeval TIMEOUT = { 50, 0 };
int     retVal;
u_long  progNum;
u_long*  progNum1;

int PostFile( String filename, CLIENT* cl);
LockArr* GetLockInf();

LockArr* GetLockInf() {
    LockArr*        lockList;
    LockList*       current;
    Lock            *lock;
    int 	        i;
    int 	        j;
    int		        len = 0;
    float	        hpf = 10.9;
    MagicNumber     *num = NULL;
	void            *junk;

    lockList = (LockArr *) malloc( sizeof( LockArr));
    lockList->LockArr_len =  LockListLength(localLockList);
    
    if(lockList->LockArr_len == 0) {
	    return NULL;
    }   

    lockList->LockArr_val = (Lock*) calloc(lockList->LockArr_len,
                                            sizeof(Lock));
    num = calculate_cur_magicnum();

    current = localLockList;
    lock = (Lock *) malloc( sizeof(Lock));
    
    for ( i = 0; i < lockList->LockArr_len; i++) {

        if ((current->Data).Status == FREE ) {
            lock->NodeId = globMyId;
            lock->LockId = (current->Data).LockId;
            CopyMagicNum(&(lock->MagicNum), num);
            CopyLock( &(lockList->LockArr_val[len]), lock);
            len++;
        }
        current = current->Next;
    }
    
    lockList->LockArr_len = len;

    if (len == 0) {
        return NULL;
    }
	return lockList;
}

