/* newconc.c */
/* $Id: newconc.c,v 1.5 1993/08/22 04:54:13 nils Exp $ */
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include "db.h"
#include "net.h"
#include "externs.h"
static long spot=0; /* noone's gunna be on for 68 years, so
* we can have this wrap around unless
* people log on more often than 1/second.
*/
long make_concid ()
{
spot++;
if(spot<0) spot=1;
return spot;
}
struct conc_list {
char *ip;
char *pass;
char used;
} concs[]={
{"128.103.50.55", "pass", 0},
{"18.43.0.102", "pass", 0},
{"127.0.0.1", "pass", 0},
};
int numconcs=sizeof(concs)/sizeof(struct conc_list);
int can_be_a_conc(addr, pass)
struct sockaddr_in *addr;
char *pass;
{
int k;
/* HPUX-MOD */
/* extern long inet_addr(); */
extern u_long inet_addr();
/* */
for(k=0;k<numconcs;k++)
if(!strcmp(pass,concs[k].pass))
if(addr->sin_addr.s_addr == inet_addr(concs[k].ip))
return 1;
return 0;
}
void do_makeid(d)
struct descriptor_data *d;
{
if(!(d->cstatus&C_CCONTROL)) {
queue_string(d,"but.. but.. you're not a concentrator!\r\n");
return;
}
queue_string(d,tprintf("//Here's a new concentrator ID: %d\n",
make_concid()));
}
void do_becomeconc(d,pass)
struct descriptor_data *d;
char *pass;
{
if(d->cstatus & C_CCONTROL) {
queue_string(d,"but.. but.. you're already a concentrator!\r\n");
return;
}
if(can_be_a_conc(&d->address,pass)) {
d->cstatus |= C_CCONTROL;
queue_string(d,"//Welcome to the realm of concentrators.\r\n");
} else
queue_string(d,"but.. but.. i can't let you in with that passwd and/or host.\r\n");
}
void do_connectid(d,concid,addr)
struct descriptor_data *d;
long concid;
char *addr;
{
struct descriptor_data *k;
puts("here1");
for(k=descriptor_list;k;k=k->next)
if(k->concid==concid) {
queue_string(d,"//Sorry, there's already someone with that concid.\r\n");
return;
}
k=malloc(sizeof(struct descriptor_data));
k->descriptor=d->descriptor;
k->concid=concid;
k->cstatus = C_REMOTE;
k->parent = d;
k->state = WAITCONNECT;
k->output_prefix = 0;
k->output_suffix = 0;
k->output_size=0;
k->output.head=0;
k->output.tail= &k->output.head;
k->input.head=0;
k->input.tail= &k->input.head;
k->raw_input = 0;
k->raw_input_at = 0;
k->quota = COMMAND_BURST_SIZE;
k->last_time =0;
strcpy(k->addr,addr);
k->address = d->address;
if (descriptor_list)
descriptor_list->prev = &k->next;
k->next = descriptor_list;
k->prev = &descriptor_list;
k->edit_buff = NULL;
descriptor_list = k;
puts("3moo");
welcome_user (k);
puts("4goo");
}
void do_killid(d,id)
struct descriptor_data *d;
long id;
{
struct descriptor_data *k;
if(id==d->concid) {
queue_string(d,"what in the world are you trying to do?\r\n");
return;
}
for(k=descriptor_list;k;k=k->next)
if(k->concid == id)
if(k->descriptor != d->descriptor) {
queue_string(d,"don't do that. that's someone else's.\r\n");
return;
} else {
shutdownsock(k);
return;
}
}