/* * Duplicate an interface * Used when creating IN/OUT pair for bidirectional communication * Args: pointer to interface to be duplicated * Returns: Pointer to duplicate interface */ iface_t *ifdup (iface_t *ifa) { iface_t *newif; if ((newif=(iface_t *) malloc(sizeof(iface_t))) == (iface_t *) NULL) return(NULL); if (iftypes[ifa->type].ifdup_func) { if ((newif->info=(*iftypes[ifa->type].ifdup_func)(ifa->info)) == NULL) { free(newif); return(NULL); } } else newif->info = NULL; ifa->pair=newif; newif->tid=ifa->tid; newif->flags=ifa->flags; newif->id=ifa->id; newif->name=ifa->name; newif->pair=ifa; newif->next=NULL; newif->type=ifa->type; newif->lists=ifa->lists; newif->read=ifa->read; newif->readbuf=ifa->readbuf; newif->write=ifa->write; newif->cleanup=ifa->cleanup; newif->options=NULL; newif->ifilter=addfilter(ifa->ifilter); newif->ofilter=addfilter(ifa->ofilter); newif->checksum=ifa->checksum; newif->strict=ifa->strict; return(newif); }
iface_t *new_tcp_conn(int fd, iface_t *ifa) { iface_t *newifa; struct if_tcp *oift=(struct if_tcp *) ifa->info; struct if_tcp *newift=NULL; pthread_t tid; if ((newifa = malloc(sizeof(iface_t))) == NULL) return(NULL); memset(newifa,0,sizeof(iface_t)); if (((newift = malloc(sizeof(struct if_tcp))) == NULL) || ((ifa->direction != IN) && ((newifa->q=init_q(oift->qsize)) == NULL))){ if (newifa && newifa->q) free(newifa->q); if (newift) free(newift); free(newifa); return(NULL); } newift->fd=fd; newift->qsize=oift->qsize; newifa->id=ifa->id+(fd&IDMINORMASK); newifa->direction=ifa->direction; newifa->type=TCP; newifa->name=NULL; newifa->info=newift; newifa->cleanup=cleanup_tcp; newifa->write=write_tcp; newifa->read=read_tcp; newifa->lists=ifa->lists; newifa->ifilter=addfilter(ifa->ifilter); newifa->ofilter=addfilter(ifa->ofilter); newifa->checksum=ifa->checksum; if (ifa->direction == IN) newifa->q=ifa->lists->engine->q; else if (ifa->direction == BOTH) { if ((newifa->next=ifdup(newifa)) == NULL) { logwarn("Interface duplication failed"); free(newifa->q); free(newift); free(newifa); return(NULL); } newifa->direction=OUT; newifa->pair->direction=IN; newifa->pair->q=ifa->lists->engine->q; link_to_initialized(newifa->pair); pthread_create(&tid,NULL,(void *)start_interface,(void *) newifa->pair); } link_to_initialized(newifa); pthread_create(&tid,NULL,(void *)start_interface,(void *) newifa); return(newifa); }
int main (int dont_care_argc, char *argv[]){ addfilter("distrilua"); addfilter("gateserverd"); addfilter("groupserverd"); addfilter("ssdb-server"); for (;;) { system("clear"); printf("%s\n",top()); sleep(1); } return 0; }