|
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 |
}
|