9
0
Fork 0

Unix domain: More fixes. With these changes, apps/examples/ustream works

This commit is contained in:
Gregory Nutt 2015-01-28 08:39:48 -06:00
parent 94cc8d6362
commit 0c2fbe6e8f
9 changed files with 39 additions and 27 deletions

View File

@ -103,7 +103,7 @@ int client_main(int argc, char *argv[])
strncpy(myaddr.sun_path, CONFIG_EXAMPLES_USTREAM_ADDR, addrlen); strncpy(myaddr.sun_path, CONFIG_EXAMPLES_USTREAM_ADDR, addrlen);
myaddr.sun_path[addrlen] = '\0'; myaddr.sun_path[addrlen] = '\0';
printf("client: Connecting...\n"); printf("client: Connecting to %s...\n", CONFIG_EXAMPLES_USTREAM_ADDR);
addrlen += sizeof(sa_family_t) + 1; addrlen += sizeof(sa_family_t) + 1;
ret = connect( sockfd, (struct sockaddr *)&myaddr, addrlen); ret = connect( sockfd, (struct sockaddr *)&myaddr, addrlen);
if (ret < 0) if (ret < 0)
@ -176,6 +176,7 @@ int client_main(int argc, char *argv[])
goto errout_with_socket; goto errout_with_socket;
} }
printf("client: Terminating\n");
close(sockfd); close(sockfd);
free(outbuf); free(outbuf);
free(inbuf); free(inbuf);

View File

@ -113,6 +113,8 @@ int server_main(int argc, char *argv[])
/* Listen for connections on the bound socket */ /* Listen for connections on the bound socket */
printf("server: Accepting connections on %s ...\n", CONFIG_EXAMPLES_USTREAM_ADDR);
if (listen(listensd, 5) < 0) if (listen(listensd, 5) < 0)
{ {
printf("server: listen failure %d\n", errno); printf("server: listen failure %d\n", errno);
@ -121,7 +123,6 @@ int server_main(int argc, char *argv[])
/* Accept only one connection */ /* Accept only one connection */
printf("server: Accepting connections on %s\n", CONFIG_EXAMPLES_USTREAM_ADDR);
acceptsd = accept(listensd, (struct sockaddr*)&myaddr, &addrlen); acceptsd = accept(listensd, (struct sockaddr*)&myaddr, &addrlen);
if (acceptsd < 0) if (acceptsd < 0)
{ {
@ -187,14 +188,7 @@ int server_main(int argc, char *argv[])
} }
printf("server: Sent %d bytes\n", nbytessent); printf("server: Sent %d bytes\n", nbytessent);
printf("server: Terminating\n");
/* If this platform only does abortive disconnects, then wait a bit to get the
* client side a change to receive the data.
*/
printf("server: Wait before closing\n");
sleep(60);
close(listensd); close(listensd);
close(acceptsd); close(acceptsd);
free(buffer); free(buffer);

View File

@ -26,10 +26,14 @@ nanosleep NXnanosleep
pthread_create NXpthread_create pthread_create NXpthread_create
read NXread read NXread
realloc NXrealloc realloc NXrealloc
recv NXrecv
recvfrom NXrecvfrom
rewinddir NXrewinddir rewinddir NXrewinddir
rmdir NXrmdir rmdir NXrmdir
seekdir NXseekdir seekdir NXseekdir
select NXselect select NXselect
send NXsend
sendto NXsendto
sleep NXsleep sleep NXsleep
socket NXsocket socket NXsocket
stat NXstat stat NXstat

View File

@ -176,7 +176,7 @@ int inline local_stream_connect(FAR struct local_conn_s *client,
/* Yes.. open the read-only FIFO */ /* Yes.. open the read-only FIFO */
ret = local_open_client_tx(client); ret = local_open_client_rx(client);
if (ret < 0) if (ret < 0)
{ {
ndbg("ERROR: Failed to open write-only FIFOs for %s: %d\n", ndbg("ERROR: Failed to open write-only FIFOs for %s: %d\n",
@ -268,21 +268,27 @@ int local_connect(FAR struct local_conn_s *client,
{ {
if (strncmp(conn->lc_path, unaddr->sun_path, UNIX_PATH_MAX-1) == 0) if (strncmp(conn->lc_path, unaddr->sun_path, UNIX_PATH_MAX-1) == 0)
{ {
int ret = OK;
/* Bind the address and protocol */ /* Bind the address and protocol */
client->lc_proto = conn->lc_proto; client->lc_proto = conn->lc_proto;
strncpy(client->lc_path, unaddr->sun_path, UNIX_PATH_MAX-1); strncpy(client->lc_path, unaddr->sun_path, UNIX_PATH_MAX-1);
client->lc_path[UNIX_PATH_MAX-1] = '\0'; client->lc_path[UNIX_PATH_MAX-1] = '\0';
/* The client is now bound to an address */
client->lc_state = LOCAL_STATE_BOUND;
/* We have to do more for the SOCK_STREAM family */ /* We have to do more for the SOCK_STREAM family */
if (conn->lc_proto == SOCK_STREAM) if (conn->lc_proto == SOCK_STREAM)
{ {
return local_stream_connect(client, conn, state); ret = local_stream_connect(client, conn, state);
} }
net_unlock(state); net_unlock(state);
return OK; return ret;
} }
} }
break; break;

View File

@ -237,8 +237,8 @@ static inline int local_rx_open(FAR struct local_conn_s *conn,
static inline int local_tx_open(FAR struct local_conn_s *conn, static inline int local_tx_open(FAR struct local_conn_s *conn,
FAR const char *path) FAR const char *path)
{ {
conn->lc_infd = open(path, O_WRONLY); conn->lc_outfd = open(path, O_WRONLY);
if (conn->lc_infd < 0) if (conn->lc_outfd < 0)
{ {
int errcode = errno; int errcode = errno;
DEBUGASSERT(errcode > 0); DEBUGASSERT(errcode > 0);

View File

@ -179,7 +179,7 @@ ssize_t psock_local_recvfrom(FAR struct socket *psock, FAR void *buf,
* the size of the next packet. * the size of the next packet.
*/ */
ret = local_sync(conn->lc_infd); ret = local_sync(conn->lc_infd);
if (ret < 0) if (ret < 0)
{ {
ndbg("ERROR: Failed to get packet length: %d\n", ret); ndbg("ERROR: Failed to get packet length: %d\n", ret);

View File

@ -76,16 +76,16 @@
int local_fifo_read(int fd, FAR uint8_t *buf, size_t *len) int local_fifo_read(int fd, FAR uint8_t *buf, size_t *len)
{ {
ssize_t total; ssize_t remaining;
ssize_t nread; ssize_t nread;
int ret; int ret;
DEBUGASSERT(buf && len); DEBUGASSERT(buf && len);
total = 0; remaining = *len;
while (len > 0) while (remaining > 0)
{ {
nread = read(fd, buf, *len); nread = read(fd, buf, remaining);
if (nread < 0) if (nread < 0)
{ {
int errcode = errno; int errcode = errno;
@ -112,15 +112,15 @@ int local_fifo_read(int fd, FAR uint8_t *buf, size_t *len)
else else
{ {
DEBUGASSERT(nread <= len); DEBUGASSERT(nread <= len);
len -= nread; remaining -= nread;
buf += nread; buf += nread;
} }
} }
ret = OK; ret = OK;
errout: errout:
*len = total; *len -= remaining;
return ret; return ret;
} }

View File

@ -76,6 +76,7 @@ ssize_t psock_local_send(FAR struct socket *psock, FAR const void *buf,
size_t len, int flags) size_t len, int flags)
{ {
FAR struct local_conn_s *peer; FAR struct local_conn_s *peer;
int ret;
DEBUGASSERT(psock && psock->s_conn && buf); DEBUGASSERT(psock && psock->s_conn && buf);
peer = (FAR struct local_conn_s *)psock->s_conn; peer = (FAR struct local_conn_s *)psock->s_conn;
@ -84,14 +85,20 @@ ssize_t psock_local_send(FAR struct socket *psock, FAR const void *buf,
* outgoing FIFO for write-only access. * outgoing FIFO for write-only access.
*/ */
if (peer->lc_type != LOCAL_STATE_CONNECTED || if (peer->lc_state != LOCAL_STATE_CONNECTED ||
peer->lc_outfd < 0) peer->lc_outfd < 0)
{ {
ndbg("ERROR: not connected\n"); ndbg("ERROR: not connected\n");
return -ENOTCONN; return -ENOTCONN;
} }
return local_send_packet(peer->lc_outfd, (FAR uint8_t *)buf, len); /* Send the packet */
ret = local_send_packet(peer->lc_outfd, (FAR uint8_t *)buf, len);
/* If the send was successful, then the full packet will have been sent */
return ret < 0 ? ret : len;
} }
#endif /* CONFIG_NET && CONFIG_NET_LOCAL */ #endif /* CONFIG_NET && CONFIG_NET_LOCAL */

View File

@ -38,7 +38,7 @@
****************************************************************************/ ****************************************************************************/
#include <nuttx/config.h> #include <nuttx/config.h>
#if defined(CONFIG_NET) && defined(CONFIG_NET_TCP) #if defined(CONFIG_NET_TCP) || defined(CONFIG_NET_LOCAL)
#include <sys/types.h> #include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
@ -243,4 +243,4 @@ ssize_t send(int sockfd, FAR const void *buf, size_t len, int flags)
return psock_send(sockfd_socket(sockfd), buf, len, flags); return psock_send(sockfd_socket(sockfd), buf, len, flags);
} }
#endif /* CONFIG_NET && CONFIG_NET_TCP */ #endif /* CONFIG_NET_TCP || CONFIG_NET_LOCAL */