static void test_tcp_client(void) { int sd; int re; struct sockaddr_in sa; printf("[tcp(client)] start\n"); sd = so_socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); DEBUG_PRINT(("so_socket = %d(%d, %d)\n", sd, MERCD(sd), SERCD(sd))); if ( sd < 0 ) { goto error2; } bzero(&sa, sizeof sa); sa.sin_family = AF_INET; sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK); sa.sin_port = htons(12345); re = so_connect(sd, (struct sockaddr*)&sa, sizeof sa); printf("so_connect = %d(%d, %d)\n", re, MERCD(re), SERCD(re)); if ( re < 0 ) { goto error2; } re = so_write(sd, "1234", 4); DEBUG_PRINT(("so_write = %d(%d, %d)\n", re, MERCD(re), SERCD(re))); if ( re < 0 ) { goto error2; } re = so_send(sd, "a", 1, MSG_OOB); DEBUG_PRINT(("so_send = %d(%d, %d)\n", re, MERCD(re), SERCD(re))); if ( re < 0 ) { goto error2; } so_close(sd); tk_wai_sem(semid2, 1, TMO_FEVR); re = so_break(server_tskid); DEBUG_PRINT(("so_break = %d(%d, %d)\n", re, MERCD(re), SERCD(re))); if ( re < 0 ) { goto error2; } printf("[tcp(client)] OK\n"); return; error2: if ( sd > 0 ) { so_close(sd); } so_break(server_tskid); printf("[tcp(client)] FAILED\n"); }
static void closeconv(Conv *cv) { int fd; qlock(&cv->l); if(--cv->inuse > 0) { qunlock(&cv->l); return; } if(waserror()){ qunlock(&cv->l); return; } kstrdup(&cv->owner, network); cv->perm = 0660; /* cv->p->close(cv); */ cv->state = Idle; cv->restricted = 0; fd = cv->sfd; cv->sfd = -1; if(fd >= 0) so_close(fd); poperror(); qunlock(&cv->l); }
static void route_cmd(int cmd, in_addr_t dest, in_addr_t gate, in_addr_t mask, int index, int direct) { int i = 0; int sock; int re; struct { struct rt_msghdr rtm; struct sockaddr_in addr[3]; } buf; bzero(&buf, sizeof buf); buf.rtm.rtm_version = RTM_VERSION; buf.rtm.rtm_type = cmd; buf.rtm.rtm_index = index; buf.rtm.rtm_flags = RTF_STATIC; if ( direct ) { buf.rtm.rtm_flags |= RTF_HOST; } else { buf.rtm.rtm_flags |= RTF_GATEWAY; } buf.rtm.rtm_addrs = RTA_DST | RTA_NETMASK; if ( gate != 0 ) { buf.rtm.rtm_addrs |= RTA_GATEWAY; } buf.rtm.rtm_inits = RTV_HOPCOUNT; buf.rtm.rtm_rmx.rmx_hopcount = 1; buf.rtm.rtm_seq = 1; buf.addr[i].sin_len = sizeof(struct sockaddr_in); buf.addr[i].sin_family = AF_INET; buf.addr[i].sin_addr.s_addr = dest; i++; if ( gate != 0 ) { buf.addr[i].sin_len = sizeof(struct sockaddr_in); buf.addr[i].sin_family = AF_INET; buf.addr[i].sin_addr.s_addr = gate; i++; } buf.addr[i].sin_len = sizeof(struct sockaddr_in); buf.addr[i].sin_family = AF_INET; buf.addr[i].sin_addr.s_addr = mask; i++; buf.rtm.rtm_msglen = sizeof(struct rt_msghdr) + sizeof(struct sockaddr) * i; sock = so_socket(AF_ROUTE, SOCK_RAW, 0); DEBUG_PRINT(("route_add: so_socket = %d(%d, %d)\n", sock, MERCD(sock), SERCD(sock))); so_shutdown(sock, SHUT_RD); re = so_write(sock, &buf, buf.rtm.rtm_msglen); DEBUG_PRINT(("route_add: so_write = %d(%d, %d)\n", re, MERCD(re), SERCD(re))); so_close(sock); }
static Chan * ipopen(Chan *c, int omode) { Conv *cv, *nc; Proto *p; uchar raddr[IPaddrlen]; ushort rport; int perm, sfd; Fs *f; perm = m2p[omode&3]; f = ipfs[c->dev]; switch(TYPE(c->qid)) { default: break; case Qtopdir: case Qprotodir: case Qconvdir: case Qstatus: case Qremote: case Qlocal: case Qstats: /* case Qipselftab: */ if(omode != OREAD) error(Eperm); break; case Qndb: if(omode & (OWRITE|OTRUNC) && !iseve()) error(Eperm); if((omode & (OWRITE|OTRUNC)) == (OWRITE|OTRUNC)){ f->ndb[0] = 0; f->ndbvers++; } break; case Qclone: p = f->p[PROTO(c->qid)]; cv = protoclone(p, up->env->user, -1); if(cv == 0) error(Enodev); mkqid(&c->qid, QID(p->x, cv->x, Qctl), 0, QTFILE); break; case Qdata: case Qctl: p = f->p[PROTO(c->qid)]; qlock(&p->l); cv = p->conv[CONV(c->qid)]; qlock(&cv->l); if(waserror()){ qunlock(&cv->l); qunlock(&p->l); nexterror(); } if((perm & (cv->perm>>6)) != perm) { if(strcmp(up->env->user, cv->owner) != 0) error(Eperm); if((perm & cv->perm) != perm) error(Eperm); } cv->inuse++; if(cv->inuse == 1) { kstrdup(&cv->owner, up->env->user); cv->perm = 0660; if(cv->sfd < 0) cv->sfd = so_socket(p->stype); } poperror(); qunlock(&cv->l); qunlock(&p->l); break; case Qlisten: p = f->p[PROTO(c->qid)]; cv = p->conv[CONV(c->qid)]; if((perm & (cv->perm>>6)) != perm){ if(strcmp(up->env->user, cv->owner) != 0) error(Eperm); if((perm & cv->perm) != perm) error(Eperm); } if(cv->state != Announced) error("not announced"); qlock(&cv->listenq); if(waserror()){ qunlock(&cv->listenq); nexterror(); } sfd = so_accept(cv->sfd, raddr, &rport); nc = protoclone(p, up->env->user, sfd); if(nc == 0) { so_close(sfd); error(Enodev); } memmove(nc->raddr, raddr, IPaddrlen); nc->rport = rport; setladdr(nc); nc->state = Connected; mkqid(&c->qid, QID(PROTO(c->qid), nc->x, Qctl), 0, QTFILE); poperror(); qunlock(&cv->listenq); break; } c->mode = openmode(omode); c->flag |= COPEN; c->offset = 0; return c; }
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; }
BOOL cg_socket_close(CgSocket *sock) { cg_log_debug_l4("Entering...\n"); if (cg_socket_isbound(sock) == FALSE) return TRUE; #if defined(CG_USE_OPENSSL) if (cg_socket_isssl(sock) == TRUE) { if (sock->ctx) { SSL_shutdown(sock->ssl); SSL_free(sock->ssl); sock->ssl = NULL; } if (sock->ctx) { SSL_CTX_free(sock->ctx); sock->ctx = NULL; } } #endif #if (defined(WIN32) || defined(__CYGWIN__)) && !defined(ITRON) #if !defined(WINCE) WSAAsyncSelect(sock->id, NULL, 0, FD_CLOSE); #endif shutdown(sock->id, SD_BOTH ); #if defined WINCE { int nRet = 1; char achDiscard[256]; while (nRet && (nRet != SOCKET_ERROR)){ if (nRet>0) { achDiscard[nRet]=(char)0; #if defined DEBUG_SOCKET printf("DUMMY READ WHILE CLOSING SOCKET \n%s\n",achDiscard); #endif } nRet = recv(sock->id,achDiscard,128,0); } } #endif closesocket(sock->id); #if !defined(__CYGWIN__) && !defined(__MINGW32__) sock->id = INVALID_SOCKET; #else sock->id = -1; #endif #else #if defined(BTRON) || (defined(TENGINE) && !defined(CG_TENGINE_NET_KASAGO)) so_shutdown(sock->id, 2); so_close(sock->id); #elif defined(TENGINE) && defined(CG_TENGINE_NET_KASAGO) ka_tfClose(sock->id); #elif defined(ITRON) if (cg_socket_issocketstream(sock) == TRUE) { tcp_can_cep(sock->id, TFN_TCP_ALL); tcp_sht_cep(sock->id); tcp_del_cep(sock->id); tcp_cls_cep(sock->id, TMO_FEVR); tcp_del_rep(sock->id); } else { udp_can_cep(sock->id, TFN_UDP_ALL); udp_del_cep(sock->id); } #else int flag = fcntl(sock->id, F_GETFL, 0); if (0 <= flag) fcntl(sock->id, F_SETFL, flag | O_NONBLOCK); shutdown(sock->id, 2); close(sock->id); #endif sock->id = -1; #endif cg_socket_setaddress(sock, ""); cg_socket_setport(sock, -1); return TRUE; cg_log_debug_l4("Leaving...\n"); }