Skip to main content
  • Home
  • login
  • Browse the archive

    swh mirror partner logo
swh logo
SoftwareHeritage
Software
Heritage
Mirror
Features
  • Search

  • Downloads

  • Save code now

  • Add forge now

  • Help

Revision a06ec5a26fdb24fd829abef54422d94521ddd14a authored by Matt Caswell on 11 June 2015, 14:13:36 UTC, committed by Matt Caswell on 11 June 2015, 14:13:36 UTC
Prepare for 1.0.0s release
Reviewed-by: Stephen Henson <steve@openssl.org>
1 parent 62bbfe0
  • Files
  • Changes
  • 4cf9d57
  • /
  • demos
  • /
  • tunala
  • /
  • buffer.c
Raw File
Cook and download a directory from the Software Heritage Vault

You have requested the cooking of the directory with identifier None into a standard tar.gz archive.

Are you sure you want to continue ?

Download a directory from the Software Heritage Vault

You have requested the download of the directory with identifier None as a standard tar.gz archive.

Are you sure you want to continue ?

Cook and download a revision from the Software Heritage Vault

You have requested the cooking of the history heading to revision with identifier swh:1:rev:a06ec5a26fdb24fd829abef54422d94521ddd14a into a bare git archive.

Are you sure you want to continue ?

Download a revision from the Software Heritage Vault

You have requested the download of the history heading to revision with identifier swh:1:rev:a06ec5a26fdb24fd829abef54422d94521ddd14a as a bare git archive.

Are you sure you want to continue ?

Invalid Email !

The provided email is not well-formed.

Download link has expired

The requested archive is no longer available for download from the Software Heritage Vault.

Do you want to cook it again ?

Permalinks

To reference or cite the objects present in the Software Heritage archive, permalinks based on SoftWare Hash IDentifiers (SWHIDs) must be used.
Select below a type of object currently browsed in order to display its associated SWHID and permalink.

  • revision
  • content
revision badge
swh:1:rev:a06ec5a26fdb24fd829abef54422d94521ddd14a
content badge Iframe embedding
swh:1:cnt:8e2cc9d200c11b021c180f4b3372aa0020ff9083
buffer.c
#include "tunala.h"

#ifndef NO_BUFFER

void buffer_init(buffer_t * buf)
{
    buf->used = 0;
    buf->total_in = buf->total_out = 0;
}

void buffer_close(buffer_t * buf)
{
    /* Our data is static - nothing needs "release", just reset it */
    buf->used = 0;
}

/* Code these simple ones in compact form */
unsigned int buffer_used(buffer_t * buf)
{
    return buf->used;
}

unsigned int buffer_unused(buffer_t * buf)
{
    return (MAX_DATA_SIZE - buf->used);
}

int buffer_full(buffer_t * buf)
{
    return (buf->used == MAX_DATA_SIZE ? 1 : 0);
}

int buffer_notfull(buffer_t * buf)
{
    return (buf->used < MAX_DATA_SIZE ? 1 : 0);
}

int buffer_empty(buffer_t * buf)
{
    return (buf->used == 0 ? 1 : 0);
}

int buffer_notempty(buffer_t * buf)
{
    return (buf->used > 0 ? 1 : 0);
}

unsigned long buffer_total_in(buffer_t * buf)
{
    return buf->total_in;
}

unsigned long buffer_total_out(buffer_t * buf)
{
    return buf->total_out;
}

/*
 * These 3 static (internal) functions don't adjust the "total" variables as
 * it's not sure when they're called how it should be interpreted. Only the
 * higher-level "buffer_[to|from]_[fd|SSL|BIO]" functions should alter these
 * values.
 */
# if 0                          /* To avoid "unused" warnings */
static unsigned int buffer_adddata(buffer_t * buf, const unsigned char *ptr,
                                   unsigned int size)
{
    unsigned int added = MAX_DATA_SIZE - buf->used;
    if (added > size)
        added = size;
    if (added == 0)
        return 0;
    memcpy(buf->data + buf->used, ptr, added);
    buf->used += added;
    buf->total_in += added;
    return added;
}

static unsigned int buffer_tobuffer(buffer_t * to, buffer_t * from, int cap)
{
    unsigned int moved, tomove = from->used;
    if ((int)tomove > cap)
        tomove = cap;
    if (tomove == 0)
        return 0;
    moved = buffer_adddata(to, from->data, tomove);
    if (moved == 0)
        return 0;
    buffer_takedata(from, NULL, moved);
    return moved;
}
# endif

static unsigned int buffer_takedata(buffer_t * buf, unsigned char *ptr,
                                    unsigned int size)
{
    unsigned int taken = buf->used;
    if (taken > size)
        taken = size;
    if (taken == 0)
        return 0;
    if (ptr)
        memcpy(ptr, buf->data, taken);
    buf->used -= taken;
    /* Do we have to scroll? */
    if (buf->used > 0)
        memmove(buf->data, buf->data + taken, buf->used);
    return taken;
}

# ifndef NO_IP

int buffer_from_fd(buffer_t * buf, int fd)
{
    int toread = buffer_unused(buf);
    if (toread == 0)
        /* Shouldn't be called in this case! */
        abort();
    toread = read(fd, buf->data + buf->used, toread);
    if (toread > 0) {
        buf->used += toread;
        buf->total_in += toread;
    }
    return toread;
}

int buffer_to_fd(buffer_t * buf, int fd)
{
    int towrite = buffer_used(buf);
    if (towrite == 0)
        /* Shouldn't be called in this case! */
        abort();
    towrite = write(fd, buf->data, towrite);
    if (towrite > 0) {
        buffer_takedata(buf, NULL, towrite);
        buf->total_out += towrite;
    }
    return towrite;
}

# endif                         /* !defined(NO_IP) */

# ifndef NO_OPENSSL

static void int_ssl_check(SSL *s, int ret)
{
    int e = SSL_get_error(s, ret);
    switch (e) {
        /*
         * These seem to be harmless and already "dealt with" by our
         * non-blocking environment. NB: "ZERO_RETURN" is the clean "error"
         * indicating a successfully closed SSL tunnel. We let this happen
         * because our IO loop should not appear to have broken on this
         * condition - and outside the IO loop, the "shutdown" state is
         * checked.
         */
    case SSL_ERROR_NONE:
    case SSL_ERROR_WANT_READ:
    case SSL_ERROR_WANT_WRITE:
    case SSL_ERROR_WANT_X509_LOOKUP:
    case SSL_ERROR_ZERO_RETURN:
        return;
        /*
         * These seem to be indications of a genuine error that should result
         * in the SSL tunnel being regarded as "dead".
         */
    case SSL_ERROR_SYSCALL:
    case SSL_ERROR_SSL:
        SSL_set_app_data(s, (char *)1);
        return;
    default:
        break;
    }
    /*
     * For any other errors that (a) exist, and (b) crop up - we need to
     * interpret what to do with them - so "politely inform" the caller that
     * the code needs updating here.
     */
    abort();
}

void buffer_from_SSL(buffer_t * buf, SSL *ssl)
{
    int ret;
    if (!ssl || buffer_full(buf))
        return;
    ret = SSL_read(ssl, buf->data + buf->used, buffer_unused(buf));
    if (ret > 0) {
        buf->used += ret;
        buf->total_in += ret;
    }
    if (ret < 0)
        int_ssl_check(ssl, ret);
}

void buffer_to_SSL(buffer_t * buf, SSL *ssl)
{
    int ret;
    if (!ssl || buffer_empty(buf))
        return;
    ret = SSL_write(ssl, buf->data, buf->used);
    if (ret > 0) {
        buffer_takedata(buf, NULL, ret);
        buf->total_out += ret;
    }
    if (ret < 0)
        int_ssl_check(ssl, ret);
}

void buffer_from_BIO(buffer_t * buf, BIO *bio)
{
    int ret;
    if (!bio || buffer_full(buf))
        return;
    ret = BIO_read(bio, buf->data + buf->used, buffer_unused(buf));
    if (ret > 0) {
        buf->used += ret;
        buf->total_in += ret;
    }
}

void buffer_to_BIO(buffer_t * buf, BIO *bio)
{
    int ret;
    if (!bio || buffer_empty(buf))
        return;
    ret = BIO_write(bio, buf->data, buf->used);
    if (ret > 0) {
        buffer_takedata(buf, NULL, ret);
        buf->total_out += ret;
    }
}

# endif                         /* !defined(NO_OPENSSL) */

#endif                          /* !defined(NO_BUFFER) */
The diff you're trying to view is too large. Only the first 1000 changed files have been loaded.
Showing with 0 additions and 0 deletions (0 / 0 diffs computed)
swh spinner

Computing file changes ...

ENEA — Copyright (C), ENEA. License: GNU AGPLv3+.
Legal notes  ::  JavaScript license information ::  Web API

back to top