OSSP CVS Repository

ossp - ossp-pkg/sio/sio_test2.c
Not logged in
[Honeypot]  [Browse]  [Directory]  [Home]  [Login
[Reports]  [Search]  [Ticket]  [Timeline
  [Raw

ossp-pkg/sio/sio_test2.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/file.h>
#include <unistd.h>

#include "al.h"
#include "sio.h"

static char oddlabel, evenlabel;
#define ODDLABEL  ((al_label_t)&oddlabel)
#define EVENLABEL ((al_label_t)&evenlabel)

extern sio_module_t sio_module_fd;
extern sio_module_t sio_module_zlib;
extern sio_module_t sio_module_buffer;
extern sio_module_t sio_module_sio;
extern sio_module_t sio_module_sillymux;

#define e(f) rc = f; printf("%s = %s\n",#f, sio_error(rc)); fflush(stdout);
#define s(f) src = f; printf("%s = %s\n",#f, sa_error(src)); fflush(stdout);

int main(int argc, char *argv[])
{
    int fd;
    sio_rc_t rc;

    sio_t *sio;
    sio_stage_t *sios_fd, *sios_buffer, *sios_zlib;
    sio_stage_t *sios_sillymux;

    sio_t *sio2a;
    sio_stage_t *sios2a_sio;

    sio_t *sio2b;
    sio_stage_t *sios2b_sio;

    al_label_t label;

    char buf[513];
    size_t buflen;
    int level;
    size_t actual;

#ifdef WRITE
    fd = open("output", O_WRONLY|O_TRUNC|O_CREAT, 0666);

    {
        int i;
        for (i=0; i<sizeof(buf)-16; i += 16)
            sprintf(buf+i,"Hello world %03.3d\n",i);
        buf[i] = '\0';
    }

#else
    fd = open("output", O_RDONLY);
#endif

    e(sio_create(&sio));
    e(sio_create_stage(sio, &sio_module_fd, &sios_fd));
    e(sio_create_stage(sio, &sio_module_zlib, &sios_zlib));
    e(sio_create_stage(sio, &sio_module_buffer, &sios_buffer));
    e(sio_create_stage(sio, &sio_module_sillymux, &sios_sillymux));

    e(sio_configure_stage(sio, sios_fd, "fd", &fd));
    buflen = 512;
    e(sio_configure_stage(sio, sios_fd, "buflen", &buflen));

    buflen = 200;
    e(sio_configure_stage(sio, sios_buffer, "outputsize", &buflen));
    e(sio_configure_stage(sio, sios_buffer, "inputsize", &buflen));

    buflen = 200;
    e(sio_configure_stage(sio, sios_zlib, "outputsize", &buflen));
    e(sio_configure_stage(sio, sios_zlib, "inputsize", &buflen));
    level = 0;
    e(sio_configure_stage(sio, sios_zlib, "outputlevel", &level));
    level = -1;
    e(sio_configure_stage(sio, sios_zlib, "inputlevel", &level));

    e(sio_configure_stage(sio, sios_sillymux, "oddlabel", ODDLABEL));
    e(sio_configure_stage(sio, sios_sillymux, "evenlabel", EVENLABEL));

    e(sio_create(&sio2a));
    e(sio_create_stage(sio2a, &sio_module_sio, &sios2a_sio));
    e(sio_configure_stage(sio2a, sios2a_sio, "upstream", sio));
    e(sio_configure_stage(sio2a, sios2a_sio, "mydatalabel", ODDLABEL));
    e(sio_attach(sio2a, sios2a_sio, SIO_MODE_READWRITE));

    e(sio_create(&sio2b));
    e(sio_create_stage(sio2b, &sio_module_sio, &sios2b_sio));
    e(sio_configure_stage(sio2b, sios2b_sio, "upstream", sio));
    e(sio_configure_stage(sio2b, sios2b_sio, "mydatalabel", EVENLABEL));
    e(sio_attach(sio2b, sios2b_sio, SIO_MODE_READWRITE));


    {
        e(sio_attach(sio, sios_fd, SIO_MODE_READWRITE));
        e(sio_attach(sio, sios_zlib, SIO_MODE_READWRITE));
        e(sio_attach(sio, sios_buffer, SIO_MODE_READWRITE));
        e(sio_attach(sio, sios_sillymux, SIO_MODE_READWRITE));

#ifdef WRITE
        e(sio_write(sio2, buf, strlen(buf), &actual));
        e(sio_push(sio2));
#else
        do {

            printf("READ A\n");
            actual = 0;
            e(sio_read(sio2a, buf, sizeof(buf), &actual));
            printf("actual_a = %d\n",actual);
            fwrite(buf, actual, 1, stdout);
            printf("\n");

            printf("READ B\n");
            actual = 0;
            e(sio_read(sio2b, buf, sizeof(buf), &actual));
            printf("actual_b = %d\n",actual);
            fwrite(buf, actual, 1, stdout);
            printf("\n");

            printf("READ MUX\n");
            actual = 0;
            e(sio_read(sio, buf, sizeof(buf), &actual));
            printf("actual = %d\n",actual);
            fwrite(buf, actual, 1, stdout);
            printf("\n");

        } while (sio_flag(sio, SIO_FLAG_EOF) == SIO_FALSE);
#endif

        e(sio_detach(sio, sios_sillymux));
        e(sio_detach(sio, sios_buffer));
        e(sio_detach(sio, sios_zlib));
        e(sio_detach(sio, sios_fd));
    }

    e(sio_detach(sio2b, sios2b_sio));
    e(sio_destroy_stage(sio2b, sios2b_sio));
    e(sio_destroy(sio2b));

    e(sio_detach(sio2a, sios2a_sio));
    e(sio_destroy_stage(sio2a, sios2a_sio));
    e(sio_destroy(sio2a));

    e(sio_destroy_stage(sio, sios_buffer));
    e(sio_destroy_stage(sio, sios_zlib));
    e(sio_destroy_stage(sio, sios_fd));
    e(sio_destroy(sio));

    close(fd);

    return 0;
}

CVSTrac 2.0.1