long ipread(Chan *ch, void *a, long n, vlong offset) { int r; Conv *c; Proto *x; uchar ip[4]; char buf[128], *p; /*print("ipread %s %lux\n", c2name(ch), (long)ch->qid.path);*/ p = a; switch(TYPE(ch->qid)) { default: error(Eperm); case Qcs: return csread(ch, a, n, offset); case Qprotodir: case Qtopdir: case Qconvdir: return devdirread(ch, a, n, 0, 0, ipgen); case Qctl: sprint(buf, "%d", CONV(ch->qid)); return readstr(offset, p, n, buf); case Qremote: c = proto[PROTO(ch->qid)].conv[CONV(ch->qid)]; hnputl(ip, c->raddr); sprint(buf, "%I!%d\n", ip, c->rport); return readstr(offset, p, n, buf); case Qlocal: c = proto[PROTO(ch->qid)].conv[CONV(ch->qid)]; hnputl(ip, c->laddr); sprint(buf, "%I!%d\n", ip, c->lport); return readstr(offset, p, n, buf); case Qstatus: x = &proto[PROTO(ch->qid)]; c = x->conv[CONV(ch->qid)]; sprint(buf, "%s/%d %d %s \n", c->p->name, c->x, c->r.ref, c->state); return readstr(offset, p, n, buf); case Qdata: c = proto[PROTO(ch->qid)].conv[CONV(ch->qid)]; r = so_recv(c->sfd, a, n, 0); if(r < 0){ oserrstr(); nexterror(); } return r; } }
int cg_socket_read(CgSocket *sock, char *buffer, int bufferLen) { int recvLen; #if defined(CG_USE_OPENSSL) if (cg_socket_isssl(sock) == FALSE) { #endif #if defined(BTRON) || (defined(TENGINE) && !defined(CG_TENGINE_NET_KASAGO)) recvLen = so_recv(sock->id, buffer, bufferLen, 0); #elif defined(TENGINE) && defined(CG_TENGINE_NET_KASAGO) recvLen = ka_recv(sock->id, buffer, bufferLen, 0); #elif defined(ITRON) recvLen = tcp_rcv_dat(sock->id, buffer, bufferLen, TMO_FEVR); #else recvLen = recv(sock->id, buffer, bufferLen, 0); #endif #if defined(CG_USE_OPENSSL) } else { recvLen = SSL_read(sock->ssl, buffer, bufferLen); } #endif cg_log_debug_l4("Entering...\n"); #ifdef SOCKET_DEBUG if (0 <= recvLen) buffer[recvLen] = '\0'; cg_log_debug_s("r %d : %s\n", recvLen, (0 <= recvLen) ? buffer : ""); #endif cg_log_debug_l4("Leaving...\n"); return recvLen; }
static long ipread(Chan *ch, void *a, long n, vlong off) { int r; Conv *c; Proto *x; char *p, *s; Fs *f; ulong offset = off; f = ipfs[ch->dev]; p = a; switch(TYPE(ch->qid)) { default: error(Eperm); case Qprotodir: case Qtopdir: case Qconvdir: return devdirread(ch, a, n, 0, 0, ipgen); case Qarp: error(Eperm); /* TO DO */ case Qndb: return readstr(off, a, n, f->ndb); case Qctl: sprint(up->genbuf, "%lud", CONV(ch->qid)); return readstr(offset, p, n, up->genbuf); case Qremote: x = f->p[PROTO(ch->qid)]; c = x->conv[CONV(ch->qid)]; sprint(up->genbuf, "%I!%d\n", c->raddr, c->rport); return readstr(offset, p, n, up->genbuf); case Qlocal: x = f->p[PROTO(ch->qid)]; c = x->conv[CONV(ch->qid)]; sprint(up->genbuf, "%I!%d\n", c->laddr, c->lport); return readstr(offset, p, n, up->genbuf); case Qstatus: x = f->p[PROTO(ch->qid)]; c = x->conv[CONV(ch->qid)]; s = smalloc(Statelen); if(waserror()){ free(s); nexterror(); } snprint(s, Statelen, "%s\n", ipstates[c->state]); n = readstr(offset, p, n, s); poperror(); free(s); return n; case Qdata: x = f->p[PROTO(ch->qid)]; c = x->conv[CONV(ch->qid)]; if(c->sfd < 0) error(Ehungup); if(c->headers) { if(n < c->headers) error(Ebadarg); p = a; r = so_recv(c->sfd, p + c->headers, n - c->headers, p, c->headers); if(r > 0) r += c->headers; } else r = so_recv(c->sfd, a, n, nil, 0); if(r < 0) oserror(); return r; case Qstats: error("stats not implemented"); return 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; }