static void announcectlmsg(Proto *x, Conv *c, Cmdbuf *cb) { if(c->state != Idle) error(Econinuse); c->state = Announcing; c->cerr[0] = '\0'; ipmove(c->raddr, IPnoaddr); c->rport = 0; switch(cb->nf){ default: error("bad args to announce"); case 2: setladdrport(c, cb->f[1], 1); break; } USED(x); /* p = x->announce(c, cb->f, cb->nf); */ if(c->p->stype != S_UDP){ qunlock(&c->l); if(waserror()){ c->state = Announced; /* sic */ qlock(&c->l); nexterror(); } so_listen(c->sfd); qlock(&c->l); poperror(); } c->state = Announced; }
BOOL cg_socket_listen(CgSocket *sock) { #if defined(BTRON) || (defined(TENGINE) && !defined(CG_TENGINE_NET_KASAGO)) ERR ret = so_listen(sock->id, 10); #elif defined(TENGINE) && defined(CG_TENGINE_NET_KASAGO) ERR ret = ka_listen(sock->id, 10); #elif defined(ITRON) /**** Not Supported ****/ int ret = 0; #else int ret = listen(sock->id, SOMAXCONN); #endif cg_log_debug_l4("Entering...\n"); return (ret == 0) ? TRUE: FALSE; cg_log_debug_l4("Leaving...\n"); }
static void test_tcp_server(void) { int re; int sd; int reader = 0; char buf[5]; struct sockaddr_in sa; struct sockaddr_in sa2; socklen_t sa_len; printf("[tcp(server)] start\n"); sd = so_socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if ( sd < 0 ) { goto error; } DEBUG_PRINT(("server_task: so_socket = %d(%d, %d)\n", sd, MERCD(sd), SERCD(sd))); bzero(&sa, sizeof sa); sa.sin_family = AF_INET; sa.sin_addr.s_addr = htonl(INADDR_ANY); sa.sin_port = htons(12345); re = so_bind(sd, (struct sockaddr*)&sa, sizeof sa); DEBUG_PRINT(("server_task: so_bind = %d(%d, %d)\n", re, MERCD(re), SERCD(re))); if ( re < 0 ) { goto error; } re = so_listen(sd, 5); DEBUG_PRINT(("server_task: so_listen = %d(%d, %d)\n", re, MERCD(re), SERCD(re))); if ( re < 0 ) { goto error; } tk_sig_sem(semid, 1); DEBUG_PRINT(("server_task: server semaphore signaled 1\n")); reader = so_accept(sd, (struct sockaddr*)&sa2, &sa_len); DEBUG_PRINT(("server_task: so_accept = %d(%d, %d)\n", reader, MERCD(reader), SERCD(reader))); if ( reader < 0 ) { goto error; } wait_data(reader); bzero(buf, sizeof buf); re = so_sockatmark(reader); DEBUG_PRINT(("server_task: so_sockatmark = %d(%d, %d)\n", re, MERCD(re), SERCD(re))); if ( re < 0 ) { goto error; } re = so_read(reader, buf, 4); DEBUG_PRINT(("server_task: so_read = %d(%d, %d), buf = %s\n", re, MERCD(re), SERCD(re), buf)); if ( re < 0 || memcmp(buf, "1234", 4) != 0 ) { goto error; } wait_data(reader); bzero(buf, sizeof buf); re = so_sockatmark(reader); DEBUG_PRINT(("server_task: so_sockatmark = %d(%d, %d)\n", re, MERCD(re), SERCD(re))); if ( re < 0 ) { goto error; } re = so_recv(reader, buf, 4, MSG_OOB); DEBUG_PRINT(("server_task: so_recv = %d(%d, %d), buf = %s\n", re, MERCD(re), SERCD(re), buf)); if ( re < 0 || buf[0] != 'a' ) { goto error; } tk_sig_sem(semid2, 1); DEBUG_PRINT(("server_task: server semaphore for break signaled 2\n")); DEBUG_PRINT(("server_task: pre-accept for break\n")); re = so_accept(sd, (struct sockaddr*)&sa2, &sa_len); DEBUG_PRINT(("server_task: so_accept = %d(%d, %d)\n", re, MERCD(re), SERCD(re))); if ( re != EX_INTR ) { goto error; } so_close(reader); so_close(sd); printf("[tcp(server)] OK\n"); return; error: printf("[tcp(server)] FAILED\n"); if ( sd > 0 ) { so_close(sd); } if ( reader > 0 ) { so_close(reader); } tk_del_sem(semid2); return; }
long ipwrite(Chan *ch, void *a, long n, vlong offset) { Conv *c; Proto *x; int r, nf; char *p, *fields[3], buf[128]; switch(TYPE(ch->qid)) { default: error(Eperm); case Qcs: return cswrite(ch, a, n, offset); case Qctl: x = &proto[PROTO(ch->qid)]; c = x->conv[CONV(ch->qid)]; if(n > sizeof(buf)-1) n = sizeof(buf)-1; memmove(buf, a, n); buf[n] = '\0'; nf = tokenize(buf, fields, 3); if(strcmp(fields[0], "connect") == 0){ switch(nf) { default: error("bad args to connect"); case 2: p = setraddrport(c, fields[1]); if(p != 0) error(p); break; case 3: p = setraddrport(c, fields[1]); if(p != 0) error(p); c->lport = atoi(fields[2]); setlport(c); break; } so_connect(c->sfd, c->raddr, c->rport); setladdr(c); c->state = "Established"; return n; } if(strcmp(fields[0], "announce") == 0) { switch(nf){ default: error("bad args to announce"); case 2: setladdrport(c, fields[1]); break; } so_listen(c->sfd); c->state = "Announced"; return n; } if(strcmp(fields[0], "bind") == 0){ switch(nf){ default: error("bad args to bind"); case 2: c->lport = atoi(fields[1]); break; } setlport(c); return n; } error("bad control message"); case Qdata: x = &proto[PROTO(ch->qid)]; c = x->conv[CONV(ch->qid)]; r = so_send(c->sfd, a, n, 0); if(r < 0){ oserrstr(); nexterror(); } return r; } return n; }