NODE e968db97How far is to far?
mark@coombs.anu.edu.au (Mark)Thu, 19 Nov 92 05:43:04 PST
Maybe it's not in the spirit of this mailing group but what of the question
of purposeful abuse of the anon mailers/newsposters? Say for instance some
person posts either a sh*tload of garbage to every known group, flooding
the USENET or a more personal attack whereby they send out anonymously
information that was so fundamentally personal to someone they could
possibly react very badly....
What if someone posted some top secret information and the various three
letter acronyms all went out for someone's blood.
As a few people have mentioned they would *like* the opportunity to use
an anon system but the initial step of creating and running it isnt so
appealing due to the fundamental dangers of it.
Most people would respect such systems but you find one really rotten or
immature loser that will use it for there own anti-social ends.
Comments?
Mark
mark@coombs.anu.edu.au
mark@gnu.ai.mit.edu
markm@rmit.edu.au
NODE dbd33466Re: How far is to far?
avalon@coombs.anu.edu.au (Darren Reed)Thu, 19 Nov 92 19:35:05 PST
I've fixed the IP bouncer so it doesnt chew so much cpu any more,
backgrounds itself and detachs from the tty. In testing last night,
it was using less %cpu than the telnet being used to connect to it on
the same machine (hope that bodes well! :).
Darren
-----------------------------------------------------------------------------
/* This file is telserv.c and is part of the Telnet Server package v. 1.0,
written by "Hal-9000". Much of this package was developed by Richard
Stephens and my thanks go to "Xanadude" for providing me with that
section. Performance fix by Darren Reed.
To compile, type "cc -O -s telserv.c -o telserv". */
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <errno.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#define SERV_TCP_PORT 12345 /* port I'll listen for connections on */
#define REM_HOST_ADDR "127.0.0.1" /* host I will bounce to */
#define REM_TCP_PORT 19 /* port I will bounce to */
char sbuf[2048], cbuf[2048];
main()
{
int sockfd, newsockfd, clilen, childpid, opt = 1;
struct sockaddr_in cli_addr, serv_addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(SERV_TCP_PORT);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) == -1) {
perror("bind");
exit(-1);
}
listen(sockfd, 5);
setpgrp(getpid(), 0);
close(0); close(1); close(2);
#ifdef TIOCNOTTY
if ((newsockfd = open("/dev/tty", O_RDWR)) >= 0) {
ioctl(newsockfd, TIOCNOTTY, (char *)0);
close(newsockfd);
}
#endif
if (fork())
exit(0);
while (1) {
clilen = sizeof(cli_addr);
newsockfd=accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd == -1)
exit(-1);
setsockopt(newsockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
/*
** NB: FNDELAY and O_NDELAY aren't the same on all machines and on most
** we want FNDELAY. The differences are subtle but differences all the
** same.
*/
#ifdef FNDELAY
fcntl(newsockfd,F_SETFL,fcntl(newsockfd,F_GETFL,0)|FNDELAY);
#else
fcntl(newsockfd,F_SETFL,O_NDELAY);
#endif
childpid = fork();
if (childpid == 0) { /* child process */
close(sockfd); /* close original socket */
telcli(newsockfd); /* process the request */
exit(0);
}
close(newsockfd); /* parent process */
wait(0);
}
}
telcli(clisockfd)
{
int servsockfd;
struct sockaddr_in serv_addr;
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(REM_HOST_ADDR);
serv_addr.sin_port = htons(REM_TCP_PORT);
servsockfd = socket(AF_INET, SOCK_STREAM, 0);
connect(servsockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
#ifdef FNDELAY
fcntl(servsockfd,F_SETFL,fcntl(clisockfd,F_GETFL,0)|FNDELAY);
#else
fcntl(servsockfd,F_SETFL,O_NDELAY);
#endif
communicate(servsockfd,clisockfd);
close(servsockfd);
exit(0);
}
communicate(sfd,cfd) {
char *chead, *ctail, *shead, *stail;
int num, nfd, spos, cpos;
extern int errno;
fd_set rd, wr;
chead = ctail = cbuf;
cpos = 0;
shead = stail = sbuf;
spos = 0;
while (1) {
FD_ZERO(&rd);
FD_ZERO(&wr);
if (spos < sizeof(sbuf)-1)
FD_SET(sfd, &rd);
if (ctail > chead)
FD_SET(sfd, &wr);
if (cpos < sizeof(cbuf)-1)
FD_SET(cfd, &rd);
if (stail > shead)
FD_SET(cfd, &wr);
nfd = select(256, &rd, &wr, 0, 0);
if (nfd <= 0)
continue;
if (FD_ISSET(sfd, &rd)) {
num=read(sfd,stail,sizeof(sbuf)-spos);
if ((num==-1) && (errno != EWOULDBLOCK)) return;
if (num==0) return;
if (num>0) {
spos += num;
stail += num;
if (!--nfd)
continue;
}
}
if (FD_ISSET(cfd, &rd)) {
num=read(cfd,ctail,sizeof(cbuf)-cpos);
if ((num==-1) && (errno != EWOULDBLOCK)) return;
if (num==0) return;
if (num>0) {
cpos += num;
ctail += num;
if (!--nfd)
continue;
}
}
if (FD_ISSET(sfd, &wr)) {
num=write(sfd,chead,ctail-chead);
if ((num==-1) && (errno != EWOULDBLOCK)) return;
if (num>0) {
chead += num;
if (chead == ctail) {
chead = ctail = cbuf;
cpos = 0;
}
if (!--nfd)
continue;
}
}
if (FD_ISSET(cfd, &wr)) {
num=write(cfd,shead,stail-shead);
if ((num==-1) && (errno != EWOULDBLOCK)) return;
if (num>0) {
shead += num;
if (shead == stail) {
shead = stail = sbuf;
spos = 0;
}
if (!--nfd)
continue;
}
}
}
}