head 1.6;
access;
symbols
SIO_0_9_3:1.6
SIO_0_9_2:1.5
SIO_0_9_1:1.4
SIO_0_9_0:1.3;
locks; strict;
comment @ * @;
1.6
date 2005.10.03.09.06.11; author rse; state Exp;
branches;
next 1.5;
1.5
date 2003.06.30.10.36.52; author rse; state Exp;
branches;
next 1.4;
1.4
date 2003.06.17.14.01.23; author mlelstv; state Exp;
branches;
next 1.3;
1.3
date 2003.01.06.19.04.56; author rse; state Exp;
branches;
next 1.2;
1.2
date 2002.11.29.13.00.19; author mlelstv; state Exp;
branches;
next 1.1;
1.1
date 2002.11.28.17.45.15; author mlelstv; state Exp;
branches;
next ;
desc
@@
1.6
log
@adjust copyright messages
@
text
@/*
** OSSP sio - Stream I/O
** Copyright (c) 2002-2005 Cable & Wireless
** Copyright (c) 2002-2005 The OSSP Project
** Copyright (c) 2002-2005 Ralf S. Engelschall
**
** This file is part of OSSP sio, a layered stream I/O library
** which can be found at http://www.ossp.org/pkg/lib/sio/.
**
** Permission to use, copy, modify, and distribute this software for
** any purpose with or without fee is hereby granted, provided that
** the above copyright notice and this permission notice appear in all
** copies.
**
** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
** SUCH DAMAGE.
**
** sio_sio.c: OSSP sio to OSSP sio stage
*/
#include
#include
#include
#include
#include "al.h"
#include "sio.h"
#ifndef SIZE_T_MAX
#define SIZE_T_MAX (((((size_t)1 << ((sizeof(size_t) * 8) - 1)) - 1) << 1) + 1)
#endif
typedef struct {
sio_t *upstream;
al_label_t my_data_label;
al_label_t my_eof_label;
al_label_t my_error_label;
al_label_t data_label;
al_label_t eof_label;
al_label_t error_label;
char eof;
} private_t;
/*
* create stage
*
* allocate private instance data
*/
static
sio_rc_t siosio_init(sio_t *sio, void **up)
{
private_t *my;
my = (private_t *)malloc(sizeof(private_t));
if (my == NULL)
return SIO_ERR_MEM;
my->upstream = NULL;
my->my_data_label = NULL;
my->my_error_label = NULL;
my->my_eof_label = NULL;
my->eof = '\0';
sio_label(sio, SIO_LN_DATA, &my->data_label);
sio_label(sio, SIO_LN_ERROR, &my->error_label);
sio_label(sio, SIO_LN_EOF, &my->eof_label);
*up = my;
return SIO_OK;
}
/*
* configure stage
*
* pass two void pointers
*/
static
sio_rc_t siosio_configure(sio_t *sio, void *u, void *obj, void *val)
{
private_t *my = (private_t *)u;
const char *name = (const char *)obj;
if (!strcmp(name, "upstream")) {
my->upstream = (sio_t *)val;
} else if (!strcmp(name, "mydatalabel")) {
my->my_data_label = (al_label_t)val;
} else if (!strcmp(name, "myerrorlabel")) {
my->my_error_label = (al_label_t)val;
} else if (!strcmp(name, "myeoflabel")) {
my->my_eof_label = (al_label_t)val;
} else {
return SIO_ERR_ARG;
}
return SIO_OK;
}
/*
* destroy stage
*/
static
sio_rc_t siosio_cleanup(sio_t *sio, void *u)
{
private_t *my = (private_t *)u;
free(my);
return SIO_OK;
}
static
sio_rc_t siosio_openr(sio_t *sio, al_t *al, void *u)
{
private_t *my = (private_t *)u;
if (my->upstream == NULL)
return SIO_ERR_ARG;
return SIO_OK;
}
static
sio_rc_t siosio_closer(sio_t *sio, al_t *al, void *u)
{
return SIO_OK;
}
static
sio_rc_t siosio_openw(sio_t *sio, al_t *al, void *u)
{
private_t *my = (private_t *)u;
if (my->upstream == NULL)
return SIO_ERR_ARG;
return SIO_OK;
}
static
sio_rc_t siosio_closew(sio_t *sio, al_t *al, void *u)
{
return SIO_OK;
}
static
sio_rc_t siosio_input(sio_t *sio, al_t *al, void *u, sio_rc_t orc)
{
private_t *my = (private_t *)u;
if (al_bytes(al) == 0) {
if (my->my_data_label != NULL) {
sio_input(my->upstream, al, SIZE_T_MAX, my->my_data_label);
if (my->my_data_label != my->data_label)
al_setlabel(al, 0, al_bytes(al),
my->my_data_label, my->data_label);
}
if (my->my_error_label != NULL) {
sio_input(my->upstream, al, SIZE_T_MAX, my->my_error_label);
if (my->my_error_label != my->error_label)
al_setlabel(al, 0, al_bytes(al),
my->my_error_label, my->error_label);
}
if (my->my_eof_label != NULL) {
sio_input(my->upstream, al, SIZE_T_MAX, my->my_eof_label);
if (my->my_eof_label != my->eof_label)
al_setlabel(al, 0, al_bytes(al),
my->my_eof_label, my->eof_label);
}
}
return SIO_SCHED_DOWN;
}
static
sio_rc_t siosio_output(sio_t *sio, al_t *al, void *u, sio_rc_t orc)
{
private_t *my = (private_t *)u;
if (al_bytes(al) > 0) {
if (my->my_data_label != NULL && my->my_data_label != my->data_label)
al_setlabel(al, 0, al_bytes(al),
my->data_label, my->my_data_label);
if (my->my_error_label != NULL && my->my_error_label != my->error_label)
al_setlabel(al, 0, al_bytes(al),
my->error_label, my->my_error_label);
if (my->my_eof_label != NULL && my->my_eof_label != my->eof_label)
al_setlabel(al, 0, al_bytes(al),
my->eof_label, my->my_eof_label);
/* XXX error handling ? */
sio_output(my->upstream, al);
}
return SIO_SCHED_DOWN;
}
sio_module_t sio_module_sio = {
"sio",
siosio_init,
siosio_configure,
siosio_cleanup,
siosio_openr,
siosio_closer,
siosio_openw,
siosio_closew,
siosio_input,
siosio_output,
NULL
};
@
1.5
log
@*) Correctly check the "status" return value of waitpid(3)
in the test suite.
*) Change in the test suite "%08lx" format string to "%d" because the
ts library only has a minimal formatting engine and the argument
is "int" and not "long" anyway.
*) Make sure that sio_{bio,sa,zlib}.c are not empty compilation
units (not allowed in ISO C) even if BIO, SA or ZLIB support is not
activated.
*) Changed SIZE_T_MAX fallback definition to a more portable variant
based on sizeof(size_t) instead of relying on the existance of
(non portable) UINT_MAX.
*) Added GNU autoconf checks for libnsl/libsocket under Solaris.
*) Upgraded to GNU libtool 1.5
@
text
@d3 3
a5 3
** Copyright (c) 2002-2003 Cable & Wireless Deutschland
** Copyright (c) 2002-2003 The OSSP Project
** Copyright (c) 2002-2003 Ralf S. Engelschall
@
1.4
log
@support systems that do not define SIZE_T_MAX
@
text
@a34 3
#ifndef SIZE_T_MAX
#define SIZE_T_MAX UINT_MAX
#endif
d38 4
@
1.3
log
@- consistently use standard OSSP copyright message everywhere
- strip trailing whitespaces
@
text
@d35 3
@
1.2
log
@input/output now gets another parameter where scheduler tells
them from where they methods called by passing the return value
of the previously called stage.
PR:
Submitted by:
Reviewed by:
Approved by:
Obtained from:
@
text
@d1 30
d59 1
a59 1
@
1.1
log
@use another SIO as a sink/source with some preliminary relabeling support.
PR:
Submitted by:
Reviewed by:
Approved by:
Obtained from:
@
text
@d11 3
a13 1
al_label_t label;
d34 5
a38 3
my->upstream = NULL;
my->label = NULL;
my->eof = '\0';
d62 6
a67 2
} else if (!strcmp(name, "label")) {
my->label = (al_label_t)val;
d93 1
a93 2
if (my->upstream == NULL ||
my->label == NULL)
d110 1
a110 2
if (my->upstream == NULL ||
my->label == NULL)
d123 1
a123 1
sio_rc_t siosio_input(sio_t *sio, al_t *al, void *u)
d128 20
a147 6
sio_input(my->upstream, al, SIZE_T_MAX, my->label);
if (al_bytes(al) > 0) {
if (my->label != my->data_label)
al_setlabel(al, 0, al_bytes(al), my->label, my->data_label);
} else
al_append_bytes(al, &my->eof, sizeof(my->eof), my->eof_label);
d154 1
a154 1
sio_rc_t siosio_output(sio_t *sio, al_t *al, void *u)
d159 12
a170 4
/* recolor data */
if (my->label != my->data_label)
al_setlabel(al, 0, al_bytes(al), my->data_label, my->label);
/* send out */
@