summaryrefslogtreecommitdiff
path: root/mnc.c
diff options
context:
space:
mode:
Diffstat (limited to 'mnc.c')
-rw-r--r--mnc.c79
1 files changed, 32 insertions, 47 deletions
diff --git a/mnc.c b/mnc.c
index 9d59977..124ea03 100644
--- a/mnc.c
+++ b/mnc.c
@@ -3,9 +3,11 @@
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
@@ -35,26 +37,24 @@
#include <sys/time.h>
#include <sys/ioctl.h>
+#define BUFSIZE 100
+
const char mnc_usage[] =
-"mini-netcat 0.0.1 -- Open pipe to IP:port\n"
+"mini-netcat 0.0.3 -- Open pipe to IP:port\n"
"\tmnc [IP] [port]\n";
int
-mnc_main(struct FileInfo * i, int argc, char **argv)
+mnc_main(int argc, char **argv)
{
-
int sfd;
int result;
int len;
- int pid;
- char ch;
+ char ch[BUFSIZE];
struct sockaddr_in address;
struct hostent *hostinfo;
-#ifdef SELECT
fd_set readfds, testfds;
-#endif
sfd = socket(AF_INET, SOCK_STREAM, 0);
@@ -78,7 +78,6 @@ mnc_main(struct FileInfo * i, int argc, char **argv)
exit(2);
}
-#ifdef SELECT
FD_ZERO(&readfds);
FD_SET(sfd, &readfds);
FD_SET(fileno(stdin), &readfds);
@@ -86,6 +85,7 @@ mnc_main(struct FileInfo * i, int argc, char **argv)
while(1)
{
int fd;
+ int ofd;
int nread;
testfds = readfds;
@@ -101,48 +101,33 @@ mnc_main(struct FileInfo * i, int argc, char **argv)
{
if(FD_ISSET(fd,&testfds))
{
- ioctl(fd, FIONREAD, &nread);
+ int trn = 0;
+ int rn;
- if (nread == 0)
- exit(0);
+ ioctl(fd, FIONREAD, &nread);
if(fd == sfd)
{
- read(sfd, &ch, 1);
- write(fileno(stdout), &ch, 1);
- }
- else
- {
- read(fileno(stdin), &ch, 1);
- write(sfd, &ch, 1);
- }
- }
+ 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);
+ }
}
}
-#else
- pid = fork();
-
- if (!pid)
- {
- int retval;
- retval = 1;
- while(retval == 1)
- {
- retval = read(fileno(stdin), &ch, 1);
- write(sfd, &ch, 1);
- }
- }
- else
- {
- int retval;
- retval = 1;
- while(retval == 1)
- {
- retval = read(sfd, &ch, 1);
- write(fileno(stdout), &ch, 1);
- }
- }
-
- exit(0);
-#endif
}