#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <rpc/rpc.h>
#include <signal.h>
#include "sortHomework4.h"

static int_array sort_data;
static int rc;
u_long returnprog = 0;
int_array data;
char hostname[256];
int docallback();
FILE *log;

void *
sortnum_1(cb_msg msg)
{
  int i;
  int ans;

  log = fopen("logfile", "a+");

  fprintf(log, "Request received\n");
  fflush(log);

  returnprog = msg.returnprog;
  data = msg.data;
  data.int_array_val = (int *)malloc(data.int_array_len*sizeof(int));
  memcpy(data.int_array_val, msg.data.int_array_val, data.int_array_len*sizeof(int));
  strcpy(hostname, msg.hostname);

  /* cleanup last run */
  if (sort_data.int_array_val != 0) {
    free(sort_data.int_array_val);
  }

  signal(SIGALRM, docallback);
  alarm(1);

  return &rc;
}

docallback()
{
  int i, j, tmp, ans;

  if (returnprog == 0) {
    alarm(1);
    return 0;
  }
  else {
    fprintf(log, "Processing\n");
    fflush(log);
    sort_data.int_array_len = data.int_array_len;
    sort_data.int_array_val = (int *)malloc(sort_data.int_array_len*sizeof(int));
    
    fprintf(log, "Received data:\n");
    for (i=0;i<data.int_array_len;i++) {
      fprintf(log, "%d: %d\n", i, data.int_array_val[i]);
    }
    fprintf(log, "\n");

    memcpy(sort_data.int_array_val, data.int_array_val, data.int_array_len*sizeof(int));
    for (i=0; i<sort_data.int_array_len; i++) {
      for (j=i+1; j<sort_data.int_array_len; j++) {
	if (sort_data.int_array_val[i] > sort_data.int_array_val[j]) {
	  tmp = sort_data.int_array_val[j];
	  sort_data.int_array_val[j] = sort_data.int_array_val[i];
	  sort_data.int_array_val[i] = tmp;
	}
      }
    }

    fprintf(log, "Sorted data:\n");
    for (i=0;i<sort_data.int_array_len;i++) {
      fprintf(log, "%d: %d\n", i, sort_data.int_array_val[i]);
    }
    fprintf(log, "\n");
    
    fprintf(log, "Callback to program %ld on host %s\n", returnprog, hostname);
    fflush(log);
    ans = callrpc(hostname, returnprog, 1, 1, xdr_int_array, &sort_data,
		  xdr_void, 0);
    if (ans != 0) {
      fprintf(stderr, "server: ");
      clnt_perrno(ans);
      fprintf(stderr, "\n");
    }

    returnprog = 0; 
  }

  free(data.int_array_val);
  
  fprintf(log, "Request handled\n");
  fflush(log);

  fclose(log);
  return 0;
}

