/* Return a pair of mutually connected sockets in sv[0] and sv[1] */ int socketpair( int af, int type, int protocol, int sv[] ){ struct usock *up0, *up1; if(sv == NULL){ errno = EFAULT; return -1; } if(af != AF_LOCAL){ errno = EAFNOSUPPORT; return -1; } if(type != SOCK_STREAM && type != SOCK_DGRAM){ errno = ESOCKTNOSUPPORT; return -1; } if((sv[0] = socket(af,type,protocol)) == -1) return -1; if((sv[1] = socket(af,type,protocol)) == -1){ close_s(sv[0]); return -1; } up0 = itop(sv[0]); up1 = itop(sv[1]); up0->cb.local->peer = up1; up1->cb.local->peer = up0; return sv[1]; }
int main (void) { int rc; char buf[100] = { 0 }; setup(); sock = socket (AF_INET, SOCK_STREAM, 0); assert (sock >= 0); sock_name.sin_family = AF_INET; sock_name.sin_port = htons (test_port); sock_name.sin_addr.s_addr = htonl (INADDR_LOOPBACK); assert (bind(sock, (struct sockaddr*)&sock_name, sizeof(sock_name)) != -1); sock_name.sin_family = AF_INET; sock_name.sin_port = htons (test_port); sock_name.sin_addr.s_addr = htonl (INADDR_LOOPBACK); assert (connect(sock, (struct sockaddr*)&sock_name, sizeof(sock_name)) != -1); do { rc = sock_select (sock); } while (rc < 0); assert (write_s(sock,"HELO",4) != -1); assert (read_s (sock,buf,sizeof(buf)) != -1); printf ("buf = `%s'\n", buf); assert (write_s(sock,"QUIT",4) != -1); assert (close_s(sock) != -1); sock = -1; return (0); }
/* Close down a socket three ways. Type 0 means "no more receives"; this * replaces the incoming data upcall with a routine that discards further * data. Type 1 means "no more sends", and obviously corresponds to sending * a TCP FIN. Type 2 means "no more receives or sends". This I interpret * as "abort the connection". */ int shutdown( int s, /* Socket index */ int how /* (see above) */ ){ register struct usock *up; struct socklink *sp; if((up = itop(s)) == NULL){ errno = EBADF; return -1; } if(up->cb.p == NULL){ errno = ENOTCONN; return -1; } sp = up->sp; /* Just close the socket if special shutdown routine not present */ if(sp->shut == NULL){ close_s(s); } else if((*sp->shut)(up,how) == -1){ return -1; } ksignal(up,0); return 0; }
void AssertFail (unsigned line) { fprintf (stderr, "\nAssert fail at line %d\n", line); if (sock != -1) close_s (sock); exit (-1); }
int shutdown (int s, int how) { Socket *socket = _socklist_find (s); #if defined(USE_DEBUG) static char fmt[] = "\nshutdown:%d/??"; if (how == SHUT_RD) strcpy (fmt+sizeof(fmt)-3, "r "); else if (how == SHUT_WR) strcpy (fmt+sizeof(fmt)-3, "w "); else if (how == SHUT_RDWR) strcpy (fmt+sizeof(fmt)-3, "rw"); #endif SOCK_PROLOGUE (socket, fmt, s); #if 0 /* if not connected, let close_s() do it */ if (!(socket->so_state & SS_ISCONNECTED)) return close_s (s); #endif switch (how) { case SHUT_RD: socket->so_state |= SS_CANTRCVMORE; socket->so_options &= ~SO_ACCEPTCONN; return (0); case SHUT_WR: socket->so_state |= SS_CANTSENDMORE; socket->so_state &= ~SS_ISLISTENING; socket->so_options &= ~SO_ACCEPTCONN; return (0); // return close_s (s); case SHUT_RDWR: socket->so_state |= SS_CANTRCVMORE; socket->so_state |= SS_CANTSENDMORE; socket->so_state &= ~SS_ISLISTENING; return close_s (s); } SOCK_ERR (EINVAL); return (-1); }
int main (int argc, char **argv) { struct sockaddr_in sa; int rc, i; if (argc != 2) { printf ("Usage: %s num-sockets", argv[0]); return (0); } max_socks = atoi (argv[1]); if (max_socks == 0) { printf ("Usage: %s num-sockets", argv[0]); return (0); } setup(); socks = calloc (max_socks, sizeof(int)); assert (socks != NULL); for (i = 0; i < max_socks; i++) { PROFILE_START ("socket"); socks[i] = socket (AF_INET, SOCK_STREAM, 0); PROFILE_STOP(); if (socks[i] < 0) { perror ("socket"); max_socks = i; break; } } for (i = 0; i < max_socks; i++) { sa.sin_family = AF_INET; sa.sin_port = htons (test_port); sa.sin_addr.s_addr = INADDR_ANY; PROFILE_START ("bind"); rc = bind (socks[i], (struct sockaddr*)&sa, sizeof(sa)); PROFILE_STOP(); if (rc < 0) { perror ("bind"); break; } } for (i = 0; i < max_socks; i++) { PROFILE_START ("close_s"); close_s (socks[i]); PROFILE_STOP(); } free (socks); return (0); }
/* 30Dec2004, Replaces GOTO 'waitmsgtx' label */ static void waitmsgtx (int s) { int index = 20; /* wait for I frame to be ACKed - K5JB/N5KNX */ while (socklen (s,1) > 0 && index--) j2pause(500L); close_s(s); return; }
//--------------------------------------------------------------------------------- // Function Name: snmp_close // Description : Close the input session. Free all data allocated for the session, // dequeue any pending requests, and close socket allocated for the // session. // Return Value : // 1 - otherwise // Calling To : free_request_list // Called By : snmp_open and user //--------------------------------------------------------------------------------- int snmp_close(snmp_session *session) { if (session == NULL) return(0); //------SNMP: Intend to close a null session. // if (session->community != NULL) // free(session->community) ; // if (session->peername != NULL) // free(session->peername); if (session->sfd != NULL) close_s(session->sfd) ; if (session->requests != NULL) free_request_list(session->requests); return 1 ; }
/***************************************************************** * Stream initialization * \return STREAM_OK if success, STREAM_ERROR otherwise */ static int open_s(stream_t *stream,int mode, void* opts, int* file_format) { radio_priv_t* priv; float frequency=0; int i; if (strncmp("radio://",stream->url,8) != 0) return STREAM_UNSUPPORTED; if(mode != STREAM_READ) return STREAM_UNSUPPORTED; priv=calloc(1,sizeof(radio_priv_t)); if (!priv) return STREAM_ERROR; priv->radio_param=opts; #ifdef CONFIG_RADIO_CAPTURE if (priv->radio_param->capture && strncmp("capture",priv->radio_param->capture,7)==0) priv->do_capture=1; else priv->do_capture=0; #endif if (strncmp(priv->radio_param->driver,"default",7)==0) priv->driver=radio_drivers[0]; else priv->driver=NULL; mp_tmsg(MSGT_RADIO,MSGL_V,"[radio] Available drivers: "); for(i=0; radio_drivers[i]; i++) { mp_msg(MSGT_RADIO,MSGL_V,"%s, ",radio_drivers[i]->name); if(strcmp(priv->radio_param->driver,radio_drivers[i]->name)==0) priv->driver=radio_drivers[i]; } mp_msg(MSGT_RADIO,MSGL_V,"\n"); if(priv->driver) mp_msg(MSGT_RADIO, MSGL_INFO, priv->driver->info); else { mp_tmsg(MSGT_RADIO, MSGL_INFO, "[radio] Unknown driver name: %s\n",priv->radio_param->driver); close_s(stream); return STREAM_ERROR; } stream->type = STREAMTYPE_RADIO; /* using rawaudio demuxer */ *file_format = DEMUXER_TYPE_RAWAUDIO; stream->flags = STREAM_READ; priv->radio_fd=-1; stream->start_pos=0; stream->end_pos=0; stream->priv=priv; stream->close=close_s; stream->fill_buffer=fill_buffer_s; priv->radio_fd = open(priv->radio_param->device, O_RDONLY); if (priv->radio_fd < 0) { mp_tmsg(MSGT_RADIO, MSGL_ERR, "[radio] Unable to open '%s': %s\n", priv->radio_param->device, strerror(errno)); close_s(stream); return STREAM_ERROR; } mp_tmsg(MSGT_RADIO, MSGL_V, "[radio] Radio fd: %d, %s\n", priv->radio_fd,priv->radio_param->device); fcntl(priv->radio_fd, F_SETFD, FD_CLOEXEC); get_volume(priv, &priv->old_snd_volume); set_volume(priv,0); if (init_frac(priv)!=STREAM_OK) { close_s(stream); return STREAM_ERROR; }; if (parse_channels(priv,priv->radio_param->freq_channel,&frequency)!=STREAM_OK) { close_s(stream); return STREAM_ERROR; } if ((frequency<priv->rangelow)||(frequency>priv->rangehigh)) { mp_tmsg(MSGT_RADIO, MSGL_ERR, "[radio] Wrong frequency: %.2f\n",frequency); close_s(stream); return STREAM_ERROR; } else mp_tmsg(MSGT_RADIO, MSGL_INFO, "[radio] Using frequency: %.2f.\n",frequency); if(set_frequency(priv,frequency)!=STREAM_OK) { close_s(stream); return STREAM_ERROR; } if (init_audio(priv)!=STREAM_OK) { close_s(stream); return STREAM_ERROR; } #if defined(CONFIG_RADIO_CAPTURE) && defined(CONFIG_STREAM_CACHE) if(priv->do_capture) { //5 second cache if(!stream_enable_cache(stream,5*priv->audio_in.samplerate*priv->audio_in.channels* priv->audio_in.bytes_per_sample,2*priv->audio_in.samplerate*priv->audio_in.channels* priv->audio_in.bytes_per_sample,priv->audio_in.blocksize)) { mp_tmsg(MSGT_RADIO, MSGL_ERR, "[radio] Call to stream_enable_cache failed: %s\n",strerror(errno)); close_s(stream); return STREAM_ERROR; } } #endif set_volume(priv,priv->radio_param->volume); return STREAM_OK; }
void* launch_follow(void* info_void) { Info* info = (Info*) info_void; Serial_com test; char name[10]; clock_t temps; double actu = 0; int* tabWr = malloc(SIZE_MAX_CSV*sizeof(int)); int* tabWu = malloc(SIZE_MAX_CSV*sizeof(int)); int i; #ifdef DEBUG FILE * f; scanf("%s", name); strcat(name, ".csv"); printf("ecriture dans ... %s \n", name); if((f=fopen(name, "w+"))!=NULL) printf("ouverture fichier ok..."); else printf("erreur fichier"); for(i=0; i < SIZE_MAX_CSV; i++) { tabWr[i] = -1; tabWu[i] = -1; } #endif if(open_s(&test, ACM)!=-1) printf("connecté sur le port série\n"); else { printf("problème de connection\n"); pthread_exit(NULL); } while((*info->isEnd == 0) && (info->sizeX == NULL || info->sizeY == NULL)) { usleep(25000); } reset(&test); while(*info->isEnd == 0) { if(*info->reset) { reset(&test); *info->reset = 0; } else { int newX = *info->x; int newY = *info->y; *info->x = -1; *info->y = -1; send_instruction(*info->sizeX, *info->sizeY, &test, newX, newY); #ifdef DEBUG temps =clock(); actu = ((double)temps/CLOCKS_PER_SEC)*100; printf("temps actuel : %2.1f \n", (double)actu); tabWr[(int)actu] = *info->x; tabWu[(int)actu] = *info->y; printf("ajout de %d a %d secondes \n", tabWr[(int)actu], (int)actu); #endif } } #ifdef DEBUG writeInCsv(tabWr,tabWu,f); #endif reset(&test); //fclose(f); close_s(&test) ; pthread_exit(NULL); }
int qse_nwio_init ( qse_nwio_t* nwio, qse_mmgr_t* mmgr, const qse_nwad_t* nwad, int flags, const qse_nwio_tmout_t* tmout) { qse_skad_t addr; qse_sck_len_t addrlen; int family, type, tmp; QSE_MEMSET (nwio, 0, QSE_SIZEOF(*nwio)); nwio->mmgr = mmgr; nwio->flags = flags; nwio->errnum = QSE_NWIO_ENOERR; if (tmout) nwio->tmout = *tmout; else { nwio->tmout.r.sec = -1; nwio->tmout.w.sec = -1; nwio->tmout.c.sec = -1; nwio->tmout.a.sec = -1; } tmp = qse_nwadtoskad (nwad, &addr); if (tmp <= -1) { nwio->errnum = QSE_NWIO_EINVAL; return -1; } addrlen = tmp; #if defined(SOCK_STREAM) && defined(SOCK_DGRAM) if (flags & QSE_NWIO_TCP) type = SOCK_STREAM; else if (flags & QSE_NWIO_UDP) type = SOCK_DGRAM; else #endif { nwio->errnum = QSE_NWIO_EINVAL; return -1; } family = qse_skadfamily (&addr); #if defined(_WIN32) nwio->handle = socket (family, type, 0); if (nwio->handle == INVALID_SOCKET) { nwio->errnum = skerr_to_errnum (WSAGetLastError()); goto oops; } if ((flags & QSE_NWIO_TCP) && (flags & QSE_NWIO_KEEPALIVE)) { int optval = 1; setsockopt (nwio->handle, SOL_SOCKET, SO_KEEPALIVE, (void*)&optval, QSE_SIZEOF(optval)); } if (flags & QSE_NWIO_PASSIVE) { qse_nwio_hnd_t handle; if (flags & QSE_NWIO_REUSEADDR) { int optval = 1; setsockopt (nwio->handle, SOL_SOCKET, SO_REUSEADDR, (void*)&optval, QSE_SIZEOF(optval)); } if (bind (nwio->handle, (struct sockaddr*)&addr, addrlen) == SOCKET_ERROR) { nwio->errnum = skerr_to_errnum (WSAGetLastError()); goto oops; } if (flags & QSE_NWIO_TCP) { if (listen (nwio->handle, 10) == SOCKET_ERROR) { nwio->errnum = skerr_to_errnum (WSAGetLastError()); goto oops; } if (TMOUT_ENABLED(nwio->tmout.a) && wait_for_data (nwio, &nwio->tmout.a, 0) <= -1) goto oops; handle = accept (nwio->handle, (struct sockaddr*)&addr, &addrlen); if (handle == INVALID_SOCKET) { nwio->errnum = skerr_to_errnum (WSAGetLastError()); goto oops; } closesocket (nwio->handle); nwio->handle = handle; } else if (flags & QSE_NWIO_UDP) { nwio->status |= STATUS_UDP_CONNECT; } } else { int xret; if (TMOUT_ENABLED(nwio->tmout.c) && (flags & QSE_NWIO_TCP)) { unsigned long cmd = 1; if (ioctlsocket(nwio->handle, FIONBIO, &cmd) == SOCKET_ERROR) { nwio->errnum = skerr_to_errnum (WSAGetLastError()); goto oops; } } xret = connect (nwio->handle, (struct sockaddr*)&addr, addrlen); if (TMOUT_ENABLED(nwio->tmout.c) && (flags & QSE_NWIO_TCP)) { unsigned long cmd = 0; if ((xret == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK) || ioctlsocket (nwio->handle, FIONBIO, &cmd) == SOCKET_ERROR) { nwio->errnum = skerr_to_errnum (WSAGetLastError()); goto oops; } if (wait_for_data (nwio, &nwio->tmout.c, 1) <= -1) goto oops; else { int xlen; DWORD xerr; xlen = QSE_SIZEOF(xerr); if (getsockopt (nwio->handle, SOL_SOCKET, SO_ERROR, (char*)&xerr, &xlen) == SOCKET_ERROR) { nwio->errnum = skerr_to_errnum (WSAGetLastError()); goto oops; } else if (xerr != 0) { nwio->errnum = skerr_to_errnum (xerr); goto oops; } } } else { if (xret == SOCKET_ERROR) { nwio->errnum = skerr_to_errnum (WSAGetLastError()); goto oops; } } } #elif defined(__OS2__) nwio->handle = socket (family, type, 0); if (nwio->handle <= -1) { nwio->errnum = skerr_to_errnum (sock_errno()); goto oops; } if ((flags & QSE_NWIO_TCP) && (flags & QSE_NWIO_KEEPALIVE)) { int optval = 1; setsockopt (nwio->handle, SOL_SOCKET, SO_KEEPALIVE, (void*)&optval, QSE_SIZEOF(optval)); } if (flags & QSE_NWIO_PASSIVE) { qse_nwio_hnd_t handle; if (flags & QSE_NWIO_REUSEADDR) { int optval = 1; setsockopt (nwio->handle, SOL_SOCKET, SO_REUSEADDR, (void*)&optval, QSE_SIZEOF(optval)); } if (bind (nwio->handle, (struct sockaddr*)&addr, addrlen) <= -1) { nwio->errnum = skerr_to_errnum (sock_errno()); goto oops; } if (flags & QSE_NWIO_TCP) { if (listen (nwio->handle, 10) <= -1) { nwio->errnum = skerr_to_errnum (sock_errno()); goto oops; } if (TMOUT_ENABLED(nwio->tmout.a) && wait_for_data (nwio, &nwio->tmout.a, 0) <= -1) goto oops; handle = accept (nwio->handle, (struct sockaddr*)&addr, &addrlen); if (handle <= -1) { nwio->errnum = skerr_to_errnum (sock_errno()); goto oops; } soclose (nwio->handle); nwio->handle = handle; } else if (flags & QSE_NWIO_UDP) { nwio->status |= STATUS_UDP_CONNECT; } } else { int xret; if (TMOUT_ENABLED(nwio->tmout.c) && (flags & QSE_NWIO_TCP)) { int noblk = 1; if (ioctl (nwio->handle, FIONBIO, (void*)&noblk, QSE_SIZEOF(noblk)) <= -1) { nwio->errnum = skerr_to_errnum (sock_errno()); goto oops; } } xret = connect (nwio->handle, (struct sockaddr*)&addr, addrlen); if (TMOUT_ENABLED(nwio->tmout.c) && (flags & QSE_NWIO_TCP)) { int noblk = 0; if ((xret <= -1 && sock_errno() != SOCEINPROGRESS) || ioctl (nwio->handle, FIONBIO, (void*)&noblk, QSE_SIZEOF(noblk)) <= -1) { nwio->errnum = skerr_to_errnum (sock_errno()); goto oops; } if (wait_for_data (nwio, &nwio->tmout.c, 1) <= -1) goto oops; else { int xlen, xerr; xlen = QSE_SIZEOF(xerr); if (getsockopt (nwio->handle, SOL_SOCKET, SO_ERROR, (char*)&xerr, &xlen) <= -1) { nwio->errnum = skerr_to_errnum (sock_errno()); goto oops; } else if (xerr != 0) { nwio->errnum = skerr_to_errnum (xerr); goto oops; } } } else { if (xret <= -1) { nwio->errnum = skerr_to_errnum (sock_errno()); goto oops; } } } #elif defined(__DOS__) nwio->handle = socket (family, type, 0); if (nwio->handle <= -1) { nwio->errnum = skerr_to_errnum (errno); goto oops; } if ((flags & QSE_NWIO_TCP) && (flags & QSE_NWIO_KEEPALIVE)) { int optval = 1; setsockopt (nwio->handle, SOL_SOCKET, SO_KEEPALIVE, (void*)&optval, QSE_SIZEOF(optval)); } if (flags & QSE_NWIO_PASSIVE) { qse_nwio_hnd_t handle; #if defined(SO_REUSEADDR) if (flags & QSE_NWIO_REUSEADDR) { int optval = 1; setsockopt (nwio->handle, SOL_SOCKET, SO_REUSEADDR, (void*)&optval, QSE_SIZEOF(optval)); } #endif if (bind (nwio->handle, (struct sockaddr*)&addr, addrlen) <= -1) { nwio->errnum = skerr_to_errnum (errno); goto oops; } if (flags & QSE_NWIO_TCP) { if (listen (nwio->handle, 10) <= -1) { nwio->errnum = skerr_to_errnum (errno); goto oops; } if (TMOUT_ENABLED(nwio->tmout.a) && wait_for_data (nwio, &nwio->tmout.a, 0) <= -1) goto oops; handle = accept (nwio->handle, (struct sockaddr*)&addr, &addrlen); if (handle <= -1) { nwio->errnum = skerr_to_errnum (errno); goto oops; } close_s (nwio->handle); nwio->handle = handle; } else if (flags & QSE_NWIO_UDP) { nwio->status |= STATUS_UDP_CONNECT; } } else { int xret; if (TMOUT_ENABLED(nwio->tmout.c) && (flags & QSE_NWIO_TCP)) { int cmd = 1; if (ioctlsocket(nwio->handle, FIONBIO, (char*)&cmd) == SOCKET_ERROR) { nwio->errnum = skerr_to_errnum (errno); goto oops; } } xret = connect (nwio->handle, (struct sockaddr*)&addr, addrlen); if (TMOUT_ENABLED(nwio->tmout.c) && (flags & QSE_NWIO_TCP)) { int cmd = 0; if ((xret == SOCKET_ERROR && errno != EWOULDBLOCK) || ioctlsocket (nwio->handle, FIONBIO, (char*)&cmd) == SOCKET_ERROR) { nwio->errnum = skerr_to_errnum (errno); goto oops; } if (wait_for_data (nwio, &nwio->tmout.c, 1) <= -1) goto oops; else { int xlen, xerr; xlen = QSE_SIZEOF(xerr); if (getsockopt (nwio->handle, SOL_SOCKET, SO_ERROR, (char*)&xerr, &xlen) <= -1) { nwio->errnum = skerr_to_errnum (errno); goto oops; } else if (xerr != 0) { nwio->errnum = skerr_to_errnum (xerr); goto oops; } } } else { if (xret <= -1) { nwio->errnum = skerr_to_errnum (errno); goto oops; } } } #elif defined(USE_TLI) { static const qse_mchar_t* dev_path[2][2] = { { "/dev/tcp", "/dev/inet/tcp" }, { "/dev/udp", "/dev/inet/tcp" } }; int dev_id; if (flags & QSE_NWIO_TCP) dev_id = 0; else { QSE_ASSERT (flags & QSE_NWIO_UDP); dev_id = 1; } nwio->handle = t_open (dev_path[dev_id][0], O_RDWR, QSE_NULL); if (nwio->handle <= -1) { nwio->handle = t_open (dev_path[dev_id][1], O_RDWR, QSE_NULL); if (nwio->handle <= -1) { nwio->errnum = tlierr_to_errnum (t_errno, errno); goto oops; } } if (flags & QSE_NWIO_PASSIVE) { /* TODO: */ nwio->errnum = QSE_NWIO_ENOIMPL; goto oops; } else { struct t_call call; /* for connecting */ struct t_bind req, ret; /* for binding */ qse_skad_t reqaddr, retaddr; qse_nwad_t reqnwad; /* call = t_alloc (nwio->handle, T_CALL, T_ADDR); if (!call) { nwio->errnum = tlierr_to_errnum (t_errno, errno); goto oops; }*/ qse_clearnwad (&reqnwad, nwad->type); qse_nwadtoskad (&reqnwad, &reqaddr); QSE_MEMSET (&ret, 0, QSE_SIZEOF(req)); req.addr.maxlen = addrlen; req.addr.len = addrlen; req.addr.buf = &reqaddr; QSE_MEMSET (&ret, 0, QSE_SIZEOF(ret)); ret.addr.maxlen = addrlen; ret.addr.len = addrlen; ret.addr.buf = &retaddr; if (t_bind (nwio->handle, &req, &ret) <= -1) { nwio->errnum = tlierr_to_errnum (t_errno, errno); goto oops; } /* TODO: should i use t_alloc() and t_free for call, ret, req? */ QSE_MEMSET (&call, 0, QSE_SIZEOF(call)); call.addr.maxlen = addrlen; call.addr.len = addrlen; call.addr.buf = &addr; if (TMOUT_ENABLED(nwio->tmout.c) && (flags & QSE_NWIO_TCP)) { int orgfl; orgfl = fcntl (nwio->handle, F_GETFL, 0); if (orgfl <= -1 || fcntl (nwio->handle, F_SETFL, orgfl | O_NONBLOCK) <= -1) { nwio->errnum = skerr_to_errnum (errno); goto oops; } if (t_connect (nwio->handle, &call, 0) <= -1) { if (t_errno != TNODATA) { nwio->errnum = tlierr_to_errnum (t_errno, errno); goto oops; } /* TODO: this doesn't seem to work wel... REDO THE WORK */ if (wait_for_data (nwio, &nwio->tmout.c, 0) <= -1) goto oops; if (t_rcvconnect (nwio->handle, QSE_NULL) <= -1) { nwio->errnum = tlierr_to_errnum (t_errno, errno); goto oops; } } if (fcntl (nwio->handle, F_SETFL, orgfl) <= -1) { nwio->errnum = skerr_to_errnum (errno); goto oops; } } else { if (t_connect (nwio->handle, &call, 0) <= -1) { nwio->errnum = tlierr_to_errnum (t_errno, errno); goto oops; } } } } #else #if defined(SOCK_CLOEXEC) nwio->handle = socket (family, type | SOCK_CLOEXEC, 0); #else nwio->handle = socket (family, type, 0); #endif if (nwio->handle <= -1) { nwio->errnum = skerr_to_errnum (errno); goto oops; } #if !defined(SOCK_CLOEXEC) && defined(FD_CLOEXEC) { int tmp = fcntl (nwio->handle, F_GETFD); if (tmp >= 0) fcntl (nwio->handle, F_SETFD, tmp | FD_CLOEXEC); } #endif if ((flags & QSE_NWIO_TCP) && (flags & QSE_NWIO_KEEPALIVE)) { int optval = 1; setsockopt (nwio->handle, SOL_SOCKET, SO_KEEPALIVE, (void*)&optval, QSE_SIZEOF(optval)); } if (flags & QSE_NWIO_PASSIVE) { qse_nwio_hnd_t handle; #if defined(SO_REUSEADDR) if (flags & QSE_NWIO_REUSEADDR) { int optval = 1; setsockopt (nwio->handle, SOL_SOCKET, SO_REUSEADDR, (void*)&optval, QSE_SIZEOF(optval)); } #endif if (bind (nwio->handle, (struct sockaddr*)&addr, addrlen) <= -1) { nwio->errnum = skerr_to_errnum (errno); goto oops; } if (flags & QSE_NWIO_TCP) { if (listen (nwio->handle, 10) <= -1) { nwio->errnum = skerr_to_errnum (errno); goto oops; } if (TMOUT_ENABLED(nwio->tmout.a) && wait_for_data (nwio, &nwio->tmout.a, 0) <= -1) goto oops; handle = accept (nwio->handle, (struct sockaddr*)&addr, &addrlen); if (handle <= -1) { nwio->errnum = skerr_to_errnum (errno); goto oops; } qse_closesckhnd (nwio->handle); /* close the listening socket */ nwio->handle = handle; /* set the handle to the accepted socket */ } else if (flags & QSE_NWIO_UDP) { nwio->status |= STATUS_UDP_CONNECT; } } else { int xret; if (TMOUT_ENABLED(nwio->tmout.c) && (flags & QSE_NWIO_TCP)) { int orgfl; orgfl = fcntl (nwio->handle, F_GETFL, 0); if (orgfl <= -1 || fcntl (nwio->handle, F_SETFL, orgfl | O_NONBLOCK) <= -1) { nwio->errnum = skerr_to_errnum (errno); goto oops; } xret = connect (nwio->handle, (struct sockaddr*)&addr, addrlen); if ((xret <= -1 && errno != EINPROGRESS) || fcntl (nwio->handle, F_SETFL, orgfl) <= -1) { nwio->errnum = skerr_to_errnum (errno); goto oops; } if (wait_for_data (nwio, &nwio->tmout.c, 1) <= -1) goto oops; else { qse_sck_len_t xlen; xlen = QSE_SIZEOF(xret); if (getsockopt (nwio->handle, SOL_SOCKET, SO_ERROR, (char*)&xret, &xlen) <= -1) { nwio->errnum = skerr_to_errnum (errno); goto oops; } else if (xret != 0) { nwio->errnum = skerr_to_errnum (xret); goto oops; } } } else { xret = connect (nwio->handle, (struct sockaddr*)&addr, addrlen); if (xret <= -1) { nwio->errnum = skerr_to_errnum (errno); goto oops; } } } #endif if (flags & QSE_NWIO_TEXT) { int topt = 0; if (flags & QSE_NWIO_IGNOREMBWCERR) topt |= QSE_TIO_IGNOREMBWCERR; if (flags & QSE_NWIO_NOAUTOFLUSH) topt |= QSE_TIO_NOAUTOFLUSH; nwio->tio = qse_tio_open (mmgr, QSE_SIZEOF(qse_nwio_t*), topt); if (nwio->tio == QSE_NULL) { nwio->errnum = QSE_NWIO_ENOMEM; goto oops; } /* store the back-reference to nwio in the extension area.*/ *(qse_nwio_t**)QSE_XTN(nwio->tio) = nwio; if (qse_tio_attachin (nwio->tio, socket_input, QSE_NULL, 4096) <= -1 || qse_tio_attachout (nwio->tio, socket_output, QSE_NULL, 4096) <= -1) { if (nwio->errnum == QSE_NWIO_ENOERR) nwio->errnum = tio_errnum_to_nwio_errnum (nwio->tio); goto oops; } }