Example #1
0
void masterconn_term(void) {
    masterconn *eptr = masterconnsingleton;
    in_packetstruct *ipptr,*ipaptr;
    out_packetstruct *opptr,*opaptr;

    if (eptr->mode!=FREE) {
        tcpclose(eptr->sock);
        if (eptr->mode!=CONNECTING) {
            if (eptr->input_packet) {
                free(eptr->input_packet);
            }
            ipptr = eptr->inputhead;
            while (ipptr) {
                ipaptr = ipptr;
                ipptr = ipptr->next;
                free(ipaptr);
            }
            opptr = eptr->outputhead;
            while (opptr) {
                opaptr = opptr;
                opptr = opptr->next;
                free(opaptr);
            }
        }
    }

    masterconn_read(NULL,0.0); // free internal read buffer

    free(eptr);

    free(MasterHost);
    free(MasterPort);
    free(BindHost);
    masterconnsingleton = NULL;
}
Example #2
0
void masterconn_serve(struct pollfd *pdesc) {
	double now;
	masterconn *eptr = masterconnsingleton;

	now = monotonic_seconds();

	if (eptr->mode==CONNECTING) {
		if (eptr->sock>=0 && eptr->pdescpos>=0 && (pdesc[eptr->pdescpos].revents & (POLLOUT | POLLHUP | POLLERR))) { // FD_ISSET(eptr->sock,wset)) {
			masterconn_connecttest(eptr);
		}
	} else {
		if (eptr->pdescpos>=0) {
			if ((pdesc[eptr->pdescpos].revents & (POLLERR|POLLIN))==POLLIN && eptr->mode==DATA) {
				masterconn_read(eptr,now);
			}
			if (pdesc[eptr->pdescpos].revents & (POLLERR|POLLHUP)) {
				eptr->input_end = 1;
			}
			masterconn_parse(eptr);
		}
		if (eptr->mode==DATA && eptr->lastwrite+(Timeout/3.0)<now && eptr->outputhead==NULL) {
			masterconn_createpacket(eptr,ANTOAN_NOP,0);
		}
		if (eptr->pdescpos>=0) {
			if ((((pdesc[eptr->pdescpos].events & POLLOUT)==0 && (eptr->outputhead)) || (pdesc[eptr->pdescpos].revents & POLLOUT)) && eptr->mode==DATA) {
				masterconn_write(eptr,now);
			}
		}
		if (eptr->mode==DATA && eptr->lastread+Timeout<now) {
			eptr->mode = KILL;
		}
	}
	masterconn_disconnection_check();
}
Example #3
0
void masterconn_serve(struct pollfd *pdesc) {
    uint32_t now=main_time();
    packetstruct *pptr,*paptr;
    masterconn *eptr = masterconnsingleton;

    if (eptr->pdescpos>=0 && (pdesc[eptr->pdescpos].revents & (POLLHUP | POLLERR))) {
        if (eptr->mode==CONNECTING) {
            masterconn_connecttest(eptr);
        } else {
            eptr->mode = KILL;
        }
    }
    if (eptr->mode==CONNECTING) {
        if (eptr->sock>=0 && eptr->pdescpos>=0 && (pdesc[eptr->pdescpos].revents & POLLOUT)) { // FD_ISSET(eptr->sock,wset)) {
            masterconn_connecttest(eptr);
        }
    } else {
        if (eptr->pdescpos>=0) {
            if ((eptr->mode==HEADER || eptr->mode==DATA) && (pdesc[eptr->pdescpos].revents & POLLIN)) { // FD_ISSET(eptr->sock,rset)) {
                eptr->lastread = now;
                masterconn_read(eptr);
            }
            if ((eptr->mode==HEADER || eptr->mode==DATA) && (pdesc[eptr->pdescpos].revents & POLLOUT)) { // FD_ISSET(eptr->sock,wset)) {
                eptr->lastwrite = now;
                masterconn_write(eptr);
            }
            if ((eptr->mode==HEADER || eptr->mode==DATA) && eptr->lastread+Timeout<now) {
                eptr->mode = KILL;
            }
            if ((eptr->mode==HEADER || eptr->mode==DATA) && eptr->lastwrite+(Timeout/3)<now && eptr->outputhead==NULL) {
                masterconn_createpacket(eptr,ANTOAN_NOP,0);
            }
        }
    }
    if (eptr->mode == KILL) {
        masterconn_beforeclose(eptr);
        tcpclose(eptr->sock);
        if (eptr->inputpacket.packet) {
            free(eptr->inputpacket.packet);
        }
        pptr = eptr->outputhead;
        while (pptr) {
            if (pptr->packet) {
                free(pptr->packet);
            }
            paptr = pptr;
            pptr = pptr->next;
            free(paptr);
        }
        eptr->mode = FREE;
    }
}
Example #4
0
void masterconn_serve(int epoll_fd,int count,struct epoll_event *pdesc) {
	//uint32_t now=main_time();
	serventry *weptr = NULL,*eptr = NULL;
	int ns;
	int ret;
       struct epoll_event ev;

	if(ismaster()) {
		return;
	}
	
	weptr = (serventry *)pdesc[count].data.ptr;
	if ((weptr->listen_sock == 1) && (pdesc[count].events & EPOLLIN) && (weptr->mode != KILL)) {
		ns = tcpaccept(lsock);
		if (ns<0) {
                        MFSLOG(LOG_INFO,"master sync thread<->shadow master socket: accept error: %m");
                } else {
                        tcpnonblock(ns);
                        tcpnodelay(ns);
                        master_serve = (serventry *)malloc(sizeof(serventry));
			eptr = master_serve;
                        eptr->sock = ns;
                        eptr->mode = HEADER;
                        eptr->lastread = eptr->lastwrite = get_current_time();                 
        		eptr->inputpacket.next = NULL;
        		eptr->inputpacket.bytesleft = 8;
        		eptr->inputpacket.startptr = eptr->hdrbuff;
        		eptr->inputpacket.packet = NULL;
			eptr->outputhead = NULL;
        		eptr->outputtail = &(eptr->outputhead);

			eptr->downloading = 0;
			eptr->metafd=-1;
                        eptr->logfd=NULL;

			eptr->listen_sock = 0;
                        eptr->connection = 3;
			
			ev.data.ptr = eptr;
                        ev.events = EPOLLIN;
                        ret = epoll_ctl(epoll_fd,EPOLL_CTL_ADD,ns,&ev);
			if (ret < 0) {
				MFSLOG(LOG_NOTICE,"add epoll fail");
			}
		}
	}
	if (weptr->listen_sock == 0) {
		if (weptr->mode == CONNECTING) {
			if (pdesc[count].events & (EPOLLHUP | EPOLLERR)) {
				masterconn_connecttest(weptr);
			}
			if (pdesc[count].events & EPOLLOUT) {
				masterconn_connecttest(weptr);
			}
		} else {	
			if ((pdesc[count].events & (EPOLLHUP | EPOLLERR)) && (weptr->mode != KILL)) {
				MFSLOG(LOG_NOTICE, "set to NULL");
				weptr->mode = KILL;
			}
			if ((weptr->mode==HEADER || weptr->mode==DATA) && (pdesc[count].events & EPOLLIN)) { // FD_ISSET(eptr->sock,rset)) {
				masterconn_read(weptr);
				weptr->lastread = get_current_time();				
			}
			if ((weptr->mode==HEADER || weptr->mode==DATA) && (pdesc[count].events & EPOLLOUT)) { // FD_ISSET(eptr->sock,wset)) {
				masterconn_write(weptr);
				weptr->lastwrite = get_current_time();				
			}
			if ((weptr->mode==HEADER || weptr->mode==DATA) && weptr->lastread+Timeout<get_current_time()) {
				MFSLOG(LOG_NOTICE, "set to NULL");
				weptr->mode = KILL;
			}
			if ((weptr->mode==HEADER || weptr->mode==DATA) && weptr->lastwrite+5<get_current_time()
				&& weptr->outputhead==NULL) {
				masterconn_createpacket(weptr,ANTOAN_NOP,0);
			}
		}
	}
}