int main(int argc, char *argv[]) {
    if(argc != 3) {
        printf("usage: c10k <parallel-connections> <roundtrip-count>\n");
        return 1;
    }
    long conns = atol(argv[1]);
    long roundtrips = atol(argv[2]);
    assert(conns >= 1);

    tcpsock ls = tcplisten(iplocal("127.0.0.1", 5555, 0), 10);
    assert(ls);
    int i;
    for(i = 0; i != conns - 1; ++i) {
        go(connector());
        tcpsock as = tcpaccept(ls, -1);
        assert(as);
    }
    go(sender(roundtrips));
    tcpsock as = tcpaccept(ls, -1);
    assert(as);

    int64_t start = now();

    char buf[1];
    size_t nbytes;
    for(i = 0; i != roundtrips; ++i) {
        nbytes = tcpsend(as, "A", 1, -1);
        assert(errno == 0);
        assert(nbytes == 1);
        tcpflush(as, -1);
        assert(errno == 0);
        nbytes = tcprecv(as, buf, 1, -1);
        assert(errno == 0);
        assert(nbytes == 1);
        assert(buf[0] == 'A');
    }

    int64_t stop = now();
    long duration = (long)(stop - start);
    long us = (duration * 1000) / roundtrips;

    printf("done %ld roundtrips in %f seconds\n",
        roundtrips, ((float)duration) / 1000);
    printf("duration of a single roundtrip: %ld us\n", us);
    printf("roundtrips per second: %ld\n",
        (long)(roundtrips * 1000 / duration));

    return 0;
}
Esempio n. 2
0
File: step2.c Progetto: 8l/libmill
int main(int argc, char *argv[]) {

    int port = 5555;
    if(argc > 1)
        port = atoi(argv[1]);

    tcpsock ls = tcplisten(iplocal(NULL, port, 0));
    if(!ls) {
        perror("Can't open listening socket");
        return 1;
    }

    while(1) {
        tcpsock as = tcpaccept(ls, -1);

        tcpsend(as, "What's your name?\r\n", 19, -1);
        tcpflush(as, -1);

        char inbuf[256];
        size_t sz = tcprecvuntil(as, inbuf, sizeof(inbuf), "\r", 1, -1);

        inbuf[sz - 1] = 0;
        char outbuf[256];
        int rc = snprintf(outbuf, sizeof(outbuf), "Hello, %s!\n", inbuf);

        sz = tcpsend(as, outbuf, rc, -1);
        tcpflush(as, -1);

        tcpclose(as);
    }
}
Esempio n. 3
0
int main() {
    tcpsock ls = tcplisten("*:5555");
    assert(ls);

    go(client());

    tcpsock as = tcpaccept(ls);

    tcpsend(as, "ABC", 3);
    int rc = tcpflush(as);
    assert(rc == 0);

    char buf[16];
    ssize_t sz = tcprecvuntil(as, buf, sizeof(buf), '\n');
    assert(sz == 4);
    assert(buf[0] == '1' && buf[1] == '2' && buf[2] == '3' && buf[3] == '\n');
    sz = tcprecvuntil(as, buf, sizeof(buf), '\n');
    assert(sz == 3);
    assert(buf[0] == '4' && buf[1] == '5' && buf[2] == '\n');
    sz = tcprecvuntil(as, buf, 3, '\n');
    assert(sz == 0);
    assert(buf[0] == '6' && buf[1] == '7' && buf[2] == '8');

    tcpclose(as);
    tcpclose(ls);

    return 0;
}
Esempio n. 4
0
int main(int argc, char *argv[])
{
    int port = 5555;
    if(argc > 1)
        port = atoi(argv[1]);

    ipaddr  addr    = iplocal(NULL, port, 0);
    tcpsock ls      = tcplisten(addr, 10);
    if(!ls) 
    {
        perror("Can't open listening socket");
        return 1;
    } 

    while(1)
    {
        tcpsock as = tcpaccept(ls, -1);
        printf("New connection!\n");

        tcpsend(as, "What's your name?\r\n", 19, -1);
        tcpflush(as, -1);

        tcpclose(as);
    }

    return 0;
}
Esempio n. 5
0
int main(int argc, char *argv[]) {
  int port = 5555;
  if (argc > 1) {
    port = atoi(argv[1]);
  }

  // create a communication channel
  chan channel = chmake(int, 0);
  go(channel_handler(channel));

  // create server that listens and routes traffic to handler function
  ipaddr addr = iplocal(NULL, port, 0);
  tcpsock ls = tcplisten(addr);
  if (!ls) {
    perror("Can't open listening socket");
    return 1;
  }

  while(1) {
    tcpsock accepted_socket = tcpaccept(ls, -1);
    if (!accepted_socket) {
      continue;
    } else {
      go(handler(accepted_socket, channel));
    }

    // temporary stop gap :)
    if (test == 3) {
      break;
    }
  }

  return 0;
}
Esempio n. 6
0
int
fdproc_accept(int fd)
{
  int newfd = tcpaccept(fd);
  //if (newfd >= 0) {};
  if (newfd > maxfd) {
    maxfd = newfd;
  }
  return newfd;
}
Esempio n. 7
0
void matoslaserv_serve(int epoll_fd,int count,struct epoll_event *pdesc) {
	//uint32_t now=main_time();
	serventry *eptr,*weptr;
	int ns;
	
	weptr = (serventry *)pdesc[count].data.ptr;
	if ((weptr->listen_sock == 1) && (pdesc[count].events & EPOLLIN)) {
		ns=tcpaccept(lsock);
		if (ns<0) {
			MFSLOG(LOG_INFO,"Master<->sla socket: accept error: %m");
		} else {
			struct epoll_event ev;
			tcpnonblock(ns);
			tcpnodelay(ns);
			eptr = (serventry *)malloc(sizeof(serventry));
			eptr->next = matoslaservhead;
			matoslaservhead = eptr;
			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->timeout = 120;
			
			tcpgetpeer(eptr->sock,&(eptr->servip),NULL);
			eptr->servstrip = matoslaserv_makestrip(eptr->servip);
			eptr->version=0;
			eptr->metafd=-1;

			eptr->listen_sock = 0;
                    eptr->connection = 4;

			ev.data.ptr = eptr;
                        ev.events = EPOLLIN | EPOLLOUT;
                        epoll_ctl(epoll_fd,EPOLL_CTL_ADD,ns,&ev);
		}
	}
	if(weptr->listen_sock == 0) {
		if (pdesc[count].events & (EPOLLERR|EPOLLHUP)) {
			weptr->mode = KILL;
		}
		if ((pdesc[count].events & EPOLLIN) && weptr->mode!=KILL) {
			matoslaserv_read(weptr);
			weptr->lastread = get_current_time();			
		}
		if ((pdesc[count].events & EPOLLOUT) && weptr->mode!=KILL && weptr->outputhead!=NULL) {
			matoslaserv_write(weptr);
			weptr->lastwrite = get_current_time();			
		}
	}
}
Esempio n. 8
0
/*
 * add by ning
 * */
int tcptoaccept(int sock, uint32_t msecto) {
	struct pollfd pfd;
	pfd.fd = sock;
	pfd.events = POLLIN;

    if (poll(&pfd,1,msecto)<0) {
        return -1;
    }
    if (pfd.revents & POLLIN) {
        return tcpaccept(sock);
    } else {
        errno = ETIMEDOUT;
        return -1;
    }
}
Esempio n. 9
0
int main() {
    char buf[16];

    tcpsock ls = tcplisten(iplocal(NULL, 5555, 0), 10);
    assert(ls);

    int fd = tcpdetach(ls);
    assert(fd != -1);
    ls = tcpattach(fd, 1);
    assert(ls);
    assert(tcpport(ls) == 5555);

    go(client(5555));

    tcpsock as = tcpaccept(ls, -1);

    /* Test deadline. */
    int64_t deadline = now() + 30;
    size_t sz = tcprecv(as, buf, sizeof(buf), deadline);
    assert(sz == 0 && errno == ETIMEDOUT);
    int64_t diff = now() - deadline;
    assert(diff > -20 && diff < 20); 

    sz = tcpsend(as, "ABC", 3, -1);
    assert(sz == 3 && errno == 0);
    tcpflush(as, -1);
    assert(errno == 0);

    sz = tcprecvuntil(as, buf, sizeof(buf), "\n", 1, -1);
    assert(sz == 4);
    assert(buf[0] == '1' && buf[1] == '2' && buf[2] == '3' && buf[3] == '\n');
    sz = tcprecvuntil(as, buf, sizeof(buf), "\n", 1, -1);
    assert(sz == 3);
    assert(buf[0] == '4' && buf[1] == '5' && buf[2] == '\n');
    sz = tcprecvuntil(as, buf, 3, "\n", 1, -1);
    assert(sz == 3);
    assert(buf[0] == '6' && buf[1] == '7' && buf[2] == '8');

    tcpclose(as);
    tcpclose(ls);

    return 0;
}
Esempio n. 10
0
int main(int argc, char *argv[]) {

    int port = 5555;
    if(argc > 1)
        port = atoi(argv[1]);

    ipaddr addr = iplocal(NULL, port, 0);
    tcpsock ls = tcplisten(addr, 10);
    if(!ls) {
        perror("Can't open listening socket");
        return 1;
    }

    while(1) {
        tcpsock as = tcpaccept(ls, -1);
        if(!as)
            continue;
        go(dialogue(as));
    }
}
Esempio n. 11
0
int main(int argc, char *argv[]) {

    int port = 5555;
    int nproc = 1;
    if(argc > 1)
        port = atoi(argv[1]);
    if(argc > 2)
        nproc = atoi(argv[2]);

    ipaddr addr = iplocal(NULL, port, 0);
    tcpsock ls = tcplisten(addr, 10);
    if(!ls) {
        perror("Can't open listening socket");
        return 1;
    }

    int i;
    for (i = 0; i < nproc - 1; ++i) {
        pid_t pid = fork();
        if(pid < 0) {
           perror("Can't create new process");
           return 1;
        }
        if(pid > 0)
            break;
    }

    chan ch = chmake(int, 0);
    go(statistics(ch));

    while(1) {
        tcpsock as = tcpaccept(ls, -1);
        if(!as)
            continue;
        go(dialogue(as, ch));
    }
}
Esempio n. 12
0
void matomlserv_serve(struct pollfd *pdesc) {
	uint32_t now=main_time();
	matomlserventry *eptr,**kptr;
	packetstruct *pptr,*paptr;
	int ns;
	static uint64_t lastaction = 0;
	uint64_t unow;
	uint32_t timeoutadd;

	if (lastaction==0) {
		lastaction = main_precise_utime();
	}

	if (lsockpdescpos>=0 && (pdesc[lsockpdescpos].revents & POLLIN)) {
		ns=tcpaccept(lsock);
		if (ns<0) {
			mfs_errlog_silent(LOG_NOTICE,"Master<->ML socket: accept error");
		} else {
			tcpnonblock(ns);
			tcpnodelay(ns);
			eptr = malloc(sizeof(matomlserventry));
			passert(eptr);
			eptr->next = matomlservhead;
			matomlservhead = eptr;
			eptr->sock = ns;
			eptr->pdescpos = -1;
			eptr->mode = HEADER;
			eptr->lastread = now;
			eptr->lastwrite = now;
			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->timeout = 10;

			tcpgetpeer(eptr->sock,&(eptr->servip),NULL);
			eptr->servstrip = matomlserv_makestrip(eptr->servip);
			eptr->version=0;
			eptr->metafd=-1;
			eptr->chain1fd=-1;
			eptr->chain2fd=-1;
            eptr->logindex=-1;
            eptr->logf=NULL;
            eptr->currentversion=0;
		}
	}

// read
	for (eptr=matomlservhead ; eptr ; eptr=eptr->next) {
		if (eptr->pdescpos>=0) {
			if (pdesc[eptr->pdescpos].revents & (POLLERR|POLLHUP)) {
				eptr->mode = KILL;
			}
			if ((pdesc[eptr->pdescpos].revents & POLLIN) && eptr->mode!=KILL) {
				eptr->lastread = now;
				matomlserv_read(eptr);
			}
		}
	}

// timeout fix
	unow = main_precise_utime();
	timeoutadd = (unow-lastaction)/1000000;
	if (timeoutadd) {
		for (eptr=matomlservhead ; eptr ; eptr=eptr->next) {
			eptr->lastread += timeoutadd;
		}
	}
	lastaction = unow;

// write
	for (eptr=matomlservhead ; eptr ; eptr=eptr->next) {
		if ((uint32_t)(eptr->lastwrite+(eptr->timeout/3))<(uint32_t)now && eptr->outputhead==NULL) {
			matomlserv_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!=KILL) {
				eptr->lastwrite = now;
				matomlserv_write(eptr);
			}
            if (eptr->mode!=KILL && eptr->logf && eptr->outputhead==NULL) {
                matomlserv_send_old_changes(eptr, eptr->currentversion);
            }
		}
		if ((uint32_t)(eptr->lastread+eptr->timeout)<(uint32_t)now) {
			eptr->mode = KILL;
		}
	}

// close
	kptr = &matomlservhead;
	while ((eptr=*kptr)) {
		if (eptr->mode == KILL) {
			matomlserv_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);
			}
			if (eptr->servstrip) {
				free(eptr->servstrip);
			}
			*kptr = eptr->next;
			free(eptr);
		} else {
			kptr = &(eptr->next);
		}
	}
}
Esempio n. 13
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);
			}
		}
	}
}
Esempio n. 14
0
wsock wsockaccept(wsock s, int64_t deadline) {
    int err = 0;
    if(!(s->flags & WSOCK_LISTENING)) {err = EOPNOTSUPP; goto err0;}
    struct wsock *as = (struct wsock*)malloc(sizeof(struct wsock));
    if(!as) {err = ENOMEM; goto err0;}
    as->flags = 0;
    as->u = tcpaccept(s->u, deadline);
    if(errno != 0) {err = errno; goto err1;}
    wsock_str_init(&as->url, NULL, 0);
    wsock_str_init(&as->subprotocol, NULL, 0);

    /* Parse request. */
    char buf[256];
    size_t sz = wsock_getline(as, buf, sizeof(buf), deadline);
    if(sz < 0) {err = errno; goto err2;}
    char *lend = buf + sz;
    char *wstart = buf;
    char *wend = (char*)memchr(buf, ' ', lend - wstart);
    if(!wend || wend - wstart != 3 || memcmp(wstart, "GET", 3) != 0) {
        err = EPROTO; goto err2;}
    wstart = wend + 1;
    wend = (char*)memchr(wstart, ' ', lend - wstart);
    if(!wend) {err = EPROTO; goto err2;}
    wsock_str_init(&as->url, wstart, wend - wstart);
    wstart = wend + 1;
    wend = (char*)memchr(wstart, ' ', lend - wstart);
    if(wend || lend - wstart != 8 || memcmp(wstart, "HTTP/1.1", 8) != 0) {
        err = EPROTO; goto err2;}
    int hasupgrade = 0;
    int hasconnection = 0;
    int haskey = 0;
    int hassubprotocol = 0;
    const char *subprotocol = NULL;
    size_t subprotocolsz = 0;
    struct wsock_sha1 sha1;
    while(1) {
        sz = wsock_getline(as, buf, sizeof(buf), deadline);
        if(sz < 0) {err = errno; goto err2;}
        if(sz == 0)
            break;
        lend = buf + sz;
        char *nstart = buf;
        char *nend = (char*)memchr(buf, ' ', lend - nstart);
        if(!nend || nend - nstart < 1 || nend[-1] != ':') {
            err = EPROTO; goto err2;}
        size_t nsz = nend - nstart - 1;
        char *vstart = nend + 1;
        char *vend = (char*)memchr(vstart, ' ', lend - vstart);
        if(vend) {err = EPROTO; goto err2;}
        size_t vsz = lend - vstart;
        if(nsz == 7 && memcmp(nstart, "Upgrade", 7) == 0) {
            if(hasupgrade || vsz != 9 || memcmp(vstart, "websocket", 9) != 0) {
                err = EPROTO; goto err2;}
            hasupgrade = 1;
            continue;
        }
        if(nsz == 10 && memcmp(nstart, "Connection", 10) == 0) {
            if(hasconnection || vsz != 7 || memcmp(vstart, "Upgrade", 7) != 0) {
                err = EPROTO; goto err2;}
            hasconnection = 1;
            continue;
        }
        if(nsz == 17 && memcmp(nstart, "Sec-WebSocket-Key", 17) == 0) {
            if(haskey) {err = EPROTO; goto err2;}
            wsock_sha1_init(&sha1);
            int i;
            for(i = 0; i != vsz; ++i)
                wsock_sha1_hashbyte(&sha1, vstart[i]);
            const char *uuid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
            for(i = 0; i != 36; ++i)
                wsock_sha1_hashbyte(&sha1, uuid[i]);
            haskey = 1;
            continue;
        }
        if(nsz == 22 && memcmp(nstart, "Sec-WebSocket-Protocol", 22) == 0) {
            /* TODO: RFC6455, section 11.3.4 allows for multiple instances of
               this field. */
            if(hassubprotocol) {err = EPROTO; goto err2;}
            const char *available = wsock_str_get(&s->subprotocol);
            if(available) {
                subprotocol = wsock_hassubprotocol(available, vstart, vsz,
                    &subprotocolsz);
                if(!subprotocol) {err = EPROTO; goto err2;}
            }
            else {
                subprotocol = vstart;
                subprotocolsz = vsz;
            }
            hassubprotocol = 1;
            wsock_str_init(&as->subprotocol, subprotocol, subprotocolsz);
            continue;
        }
    }
    if(!hasupgrade || !hasconnection || !haskey) {err = EPROTO; goto err2;}

    /* If the subprotocol was not specified by the client, we still want to
       use one of the suerver-supported protocols locally. */
    if(!subprotocol) {
        const char *available = wsock_str_get(&s->subprotocol);
        if(available) {
            size_t asz = 0;
            while(available[asz] != 0 && available[asz] != ',')
                ++asz;
            wsock_str_init(&as->subprotocol, available, asz);
        }
    }

    /* Send reply. */
    const char *lit1 =
        "HTTP/1.1 101 Switching Protocols\r\n"
        "Upgrade: websocket\r\n"
        "Connection: Upgrade\r\n"
        "Sec-WebSocket-Accept: ";
    tcpsend(as->u, lit1, strlen(lit1), deadline);
    if(errno != 0) {err = errno; goto err2;}
    char key[32];
    wsock_sha1_result(&sha1);
    sz = wsock_base64_encode(wsock_sha1_result(&sha1), 20, key, sizeof(key));
    assert(sz > 0);
    tcpsend(as->u, key, sz, deadline);
    if(errno != 0) {err = errno; goto err2;}
    if(hassubprotocol) {
        tcpsend(as->u, "\r\nSec-WebSocket-Protocol: ", 26, deadline);
        if(errno != 0) {err = errno; goto err2;}
        tcpsend(as->u, subprotocol, subprotocolsz, deadline);
        if(errno != 0) {err = errno; goto err2;}
    }
    tcpsend(as->u, "\r\n\r\n", 4, deadline);
    if(errno != 0) {err = errno; goto err2;}
    tcpflush(as->u, deadline);
    if(errno != 0) {err = errno; goto err2;}

    return as;

err2:
    tcpclose(as->u);
err1:
    free(as);
err0:
    errno = err;
    return NULL;
}
Esempio n. 15
0
File: cfuncs.c Progetto: 8l/bcpl
BCPLWORD callc(BCPLWORD *args, BCPLWORD *g) {
    int rc = 0;
    BCPLWORD fno = args[0];
    //printf("\nCallc: fno = %d\n", fno);

    switch(fno) {
    default:
        return -1;

    case c_name2ipaddr: // name => ipaddr (host format)
        b2c_str(args[1], namebuf);
        //printf("Callc c_name2ipaddr: args[1]=%d %s\n",
        //       args[1], namebuf);
        return name2ipaddr(namebuf);

    case c_name2port: // name => port (host format)
        b2c_str(args[1], namebuf);
        //printf("callc c_name2port: %s\n", namebuf);
        return name2port(namebuf);

    case c_newsocket: // Allocate a new socket
        return newsocket();

    case c_reuseaddr: // Reuse address
        return reuseaddr((int)args[1], (int)args[2]);

    case c_setsndbufsz: // Set the send buffer size
        return setsndbufsz((int)args[1], (int)args[2]);

    case c_setrcvbufsz: // Set the recv buffer size
        return setrcvbufsz((int)args[1], (int)args[2]);

    case c_tcpbind:     // Bind a socket to a given ipaddr/port
        //printf("c_tcpbind: %d %08x %d\n", args[1], args[2], args[3]);
        return tcpbind((int)args[1], (int)args[2], (int)args[3]);

    case c_tcpconnect: //  Connect a socket to a given ipaddr/port
        //printf("tcpconnect %d %08x %d\n", args[1], args[2], args[3]);
        return tcpconnect((int)args[1], (int)args[2], (int)args[3]);

    case c_tcplisten: //  Cause a socket to listen
        return tcplisten((int)args[1], (int)args[2]);

    case c_tcpaccept: // Cause a socket to accept a connection
        return tcpaccept((int)args[1]);

    case c_tcpclose: // Close a connection
        //printf("tcpclose %d\n", args[1]);
        return close((int)args[1]);

    case c_fd_zero: // Clear all bits in an fd_set
    {   //fd_set *bits = (fd_set*)&W[args[2]];
        FD_ZERO((fd_set*)&W[args[1]]);
        return 0;
    }

    case c_fd_set: // Set a bit in an fd_set
        //printf("c_fd_set: args[1]=%d args[2]=%d\n", args[1], args[2]);
        FD_SET((int)args[1], (fd_set*)&W[args[2]]);
        return 0;

    case c_fd_isset: // Test a bit in an fd_set
        return FD_ISSET((int)args[1], (fd_set*)&W[args[2]]);

    case c_select: // Call the select function
    {   int i, rc;
        int      s       = (int)          args[1];
        fd_set  *rd_set  = (fd_set *)  &W[args[2]];
        fd_set  *wr_set  = (fd_set *)  &W[args[3]];
        fd_set  *er_set  = (fd_set *)  &W[args[4]];
        struct timeval *timeval = (struct timeval *)
                                  ((args[5]==0) ? NULL : &W[args[5]]);
        /*
        //for(i=0; i<10;i++)
        //  printf("callc: rdset bit %d = %d\n",
             i, FD_ISSET(i, (fd_set*)&W[args[2]]));
        */
        //printf("callc: calling select(%d,%d,%d,%d,%d)\n",
        //        args[1],args[2],args[3],args[4],args[5]);
        //if(timeval) {
        //printf("c_select: tv_sec  = %d\n", timeval->tv_sec);
        //printf("c_select: tv_usec = %d\n", timeval->tv_usec);
        //}
        rc = select(s, rd_set, wr_set, er_set, timeval);

        if(rc==-1) perror("select returned error");
        //printf("\ncallc: select => rc = %d\n", rc);
        //for(i=0; i<10;i++)
        //   printf("callc: rdset bit %d = %d\n",
        //           i, FD_ISSET(i, rd_set));
        return rc;
    }

    case c_recv:    // Call the recv(s, buf, len, flags)
    {   int   s     = (int)args[1];
        char *buf   = (char*)&W[args[2]];
        int   len   = (int)args[3];
        int   flags = (int)args[4];
        int rc = 0;
        //printf("cfuncs: Calling recv(%d, %d, %d, %d)\n",
        //     args[1], args[2], args[3], args[4]);
        rc = recv(s, buf, len, flags);
        if(rc==-1)perror("recv returned error");
        //printf("cfuncs: recv returned rc=%d\n", rc);
        return rc;
    }

    case c_send:    // Call the send(s, buf, len, flags)
    {   int   s     = (int)args[1];
        char *buf   = (char*)&W[args[2]];
        int   len   = (int)args[3];
        int   flags = (int)args[4];
        int rc = 0;
        //printf("cfuncs: Calling send(%d, %d, %d, %d)\n",
        //       args[1], args[2], args[3], args[4]);
        rc = send(s, buf, len, flags);
        if(rc==-1)perror("send returned error");
        //printf("cfuncs: send returned rc=%d\n", rc);
        return rc;
    }

    case c_read:    // Call the read(s, buf, len)
    {   int   s   = (int)args[1];
        char *buf = (char*)&W[args[2]];
        int   len = (int)args[3];
        int rc = 0;
        //printf("cfuncs: Calling read(%d, %d, %d)\n", args[1], args[2], args[3]);
        rc = read(s, buf, len);
        //if(rc==-1)perror("read returned error");
        //printf("cfuncs: read returned rc=%d\n", rc);
        return rc;
    }

    case c_write:   // Call the write(s, buf, len)
    {   int   s   = (int)   args[1];
        char *buf = (char*) &W[args[2]];
        int   len = (int)   args[3];
        int   rc  = 0;
        //printf("cfuncs: Calling write(%d, %d, %d)\n", args[1], args[2], args[3]);
        rc = write(s, buf, len);
        if(rc==-1)perror("read returned error");
        //printf("cfuncs: read returned rc=%d\n", rc);
        return rc;
    }
    }
}
Esempio n. 16
0
void csserv_serve(struct pollfd *pdesc) {
	double now;
	csserventry *eptr,**kptr;
	packetstruct *pptr,*paptr;
	int ns;

	now = monotonic_seconds();

	if (lsockpdescpos>=0 && (pdesc[lsockpdescpos].revents & POLLIN)) {
		ns=tcpaccept(lsock);
		if (ns<0) {
			mfs_errlog_silent(LOG_NOTICE,"accept error");
		} else {
			tcpnonblock(ns);
			tcpnodelay(ns);
			eptr = malloc(sizeof(csserventry));
			passert(eptr);
			eptr->next = csservhead;
			csservhead = eptr;
			eptr->state = IDLE;
			eptr->mode = HEADER;
			eptr->sock = ns;
			eptr->pdescpos = -1;
			eptr->lastread = now;
			eptr->lastwrite = now;
			eptr->inputpacket.bytesleft = 8;
			eptr->inputpacket.startptr = eptr->hdrbuff;
			eptr->inputpacket.packet = NULL;
			eptr->outputhead = NULL;
			eptr->outputtail = &(eptr->outputhead);
			eptr->jobid = 0;

			eptr->idlejobs = NULL;
		}
	}

	for (eptr=csservhead ; eptr ; eptr=eptr->next) {
		if (eptr->pdescpos>=0 && (pdesc[eptr->pdescpos].revents & (POLLERR|POLLHUP))) {
			eptr->state = CLOSE;
		}
		if (eptr->pdescpos>=0 && (pdesc[eptr->pdescpos].revents & POLLIN) && eptr->state==IDLE) {
			eptr->lastread = now;
			csserv_read(eptr);
		}
		if (eptr->state==IDLE && eptr->lastwrite+(CSSERV_TIMEOUT/3.0)<now && eptr->outputhead==NULL) {
			csserv_create_packet(eptr,ANTOAN_NOP,0);
		}
		if (eptr->pdescpos>=0 && (pdesc[eptr->pdescpos].revents & POLLOUT) && eptr->state==IDLE) {
			eptr->lastwrite = now;
			csserv_write(eptr);
		}
		if (eptr->state==IDLE && eptr->lastread+CSSERV_TIMEOUT<now) {
//			syslog(LOG_NOTICE,"csserv: connection timed out");
			eptr->state = CLOSE;
		}
	}

	kptr = &csservhead;
	while ((eptr=*kptr)) {
		if (eptr->state == CLOSE) {
			tcpclose(eptr->sock);
			csserv_close(eptr);
			if (eptr->inputpacket.packet) {
				free(eptr->inputpacket.packet);
			}
//			wptr = eptr->todolist;
//			while (wptr) {
//				waptr = wptr;
//				wptr = wptr->next;
//				free(waptr);
//			}
			pptr = eptr->outputhead;
			while (pptr) {
				if (pptr->packet) {
					free(pptr->packet);
				}
				paptr = pptr;
				pptr = pptr->next;
				free(paptr);
			}
			*kptr = eptr->next;
			free(eptr);
		} else {
			kptr = &(eptr->next);
		}
	}
}