#include "arcDefn.h"

LocalLockArr    localLockArr;
u_long          progNum;
int             num;
MagicNumber     magicNum;

static struct timeval TIMEOUT = {600, 0};


/** Register PID with the local coordinator **/

int RegisterProgram( int pid) {
    int     i;
    CLIENT* cl;
    char    server[50];
    static struct timeval timeout = {0, 0};

    GetHostNameAndIPadd(NULL, server);
    if ((cl = clnt_create(server, COORDINATOR, USER_INTERACTION, "tcp"))
                == NULL) {
        clnt_pcreateerror(server);
        return CLIENT_CONNECTION_FAIL;
    }
    
    num = pid;
    clnt_call(cl,  REGISTER_PROGRAM, xdr_int, &num,
                xdr_void, NULL, timeout);

    clnt_destroy(cl);
}

int UnRegisterProgram( int pid) {
    int     i;
    CLIENT* cl;
    char    server[50];
    static struct timeval timeout = {0, 0};

    GetHostNameAndIPadd(NULL, server);
    if ((cl = clnt_create(server, COORDINATOR, USER_INTERACTION, "tcp"))
                == NULL) {
        clnt_pcreateerror(server);
        return CLIENT_CONNECTION_FAIL;
    }
    
    num = pid;
    clnt_call(cl,  UNREGISTER_PROGRAM, xdr_int, &num,
                xdr_void, NULL, timeout);
    clnt_destroy(cl);
}

/*** Reserve Locks for the program ****/

LocalLockArr* AcquireLocks( int locksRequired) {
    int     i;
    CLIENT* cl;
    char    server[MAXHOSTNAMELEN];

    GetHostNameAndIPadd(NULL, server);
    if ((cl = clnt_create(server, COORDINATOR, USER_INTERACTION, "tcp"))
                == NULL) {
        clnt_pcreateerror(server);
    }

    num = locksRequired;

		// GET_LOCKS_AVAILABLE is in userInteraction.c
    if (clnt_call(cl,  GET_LOCKS_AVAILABLE, xdr_int, &num,
                xdr_LocalLockArr, &localLockArr, TIMEOUT) != RPC_SUCCESS) {
					/* get_locks_available in userinteraction.c */
        clnt_perror( cl, server);
    }
    clnt_destroy(cl);

    if( localLockArr.LocalLockArr_len == 0) {
		PrintInLogFile("In rpcLib.c : Returning NULL because the length of lock array is ZERO \n");
        return NULL;
    }
		//printf("\nNo of locks acquired = %d \n",
	//		localLockArr.LocalLockArr_len);
    return &localLockArr;
}

  /* Changed CALCULATE_CUR_MAGICNUM to CALCULATE_CUR_MAGICNUM_VER2 by Satish */
MagicNumber* CalculateMagicNum() {
    CLIENT* cl;
    char    server[MAXHOSTNAMELEN];

    GetHostNameAndIPadd(NULL, server);
    if ((cl = clnt_create(server, COORDINATOR, GENERATOR, "tcp"))
                == NULL) {
        clnt_pcreateerror(server);
    }

    if (clnt_call(cl,  CALCULATE_CUR_MAGICNUM_VER2, xdr_void, NULL,
                xdr_MagicNumber, &magicNum, TIMEOUT) != RPC_SUCCESS) {
        clnt_perror( cl, server);
        return (RPC_TIMED_OUT);
    }
    clnt_destroy(cl);
    return &magicNum;
}

