Blame src/fc/fsio.c

rpm-build 8fda73
/*
rpm-build 8fda73
 * Copyright 1990 Network Computing Devices
rpm-build 8fda73
 *
rpm-build 8fda73
 * Permission to use, copy, modify, distribute, and sell this software and its
rpm-build 8fda73
 * documentation for any purpose is hereby granted without fee, provided that
rpm-build 8fda73
 * the above copyright notice appear in all copies and that both that
rpm-build 8fda73
 * copyright notice and this permission notice appear in supporting
rpm-build 8fda73
 * documentation, and that the name of Network Computing Devices not be
rpm-build 8fda73
 * used in advertising or publicity pertaining to distribution of the
rpm-build 8fda73
 * software without specific, written prior permission.  Network Computing
rpm-build 8fda73
 * Devices makes no representations about the suitability of this software
rpm-build 8fda73
 * for any purpose.  It is provided "as is" without express or implied
rpm-build 8fda73
 * warranty.
rpm-build 8fda73
 *
rpm-build 8fda73
 * NETWORK COMPUTING DEVICES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
rpm-build 8fda73
 * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
rpm-build 8fda73
 * IN NO EVENT SHALL NETWORK COMPUTING DEVICES BE LIABLE FOR ANY SPECIAL,
rpm-build 8fda73
 * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
rpm-build 8fda73
 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
rpm-build 8fda73
 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
rpm-build 8fda73
 * OR PERFORMANCE OF THIS SOFTWARE.
rpm-build 8fda73
 *
rpm-build 8fda73
 * Author:  	Dave Lemke, Network Computing Devices, Inc
rpm-build 8fda73
 */
rpm-build 8fda73
/*
rpm-build 8fda73
 * font server i/o routines
rpm-build 8fda73
 */
rpm-build 8fda73
rpm-build 8fda73
#ifdef HAVE_CONFIG_H
rpm-build 8fda73
#include <config.h>
rpm-build 8fda73
#endif
rpm-build 8fda73
#include "libxfontint.h"
rpm-build 8fda73
rpm-build 8fda73
#ifdef WIN32
rpm-build 8fda73
#define _WILLWINSOCK_
rpm-build 8fda73
#include	"X11/Xwindows.h"
rpm-build 8fda73
#endif
rpm-build 8fda73
rpm-build 8fda73
#define FONT_t
rpm-build 8fda73
#define TRANS_CLIENT
rpm-build 8fda73
#include 	"X11/Xtrans/Xtrans.h"
rpm-build 8fda73
#include	"X11/Xpoll.h"
rpm-build 8fda73
#include	<X11/fonts/FS.h>
rpm-build 8fda73
#include	<X11/fonts/FSproto.h>
rpm-build 8fda73
#include	<X11/fonts/fontmisc.h>
rpm-build 8fda73
#include	<X11/fonts/fontstruct.h>
rpm-build 8fda73
#include	"fservestr.h"
rpm-build 8fda73
rpm-build 8fda73
#include	<stdio.h>
rpm-build 8fda73
#include	<signal.h>
rpm-build 8fda73
#include	<sys/types.h>
rpm-build 8fda73
#if !defined(WIN32)
rpm-build 8fda73
#ifndef Lynx
rpm-build 8fda73
#include	<sys/socket.h>
rpm-build 8fda73
#else
rpm-build 8fda73
#include	<socket.h>
rpm-build 8fda73
#endif
rpm-build 8fda73
#endif
rpm-build 8fda73
#include	<errno.h>
rpm-build 8fda73
#ifdef WIN32
rpm-build 8fda73
#define EWOULDBLOCK WSAEWOULDBLOCK
rpm-build 8fda73
#undef EINTR
rpm-build 8fda73
#define EINTR WSAEINTR
rpm-build 8fda73
#endif
rpm-build 8fda73
rpm-build 8fda73
rpm-build 8fda73
rpm-build 8fda73
static int  padlength[4] = {0, 3, 2, 1};
rpm-build 8fda73
rpm-build 8fda73
static int
rpm-build 8fda73
_fs_resize (FSBufPtr buf, long size);
rpm-build 8fda73
rpm-build 8fda73
static void
rpm-build 8fda73
_fs_downsize (FSBufPtr buf, long size);
rpm-build 8fda73
rpm-build 8fda73
int
rpm-build 8fda73
_fs_poll_connect (XtransConnInfo trans_conn, int timeout)
rpm-build 8fda73
{
rpm-build 8fda73
    fd_set	    w_mask;
rpm-build 8fda73
    struct timeval  tv;
rpm-build 8fda73
    int		    fs_fd = _FontTransGetConnectionNumber (trans_conn);
rpm-build 8fda73
    int		    ret;
rpm-build 8fda73
rpm-build 8fda73
    do
rpm-build 8fda73
    {
rpm-build 8fda73
	tv.tv_usec = 0;
rpm-build 8fda73
	tv.tv_sec = timeout;
rpm-build 8fda73
	FD_ZERO (&w_mask);
rpm-build 8fda73
	FD_SET (fs_fd, &w_mask);
rpm-build 8fda73
	ret = Select (fs_fd + 1, NULL, &w_mask, NULL, &tv;;
rpm-build 8fda73
    } while (ret < 0 && ECHECK(EINTR));
rpm-build 8fda73
    if (ret == 0)
rpm-build 8fda73
	return FSIO_BLOCK;
rpm-build 8fda73
    if (ret < 0)
rpm-build 8fda73
	return FSIO_ERROR;
rpm-build 8fda73
    return FSIO_READY;
rpm-build 8fda73
}
rpm-build 8fda73
rpm-build 8fda73
XtransConnInfo
rpm-build 8fda73
_fs_connect(char *servername, int *err)
rpm-build 8fda73
{
rpm-build 8fda73
    XtransConnInfo  trans_conn;		/* transport connection object */
rpm-build 8fda73
    int		    ret;
rpm-build 8fda73
    int		    i = 0;
rpm-build 8fda73
    int		    retries = 5;
rpm-build 8fda73
rpm-build 8fda73
    /*
rpm-build 8fda73
     * Open the network connection.
rpm-build 8fda73
     */
rpm-build 8fda73
    if( (trans_conn=_FontTransOpenCOTSClient(servername)) == NULL )
rpm-build 8fda73
    {
rpm-build 8fda73
	*err = FSIO_ERROR;
rpm-build 8fda73
	return 0;
rpm-build 8fda73
    }
rpm-build 8fda73
rpm-build 8fda73
    /*
rpm-build 8fda73
     * Set the connection non-blocking since we use select() to block.
rpm-build 8fda73
     */
rpm-build 8fda73
rpm-build 8fda73
    _FontTransSetOption(trans_conn, TRANS_NONBLOCKING, 1);
rpm-build 8fda73
rpm-build 8fda73
    do {
rpm-build 8fda73
	i = _FontTransConnect(trans_conn,servername);
rpm-build 8fda73
    } while ((i == TRANS_TRY_CONNECT_AGAIN) && (retries-- > 0));
rpm-build 8fda73
rpm-build 8fda73
    if (i < 0)
rpm-build 8fda73
    {
rpm-build 8fda73
	if (i == TRANS_IN_PROGRESS)
rpm-build 8fda73
	    ret = FSIO_BLOCK;
rpm-build 8fda73
	else
rpm-build 8fda73
	    ret = FSIO_ERROR;
rpm-build 8fda73
    }
rpm-build 8fda73
    else
rpm-build 8fda73
	ret = FSIO_READY;
rpm-build 8fda73
rpm-build 8fda73
    if (ret == FSIO_ERROR)
rpm-build 8fda73
    {
rpm-build 8fda73
	_FontTransClose(trans_conn);
rpm-build 8fda73
	trans_conn = 0;
rpm-build 8fda73
    }
rpm-build 8fda73
rpm-build 8fda73
    *err = ret;
rpm-build 8fda73
    return trans_conn;
rpm-build 8fda73
}
rpm-build 8fda73
rpm-build 8fda73
static int
rpm-build 8fda73
_fs_fill (FSFpePtr conn)
rpm-build 8fda73
{
rpm-build 8fda73
    long    avail;
rpm-build 8fda73
    long    bytes_read;
rpm-build 8fda73
    Bool    waited = FALSE;
rpm-build 8fda73
rpm-build 8fda73
    if (_fs_flush (conn) < 0)
rpm-build 8fda73
	return FSIO_ERROR;
rpm-build 8fda73
    /*
rpm-build 8fda73
     * Don't go overboard here; stop reading when we've
rpm-build 8fda73
     * got enough to satisfy the pending request
rpm-build 8fda73
     */
rpm-build 8fda73
    while ((conn->inNeed - (conn->inBuf.insert - conn->inBuf.remove)) > 0)
rpm-build 8fda73
    {
rpm-build 8fda73
	avail = conn->inBuf.size - conn->inBuf.insert;
rpm-build 8fda73
	/*
rpm-build 8fda73
	 * For SVR4 with a unix-domain connection, ETEST() after selecting
rpm-build 8fda73
	 * readable means the server has died.  To do this here, we look for
rpm-build 8fda73
	 * two consecutive reads returning ETEST().
rpm-build 8fda73
	 */
rpm-build 8fda73
	ESET (0);
rpm-build 8fda73
	bytes_read =_FontTransRead(conn->trans_conn,
rpm-build 8fda73
				   conn->inBuf.buf + conn->inBuf.insert,
rpm-build 8fda73
				   avail);
rpm-build 8fda73
	if (bytes_read > 0) {
rpm-build 8fda73
	    conn->inBuf.insert += bytes_read;
rpm-build 8fda73
	    waited = FALSE;
rpm-build 8fda73
	}
rpm-build 8fda73
	else
rpm-build 8fda73
	{
rpm-build 8fda73
	    if (bytes_read == 0 || ETEST ())
rpm-build 8fda73
	    {
rpm-build 8fda73
		if (!waited)
rpm-build 8fda73
		{
rpm-build 8fda73
		    waited = TRUE;
rpm-build 8fda73
		    if (_fs_wait_for_readable (conn, 0) == FSIO_BLOCK)
rpm-build 8fda73
			return FSIO_BLOCK;
rpm-build 8fda73
		    continue;
rpm-build 8fda73
		}
rpm-build 8fda73
	    }
rpm-build 8fda73
	    if (!ECHECK(EINTR))
rpm-build 8fda73
	    {
rpm-build 8fda73
	        _fs_connection_died (conn);
rpm-build 8fda73
	        return FSIO_ERROR;
rpm-build 8fda73
	    }
rpm-build 8fda73
	}
rpm-build 8fda73
    }
rpm-build 8fda73
    return FSIO_READY;
rpm-build 8fda73
}
rpm-build 8fda73
rpm-build 8fda73
/*
rpm-build 8fda73
 * Make space and return whether data have already arrived
rpm-build 8fda73
 */
rpm-build 8fda73
rpm-build 8fda73
int
rpm-build 8fda73
_fs_start_read (FSFpePtr conn, long size, char **buf)
rpm-build 8fda73
{
rpm-build 8fda73
    int	    ret;
rpm-build 8fda73
rpm-build 8fda73
    conn->inNeed = size;
rpm-build 8fda73
    if (fs_inqueued(conn) < size)
rpm-build 8fda73
    {
rpm-build 8fda73
	if (_fs_resize (&conn->inBuf, size) != FSIO_READY)
rpm-build 8fda73
	{
rpm-build 8fda73
	    _fs_connection_died (conn);
rpm-build 8fda73
	    return FSIO_ERROR;
rpm-build 8fda73
	}
rpm-build 8fda73
	ret = _fs_fill (conn);
rpm-build 8fda73
	if (ret == FSIO_ERROR)
rpm-build 8fda73
	    return ret;
rpm-build 8fda73
	if (ret == FSIO_BLOCK || fs_inqueued(conn) < size)
rpm-build 8fda73
	    return FSIO_BLOCK;
rpm-build 8fda73
    }
rpm-build 8fda73
    if (buf)
rpm-build 8fda73
	*buf = conn->inBuf.buf + conn->inBuf.remove;
rpm-build 8fda73
    return FSIO_READY;
rpm-build 8fda73
}
rpm-build 8fda73
rpm-build 8fda73
void
rpm-build 8fda73
_fs_done_read (FSFpePtr conn, long size)
rpm-build 8fda73
{
rpm-build 8fda73
    if (conn->inBuf.insert - conn->inBuf.remove < size)
rpm-build 8fda73
    {
rpm-build 8fda73
#ifdef DEBUG
rpm-build 8fda73
	fprintf (stderr, "_fs_done_read skipping to many bytes\n");
rpm-build 8fda73
#endif
rpm-build 8fda73
	return;
rpm-build 8fda73
    }
rpm-build 8fda73
    conn->inBuf.remove += size;
rpm-build 8fda73
    conn->inNeed -= size;
rpm-build 8fda73
    _fs_downsize (&conn->inBuf, FS_BUF_MAX);
rpm-build 8fda73
}
rpm-build 8fda73
rpm-build 8fda73
long
rpm-build 8fda73
_fs_pad_length (long len)
rpm-build 8fda73
{
rpm-build 8fda73
    return len + padlength[len&3;;
rpm-build 8fda73
}
rpm-build 8fda73
rpm-build 8fda73
int
rpm-build 8fda73
_fs_flush (FSFpePtr conn)
rpm-build 8fda73
{
rpm-build 8fda73
    long    bytes_written;
rpm-build 8fda73
    long    remain;
rpm-build 8fda73
rpm-build 8fda73
    /* XXX - hack.  The right fix is to remember that the font server
rpm-build 8fda73
       has gone away when we first discovered it. */
rpm-build 8fda73
    if (conn->fs_fd < 0)
rpm-build 8fda73
	return FSIO_ERROR;
rpm-build 8fda73
rpm-build 8fda73
    while ((remain = conn->outBuf.insert - conn->outBuf.remove) > 0)
rpm-build 8fda73
    {
rpm-build 8fda73
	bytes_written = _FontTransWrite(conn->trans_conn,
rpm-build 8fda73
					conn->outBuf.buf + conn->outBuf.remove,
rpm-build 8fda73
					(int) remain);
rpm-build 8fda73
	if (bytes_written > 0)
rpm-build 8fda73
	{
rpm-build 8fda73
	    conn->outBuf.remove += bytes_written;
rpm-build 8fda73
	}
rpm-build 8fda73
	else
rpm-build 8fda73
	{
rpm-build 8fda73
	    if (bytes_written == 0 || ETEST ())
rpm-build 8fda73
	    {
rpm-build 8fda73
		conn->brokenWriteTime = GetTimeInMillis () + FS_FLUSH_POLL;
rpm-build 8fda73
		_fs_mark_block (conn, FS_BROKEN_WRITE);
rpm-build 8fda73
		break;
rpm-build 8fda73
	    }
rpm-build 8fda73
	    if (!ECHECK (EINTR))
rpm-build 8fda73
	    {
rpm-build 8fda73
		_fs_connection_died (conn);
rpm-build 8fda73
		return FSIO_ERROR;
rpm-build 8fda73
	    }
rpm-build 8fda73
	}
rpm-build 8fda73
    }
rpm-build 8fda73
    if (conn->outBuf.remove == conn->outBuf.insert)
rpm-build 8fda73
    {
rpm-build 8fda73
	_fs_unmark_block (conn, FS_BROKEN_WRITE|FS_PENDING_WRITE);
rpm-build 8fda73
	if (conn->outBuf.size > FS_BUF_INC)
rpm-build 8fda73
	    conn->outBuf.buf = realloc (conn->outBuf.buf, FS_BUF_INC);
rpm-build 8fda73
	conn->outBuf.remove = conn->outBuf.insert = 0;
rpm-build 8fda73
    }
rpm-build 8fda73
    return FSIO_READY;
rpm-build 8fda73
}
rpm-build 8fda73
rpm-build 8fda73
static int
rpm-build 8fda73
_fs_resize (FSBufPtr buf, long size)
rpm-build 8fda73
{
rpm-build 8fda73
    char    *new;
rpm-build 8fda73
    long    new_size;
rpm-build 8fda73
rpm-build 8fda73
    if (buf->remove)
rpm-build 8fda73
    {
rpm-build 8fda73
	if (buf->remove != buf->insert)
rpm-build 8fda73
	{
rpm-build 8fda73
	    memmove (buf->buf,
rpm-build 8fda73
		     buf->buf + buf->remove,
rpm-build 8fda73
		     buf->insert - buf->remove);
rpm-build 8fda73
	}
rpm-build 8fda73
	buf->insert -= buf->remove;
rpm-build 8fda73
	buf->remove = 0;
rpm-build 8fda73
    }
rpm-build 8fda73
    if (buf->size - buf->remove < size)
rpm-build 8fda73
    {
rpm-build 8fda73
	new_size = ((buf->remove + size + FS_BUF_INC) / FS_BUF_INC) * FS_BUF_INC;
rpm-build 8fda73
	new = realloc (buf->buf, new_size);
rpm-build 8fda73
	if (!new)
rpm-build 8fda73
	    return FSIO_ERROR;
rpm-build 8fda73
	buf->buf = new;
rpm-build 8fda73
	buf->size = new_size;
rpm-build 8fda73
    }
rpm-build 8fda73
    return FSIO_READY;
rpm-build 8fda73
}
rpm-build 8fda73
rpm-build 8fda73
static void
rpm-build 8fda73
_fs_downsize (FSBufPtr buf, long size)
rpm-build 8fda73
{
rpm-build 8fda73
    if (buf->insert == buf->remove)
rpm-build 8fda73
    {
rpm-build 8fda73
	buf->insert = buf->remove = 0;
rpm-build 8fda73
	if (buf->size > size)
rpm-build 8fda73
	{
rpm-build 8fda73
	    buf->buf = realloc (buf->buf, size);
rpm-build 8fda73
	    buf->size = size;
rpm-build 8fda73
	}
rpm-build 8fda73
    }
rpm-build 8fda73
}
rpm-build 8fda73
rpm-build 8fda73
void
rpm-build 8fda73
_fs_io_reinit (FSFpePtr conn)
rpm-build 8fda73
{
rpm-build 8fda73
    conn->outBuf.insert = conn->outBuf.remove = 0;
rpm-build 8fda73
    _fs_downsize (&conn->outBuf, FS_BUF_INC);
rpm-build 8fda73
    conn->inBuf.insert = conn->inBuf.remove = 0;
rpm-build 8fda73
    _fs_downsize (&conn->inBuf, FS_BUF_MAX);
rpm-build 8fda73
}
rpm-build 8fda73
rpm-build 8fda73
Bool
rpm-build 8fda73
_fs_io_init (FSFpePtr conn)
rpm-build 8fda73
{
rpm-build 8fda73
    conn->outBuf.insert = conn->outBuf.remove = 0;
rpm-build 8fda73
    conn->outBuf.buf = malloc (FS_BUF_INC);
rpm-build 8fda73
    if (!conn->outBuf.buf)
rpm-build 8fda73
	return FALSE;
rpm-build 8fda73
    conn->outBuf.size = FS_BUF_INC;
rpm-build 8fda73
rpm-build 8fda73
    conn->inBuf.insert = conn->inBuf.remove = 0;
rpm-build 8fda73
    conn->inBuf.buf = malloc (FS_BUF_INC);
rpm-build 8fda73
    if (!conn->inBuf.buf)
rpm-build 8fda73
    {
rpm-build 8fda73
	free (conn->outBuf.buf);
rpm-build 8fda73
	conn->outBuf.buf = 0;
rpm-build 8fda73
	return FALSE;
rpm-build 8fda73
    }
rpm-build 8fda73
    conn->inBuf.size = FS_BUF_INC;
rpm-build 8fda73
rpm-build 8fda73
    return TRUE;
rpm-build 8fda73
}
rpm-build 8fda73
rpm-build 8fda73
void
rpm-build 8fda73
_fs_io_fini (FSFpePtr conn)
rpm-build 8fda73
{
rpm-build 8fda73
    if (conn->outBuf.buf)
rpm-build 8fda73
	free (conn->outBuf.buf);
rpm-build 8fda73
    if (conn->inBuf.buf)
rpm-build 8fda73
	free (conn->inBuf.buf);
rpm-build 8fda73
}
rpm-build 8fda73
rpm-build 8fda73
static int
rpm-build 8fda73
_fs_do_write(FSFpePtr conn, const char *data, long len, long size)
rpm-build 8fda73
{
rpm-build 8fda73
    if (size == 0) {
rpm-build 8fda73
#ifdef DEBUG
rpm-build 8fda73
	fprintf(stderr, "tried to write 0 bytes \n");
rpm-build 8fda73
#endif
rpm-build 8fda73
	return FSIO_READY;
rpm-build 8fda73
    }
rpm-build 8fda73
rpm-build 8fda73
    if (conn->fs_fd == -1)
rpm-build 8fda73
	return FSIO_ERROR;
rpm-build 8fda73
rpm-build 8fda73
    while (conn->outBuf.insert + size > conn->outBuf.size)
rpm-build 8fda73
    {
rpm-build 8fda73
	if (_fs_flush (conn) < 0)
rpm-build 8fda73
	    return FSIO_ERROR;
rpm-build 8fda73
	if (_fs_resize (&conn->outBuf, size) < 0)
rpm-build 8fda73
	{
rpm-build 8fda73
	    _fs_connection_died (conn);
rpm-build 8fda73
	    return FSIO_ERROR;
rpm-build 8fda73
	}
rpm-build 8fda73
    }
rpm-build 8fda73
    memcpy (conn->outBuf.buf + conn->outBuf.insert, data, len);
rpm-build 8fda73
    /* Clear pad data */
rpm-build 8fda73
    memset (conn->outBuf.buf + conn->outBuf.insert + len, 0, size - len);
rpm-build 8fda73
    conn->outBuf.insert += size;
rpm-build 8fda73
    _fs_mark_block (conn, FS_PENDING_WRITE);
rpm-build 8fda73
    return FSIO_READY;
rpm-build 8fda73
}
rpm-build 8fda73
rpm-build 8fda73
/*
rpm-build 8fda73
 * Write the indicated bytes
rpm-build 8fda73
 */
rpm-build 8fda73
int
rpm-build 8fda73
_fs_write (FSFpePtr conn, const char *data, long len)
rpm-build 8fda73
{
rpm-build 8fda73
    return _fs_do_write (conn, data, len, len);
rpm-build 8fda73
}
rpm-build 8fda73
rpm-build 8fda73
/*
rpm-build 8fda73
 * Write the indicated bytes adding any appropriate pad
rpm-build 8fda73
 */
rpm-build 8fda73
int
rpm-build 8fda73
_fs_write_pad(FSFpePtr conn, const char *data, long len)
rpm-build 8fda73
{
rpm-build 8fda73
    return _fs_do_write (conn, data, len, len + padlength[len & 3]);
rpm-build 8fda73
}
rpm-build 8fda73
rpm-build 8fda73
int
rpm-build 8fda73
_fs_wait_for_readable(FSFpePtr conn, int ms)
rpm-build 8fda73
{
rpm-build 8fda73
    fd_set	r_mask;
rpm-build 8fda73
    fd_set	e_mask;
rpm-build 8fda73
    int         result;
rpm-build 8fda73
    struct timeval  tv;
rpm-build 8fda73
rpm-build 8fda73
    for (;;) {
rpm-build 8fda73
	if (conn->fs_fd < 0)
rpm-build 8fda73
	    return FSIO_ERROR;
rpm-build 8fda73
	FD_ZERO(&r_mask);
rpm-build 8fda73
	FD_ZERO(&e_mask);
rpm-build 8fda73
	tv.tv_sec = ms / 1000;
rpm-build 8fda73
	tv.tv_usec = (ms % 1000) * 1000;
rpm-build 8fda73
	FD_SET(conn->fs_fd, &r_mask);
rpm-build 8fda73
	FD_SET(conn->fs_fd, &e_mask);
rpm-build 8fda73
	result = Select(conn->fs_fd + 1, &r_mask, NULL, &e_mask, &tv;;
rpm-build 8fda73
	if (result < 0)
rpm-build 8fda73
	{
rpm-build 8fda73
	    if (ECHECK(EINTR) || ECHECK(EAGAIN))
rpm-build 8fda73
		continue;
rpm-build 8fda73
	    else
rpm-build 8fda73
		return FSIO_ERROR;
rpm-build 8fda73
	}
rpm-build 8fda73
	if (result == 0)
rpm-build 8fda73
	    return FSIO_BLOCK;
rpm-build 8fda73
	if (FD_ISSET(conn->fs_fd, &r_mask))
rpm-build 8fda73
	    return FSIO_READY;
rpm-build 8fda73
	return FSIO_ERROR;
rpm-build 8fda73
    }
rpm-build 8fda73
}