/* A simple program to get the current list from a track server. */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/types.h>

#include <clib/exec_protos.h>
#include <netdb.h>

#include <proto/socket.h>
#include <sys/errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <pragmas/socket_pragmas.h>

#define UNLESS(x) if(!(x))
#define SERVER_TCP_PORT  18945	/* Must be same as SERVER_TCP_PORT in AmiTrack.c! */

struct Library * SocketBase = NULL;
LONG sSocket = -1L;

void Cleanup(void)
{
	if (sSocket != -1L) CloseSocket(sSocket);
	if (SocketBase) CloseLibrary(SocketBase);
}

int main(int argc, char **argv)
{	
	char sBuffer[500];
	struct hostent * hp;
	struct sockaddr_in saTCPAddress;
	BOOL BPrintingComment = FALSE;
	int nCol = 0, nBytesRead, i;
	
	atexit(Cleanup);

	UNLESS(SocketBase = OpenLibrary("bsdsocket.library",2L))
	{
		printf("AmiTCP isn't running!\n");
		exit(5);
	}
	if (argc != 2)
	{
		printf("Usage:  getlist <hostname>\n");
		exit(5);
	}
		
	UNLESS(hp = gethostbyname(argv[1]))
	{
		printf("Couldn't find host server [%s]\n",argv[1]);
		exit(5);
	}

	bzero(&saTCPAddress, sizeof(saTCPAddress));
    	bcopy(hp->h_addr, (char *)&saTCPAddress.sin_addr, hp->h_length);    	
	saTCPAddress.sin_family = hp->h_addrtype;
	saTCPAddress.sin_port   = htons(SERVER_TCP_PORT);		

	if ((sSocket = socket(hp->h_addrtype,SOCK_STREAM,0)) < 0)
	{
		printf("Couldn't create TCP socket!\n");
		exit(5);
	}	
	if (connect(sSocket, (struct sockaddr *) &saTCPAddress, sizeof(struct sockaddr_in)) < 0)
	{
		printf("Connection to server [%s] failed.  (Server down?)\n",argv[1]);
		exit(5);
	}
	
	printf("[%s]\n",argv[1]);
	printf("HostName                  | Comment\n");
	printf("--------------------------+--------------------------------------\n");
	/* Now just read & spit */
	while((nBytesRead = recv(sSocket, sBuffer,sizeof(sBuffer), 0L)) > 0)
	{
		for (i = 0; i<nBytesRead; i++)
		{
			char cChar = sBuffer[i];
			
			if (cChar == '\0') 
			{
				if (BPrintingComment)
				{
					putchar('\n');
					BPrintingComment = FALSE;
					nCol = 0;
				}
				else 
				{
					while(nCol < 26) {putchar(' '); nCol++;}
					putchar('|'); putchar(' ');
					BPrintingComment = TRUE;
				}
			}
			else {putchar(cChar); nCol++;}
		}
	}
}