/** * Common implementation between pcsl_socket_read_start() * and pcsl_socket_read_finish(). */ static int pcsl_socket_read_common( void *handle, unsigned char *pData, int len, int *pBytesRead) { int status; int fd; if (na_get_status(handle) == PCSL_NET_INTERRUPTED) { /* * VMSocket status need not be set to any value at this point * as the VMSocket is deleted and corresponding BSD socket is * also closed after emitting an interrupted IO exception */ return PCSL_NET_INTERRUPTED; } fd = na_get_fd(handle); status = recv(fd, pData, len, 0); lastError = errno; if (SOCKET_ERROR == status) { if (EWOULDBLOCK == errno || EINPROGRESS == errno) { /* * DEBUG: * printf("read_start from : fd :%d\n", fd); */ return PCSL_NET_WOULDBLOCK; } else if (EINTR == errno) { return PCSL_NET_INTERRUPTED; } else { return PCSL_NET_IOERROR; } } if (status == 0) { /* * DEBUG: * printf("Bytes read are 0\n"); */ } /* * DEBUG: * printf("read_finish from : fd :%d\n", fd); */ *pBytesRead = status; return PCSL_NET_SUCCESS; }
/** * Common implementation between pcsl_datagram_read_start() * and pcsl_datagram_read_finish(). */ static int pcsl_datagram_read_common( void *handle, unsigned char *pAddress, int *port, char *buffer, int length, int *pBytesRead) { struct sockaddr_in addr; int len = sizeof(struct sockaddr_in); int status; int fd; if (na_get_status(handle) == PCSL_NET_INTERRUPTED) { /* * VMSocket status need not be set to any value at this point * as the VMSocket is deleted and corresponding BSD socket is * also closed */ return PCSL_NET_INTERRUPTED; } fd = na_get_fd(handle); status = recvfrom(fd, buffer, length, 0, (struct sockaddr*)&addr, (socklen_t *)&len); lastError = errno; if (SOCKET_ERROR == status) { if (EWOULDBLOCK == errno || EINPROGRESS == errno) { /* printf("datagram read_start from : fd :%d\n", fd); */ return PCSL_NET_WOULDBLOCK; } else if (EINTR == errno) { return PCSL_NET_INTERRUPTED; } else { return PCSL_NET_IOERROR; } } memcpy(pAddress, &addr.sin_addr.s_addr, sizeof(pAddress)); //*ipnumber = (long)addr.sin_addr.s_addr; *port = ntohs(addr.sin_port); *pBytesRead = status; return PCSL_NET_SUCCESS; }
/** * Common implementation between pcsl_socket_write_start() * and pcsl_socket_write_finish(). */ static int pcsl_socket_write_common( void *handle, char *pData, int len, int *pBytesWritten) { int status; int fd; if (na_get_status(handle) == PCSL_NET_INTERRUPTED) { /* * VMSocket status need not be set to any value at this point * as the VMSocket is deleted and corresponding BSD socket is * also closed */ return PCSL_NET_INTERRUPTED; } fd = na_get_fd(handle); status = send(fd, pData, len, 0); lastError = errno; if (SOCKET_ERROR == status) { if (EWOULDBLOCK == errno || EINPROGRESS == errno) { /* * DEBUG: * printf("write_start from : fd :%d\n", fd); */ return PCSL_NET_WOULDBLOCK; } else if (EINTR == errno) { return PCSL_NET_INTERRUPTED; } else { return PCSL_NET_IOERROR; } } /* * DEBUG: * printf("writing : %s : to fd :%d\n", pData, fd); * printf("write_finish from : fd :%d\n", fd); */ *pBytesWritten = status; return PCSL_NET_SUCCESS; }
/** * Common implementation between pcsl_datagram_write_start() * and pcsl_datagram_write_finish(). */ static int pcsl_datagram_write_common( void *handle, unsigned char *ipBytes, int port, char *buffer, int length, int *pBytesWritten) { struct sockaddr_in addr; int status; int fd; if (na_get_status(handle) == PCSL_NET_INTERRUPTED) { /* * VMSocket status need not be set to any value at this point * as the VMSocket is deleted and corresponding BSD socket is * also closed */ return PCSL_NET_INTERRUPTED; } fd = na_get_fd(handle); addr.sin_family = AF_INET; addr.sin_port = htons((short)port); memcpy(&addr.sin_addr.s_addr, ipBytes, sizeof(addr.sin_addr.s_addr)); status = sendto(fd, buffer, length, 0, (struct sockaddr*)&addr, sizeof(addr)); lastError = errno; if (SOCKET_ERROR == status) { if (EWOULDBLOCK == errno || EINPROGRESS == errno) { /* printf("write_start from : fd :%d\n", fd); */ return PCSL_NET_WOULDBLOCK; } else if (EINTR == errno) { return PCSL_NET_INTERRUPTED; } else { return PCSL_NET_IOERROR; } } *pBytesWritten = status; return PCSL_NET_SUCCESS; }