Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Postfix/src/global/   (Postfix Mailserver Version 3.11©)  Datei vom 19.11.2021 mit Größe 4 kB image not shown  

Quelle  memcache_proto.c

  Sprache: C
 

/*++
/* NAME
/* memcache_proto 3
/* SUMMARY
/* memcache low-level protocol
/* SYNOPSIS
/* #include <memcache_proto.h>
/*
/* int memcache_get(fp, buf, len)
/* VSTREAM *fp;
/* VSTRING *buf;
/* ssize_t len;
/*
/* int memcache_printf(fp, format, ...)
/* VSTREAM *fp;
/* const char *format;
/*
/* int memcache_vprintf(fp, format, ap)
/* VSTREAM *fp;
/* const char *format;
/* va_list ap;
/*
/* int memcache_fread(fp, buf, len)
/* VSTREAM *fp;
/* VSTRING *buf;
/* ssize_t len;
/*
/* int memcache_fwrite(fp, buf, len)
/* VSTREAM *fp;
/* const char *buf;
/* ssize_t len;
/* DESCRIPTION
/* This module implements the low-level memcache protocol.
/* All functions return -1 on error and 0 on success.
/* SEE ALSO
/* smtp_proto(3) SMTP low-level protocol.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*
/* Wietse Venema
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*--*/


#include <sys_defs.h>

/* Utility library. */

#include <msg.h>
#include <vstream.h>
#include <vstring.h>
#include <vstring_vstream.h>
#include <compat_va_copy.h>

/* Application-specific. */

#include <memcache_proto.h>

#define STR(x) vstring_str(x)
#define LEN(x) VSTRING_LEN(x)

/* memcache_get - read one line from peer */

int     memcache_get(VSTREAM *stream, VSTRING *vp, ssize_t bound)
{
    int     last_char;
    int     next_char;

    last_char = (bound == 0 ? vstring_get(vp, stream) :
   vstring_get_bound(vp, stream, bound));

    switch (last_char) {

 /*
  * Do some repair in the rare case that we stopped reading in the
  * middle of the CRLF record terminator.
 */

    case '\r':
 if ((next_char = VSTREAM_GETC(stream)) == '\n') {
     VSTRING_ADDCH(vp, '\n');
     /* FALLTRHOUGH */
 } else {
     if (next_char != VSTREAM_EOF)
  vstream_ungetc(stream, next_char);

     /*
      * Input too long, or EOF
     */

    default:
     if (msg_verbose)
  msg_info("%s got %s", VSTREAM_PATH(stream),
    LEN(vp) < bound ? "EOF" : "input too long");
     return (-1);
 }

 /*
  * Strip off the record terminator: either CRLF or just bare LF.
 */

    case '\n':
 vstring_truncate(vp, VSTRING_LEN(vp) - 1);
 if (VSTRING_LEN(vp) > 0 && vstring_end(vp)[-1] == '\r')
     vstring_truncate(vp, VSTRING_LEN(vp) - 1);
 VSTRING_TERMINATE(vp);
 if (msg_verbose)
     msg_info("%s got: %s", VSTREAM_PATH(stream), STR(vp));
 return (0);
    }
}

/* memcache_fwrite - write one blob to peer */

int     memcache_fwrite(VSTREAM *stream, const char *cp, ssize_t todo)
{

    /*
     * Sanity check.
     */

    if (todo < 0)
 msg_panic("memcache_fwrite: negative todo %ld", (long) todo);

    /*
     * Do the I/O.
     */

    if (msg_verbose)
 msg_info("%s write: %.*s", VSTREAM_PATH(stream), (int) todo, cp);
    if (vstream_fwrite(stream, cp, todo) != todo
 || vstream_fputs("\r\n", stream) == VSTREAM_EOF)
 return (-1);
    else
 return (0);
}

/* memcache_fread - read one blob from peer */

int     memcache_fread(VSTREAM *stream, VSTRING *buf, ssize_t todo)
{

    /*
     * Sanity check.
     */

    if (todo < 0)
 msg_panic("memcache_fread: negative todo %ld", (long) todo);

    /*
     * Do the I/O.
     */

    if (vstream_fread_buf(stream, buf, todo) != todo
 || VSTREAM_GETC(stream) != '\r'
 || VSTREAM_GETC(stream) != '\n') {
 if (msg_verbose)
     msg_info("%s read: error", VSTREAM_PATH(stream));
 return (-1);
    } else {
 VSTRING_TERMINATE(buf);
 if (msg_verbose)
     msg_info("%s read: %s", VSTREAM_PATH(stream), STR(buf));
 return (0);
    }
}

/* memcache_vprintf - write one line to peer */

int     memcache_vprintf(VSTREAM *stream, const char *fmt, va_list ap)
{

    /*
     * Do the I/O.
     */

    vstream_vfprintf(stream, fmt, ap);
    vstream_fputs("\r\n", stream);
    if (vstream_ferror(stream))
 return (-1);
    else
 return (0);
}

/* memcache_printf - write one line to peer */

int     memcache_printf(VSTREAM *stream, const char *fmt,...)
{
    va_list ap;
    int     ret;

    va_start(ap, fmt);

    if (msg_verbose) {
 VSTRING *buf = vstring_alloc(100);
 va_list ap2;

 VA_COPY(ap2, ap);
 vstring_vsprintf(buf, fmt, ap2);
 va_end(ap2);
 msg_info("%s write: %s", VSTREAM_PATH(stream), STR(buf));
 vstring_free(buf);
    }

    /*
     * Do the I/O.
     */

    ret = memcache_vprintf(stream, fmt, ap);
    va_end(ap);
    return (ret);
}

Messung V0.5 in Prozent
C=74 H=95 G=84

¤ Dauer der Verarbeitung: 0.19 Sekunden  (vorverarbeitet am  2026-08-08) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.