/*** TCP Server ***/

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include 

#define	DATAFILE	"/Users/j05043/jikken/nagata/tcpip/data.txt"
#define	DELIMITS	" \t\n\r"

char	datavalue[256];

int	GetLineFromPeer(char *line, int hostsoc)
{
int	i;

for(i = 0 ; ; )
	{
	if(1 != read(hostsoc,line + i,1))
	  continue;
	else
		{
		i++;
		*(line + i) = (char)0;
		}

	if(((char)('\n')) == (*(line + i - 1)))
		return i;
	}
}

char	*GetKeywordData(char *key)
{
  FILE	*fp;
char	buff[256];

if((FILE *)NULL == (fp = fopen(DATAFILE,"r")))
	return (char *)NULL;

for(;;)
	{
	char	*p;
	char	*pp;

	fgets(buff,256,fp);

	if(feof(fp))
		break;

	if(ferror(fp))
		break;

	if((char *)NULL == (p = strtok(buff,DELIMITS)))
		continue;

	if((char *)NULL == (pp = strtok((char *)NULL,DELIMITS)))
		continue;

	if(0 == strcmp(p,key))
	  {
		fclose(fp);
		strcpy(datavalue,pp);
		return datavalue;
	  }
	}

fclose(fp);
return (char *)NULL;
}

int	main()
{

  unsigned short port = 5683;
  int servsoc; 
  int hostsoc;
  
  struct sockaddr_in srcAddr;
  struct sockaddr_in dstAddr;
  int dstAddrSize = sizeof(dstAddr);
  
  memset(&srcAddr, 0, sizeof(srcAddr));
  srcAddr.sin_port = htons(port);
  srcAddr.sin_family = AF_INET;
  srcAddr.sin_addr.s_addr = htonl(INADDR_ANY);

  servsoc = socket(AF_INET, SOCK_STREAM, 0);
   
  bind(servsoc, (struct sockaddr *) &srcAddr, sizeof(srcAddr));

  listen(servsoc, 1);
  
  printf("now waiting for client connect\n");
  
  hostsoc = accept(servsoc, (struct sockaddr *)&dstAddr, &dstAddrSize);
  printf("Connected from %s\n", inet_ntoa(dstAddr.sin_addr));

char	RecvBuff[256];

for(;;)
	{
	char	*p;
	char	SendBuff[256];
	char	*pp;

	(void)GetLineFromPeer(RecvBuff, hostsoc);	/* Get 1 line from peer */
	

	if(((char)('=')) == *(RecvBuff))	/* If End Mark */
		{
		close(0);
		exit(0);
		}

	if((char *)NULL != (p = strchr(RecvBuff,'=')))
		{
		*p = (char)0;

		if((char *)NULL == (pp = GetKeywordData(RecvBuff)))
			sprintf(SendBuff,"%s=\n",RecvBuff);
		else
			sprintf(SendBuff,"%s=%s\n",RecvBuff,pp);

		(void)write(hostsoc,SendBuff,strlen(SendBuff));
		}
	}
}