/*  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

static const char mnc_usage[] = 
"mnc [IP] [port]\n\n"
"mini-netcat opens a pipe to 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;

	if (argc<=1 || **(argv+1) == '-' ) {
	    usage( mnc_usage);
	}
	argc--;
	argv++;

        sfd = socket(AF_INET, SOCK_STREAM, 0);

        hostinfo = (struct hostent *) gethostbyname(*argv);

        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)));

        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);
			}
                }
        }
}
