Пример #1
0
/**
 * 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;
}
Пример #2
0
/**
 * 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;
}
Пример #3
0
/**
 * 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;
}
Пример #4
0
/**
 * 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;
}