/*  mnc: mini-netcat - built from the ground up for LRP
    Copyright (C) 1998  Charles P. Wright

    0.0.1   6K      It works.
    0.0.2   5K      Smaller and you can also check the exit condition if you wish.
    0.0.3	    Uses select()	

    19980918 Busy Boxed! Dave Cinege
    19990512 Uses Select. Charles P. Wright
    19990513 Fixes stdin stupidity and uses buffers.  Charles P. Wright

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

*/
#include "internal.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/time.h>
#include <sys/ioctl.h>

#define BUFSIZE 100

const char mnc_usage[] = 
"mini-netcat 0.0.3 -- Open pipe to IP:port\n"
"\tmnc [IP] [port]\n";

int
mnc_main(int argc, char **argv)
{
        int sfd;
        int result;
        int len;
        char ch[BUFSIZE];
        
        struct sockaddr_in address;
        struct hostent *hostinfo;

        fd_set readfds, testfds;

        sfd = socket(AF_INET, SOCK_STREAM, 0);

        hostinfo = (struct hostent *) gethostbyname(argv[1]);

        if (!hostinfo)
        {
                exit(1);
        }

        address.sin_family = AF_INET;
        address.sin_addr = *(struct in_addr *) *hostinfo->h_addr_list;
        address.sin_port = htons(atoi(argv[2]));

        len = sizeof(address);

        result = connect(sfd, (struct sockaddr *)&address, len);

        if (result < 0) 
        {
                exit(2);
        }

        FD_ZERO(&readfds);
        FD_SET(sfd, &readfds);
        FD_SET(fileno(stdin), &readfds);

        while(1)
        {
                int fd;
		int ofd;
                int nread;

                testfds = readfds;

                result = select(FD_SETSIZE, &testfds, (fd_set *) NULL, (fd_set *) NULL, (struct timeval *) 0);

                if(result < 1) 
                {
                        exit(3);
                }

                for(fd = 0; fd < FD_SETSIZE; fd++)
                {
                        if(FD_ISSET(fd,&testfds))
                        {
				int trn = 0;
				int rn;

                                ioctl(fd, FIONREAD, &nread);

                                if(fd == sfd)
                                {
                                	if (nread == 0)
                                        	exit(0);
					ofd = fileno(stdout);
				}
				else
				{
					ofd = sfd;
				}



				do
				{
					rn = (BUFSIZE < nread - trn) ? BUFSIZE : nread - trn;
					trn += rn;
                                       	read(fd, ch, rn);
                                      	write(ofd, ch, rn);
				}
				while (trn < nread);
			}
                }
        }
}
