/* White Board Administration program */
/* by a past student of CEG 730 */

#include <stdlib.h>
#include <stdio.h>
#include <rpc/rpc.h>
#include "server.h"

int doQueryServer(CLIENT* clnt)
{
  int dummy = 1;
  BoardNode ** result = 0, * board;
  ClientDataNode * cnode;

  result = query_1(&dummy, clnt);
  if (*result == 0)
    printf("Server has no boards.\n");
  else {
    for (board = *result; board; board = board->next) {
      if (board->clients && board->clients->clientdata)
	printf("Board %s clients:\n", board->clients->clientdata->boardnm);
      for (cnode = board->clients; cnode; cnode = cnode->next)
	printf("Client at %s  %s  nprogram %x\n",
	       cnode->clientdata->machinenm,
	       cnode->clientdata->xdisplaynm,
	       cnode->clientdata->nprogram);
    }
  }
  return 0;
}

void usage()
{
  fprintf (stderr,
	   "Usage:\n"
	   "wbadmin <srv-mchn-nm> <hex-prognum> -q\n"
	   "wbadmin <srv-mchn-nm> <hex-prognum> -n <srv-mchn-nm>\n"
	   "wbadmin <srv-mchn-nm> <hex-prognum> -t <wb-nm>"
	   "<srv-mchn-nm> <prognum>\n");
}

int main(int argc, char *argv[])
{
  CLIENT* clnt = 0;
  XferWhiteBoardArg xa;
  int prognum,   prognum2, result = -1;
  char *cmd,  *host, *host2, *wbname;
	
  if (argc < 4) {
    usage();
    goto done;
  }
  host = argv[1];		/* server machine name */
  prognum = strtol(argv[2], NULL, 16);
  cmd = argv[3];		/* -q, -n or -t */
  if (cmd[0] != '-')
    goto done;

  clnt = clnt_create
    (host, prognum, WhiteBoardServerVersion, "tcp");
  if (clnt == 0)
    goto done;

  switch (cmd[1]) {
  case 'q':
    result = doQueryServer(clnt);
    break;
  case 'n':
    if (argc < 5)
      goto done;
    host2 = argv[4];		/* get the destination host */
    result = newserver_1(&host2, clnt);
    break;
  case 't':
    if (argc < 6)
      goto done;
    strcpy(xa.boardnm,argv[4]);	/* get the whiteboard name */
    strcpy(xa.serverdata.machinenm, argv[5]); /* destination machine name */
    xa.serverdata.nprogram = strtol(argv[6], NULL, 16);
    xa.serverdata.nversion = WhiteBoardServerVersion;
    result = xferwhiteboard_1(&xa, clnt);
    break;
  default:
    break;
  }

done:
  if (clnt)
    clnt_destroy(clnt);
  return result;
}
