亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? buffer.c

?? boa 一個簡小的web服務器 資源占用極少
?? C
字號:
/*
 *  Boa, an http server
 *  Copyright (C) 1995 Paul Phillips <paulp@go2net.com>
 *  Some changes Copyright (C) 1999 Jon Nelson <jnelson@boa.org>

 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 1, or (at your option)
 *  any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */

/* $Id: buffer.c,v 1.10.2.2 2002/07/26 03:03:44 jnelson Exp $ */

#include "boa.h"
#include "escape.h"

#define INT_TO_HEX(x) \
    ((((x)-10)>=0)?('A'+((x)-10)):('0'+(x)))

/*
 * Name: req_write
 *
 * Description: Buffers data before sending to client.
 * Returns: -1 for error, otherwise how much is stored
 */

int req_write(request * req, char *msg)
{
    int msg_len;

    msg_len = strlen(msg);

    if (!msg_len || req->status == DEAD)
        return req->buffer_end;

    if (req->buffer_end + msg_len > BUFFER_SIZE) {
        log_error_time();
        fprintf(stderr, "Ran out of Buffer space!\n");
        req->status = DEAD;
        return -1;
    }
    memcpy(req->buffer + req->buffer_end, msg, msg_len);
    req->buffer_end += msg_len;
    return req->buffer_end;
}

void reset_output_buffer(request *req)
{
    req->buffer_end = 0;
}

/*
 * Name: req_write_escape_http
 * Description: Buffers and "escapes" data before sending to client.
 *  as above, but translates as it copies, into a form suitably
 *  encoded for URLs in HTTP headers.
 * Returns: -1 for error, otherwise how much is stored
 */
int req_write_escape_http(request * req, char *msg)
{
    char c, *inp, *dest;
    int left;
    inp = msg;
    dest = req->buffer + req->buffer_end;
    /* 3 is a guard band, since we don't check the destination pointer
     * in the middle of a transfer of up to 3 bytes */
    left = BUFFER_SIZE - req->buffer_end - 3;
    while ((c = *inp++) && left > 0) {
        if (needs_escape((unsigned int) c)) {
            *dest++ = '%';
            *dest++ = INT_TO_HEX(c >> 4);
            *dest++ = INT_TO_HEX(c & 15);
            left -= 3;
        } else {
            *dest++ = c;
            left--;
        }
    }
    req->buffer_end = dest - req->buffer;
    if (left == 0) {
        log_error_time();
        fprintf(stderr, "Ran out of Buffer space!\n");
        req->status = DEAD;
        return -1;
    }
    return req->buffer_end;
}

/*
 * Name: req_write_escape_html
 * Description: Buffers and "escapes" data before sending to client.
 *  as above, but translates as it copies, into a form suitably
 *  encoded for HTML bodies.
 * Returns: -1 for error, otherwise how much is stored
 */
int req_write_escape_html(request * req, char *msg)
{
    char c, *inp, *dest;
    int left;
    inp = msg;
    dest = req->buffer + req->buffer_end;
    /* 5 is a guard band, since we don't check the destination pointer
     * in the middle of a transfer of up to 5 bytes */
    left = BUFFER_SIZE - req->buffer_end - 5;
    while ((c = *inp++) && left > 0) {
        switch (c) {
        case '>':
            *dest++ = '&';
            *dest++ = 'g';
            *dest++ = 't';
            *dest++ = ';';
            left -= 4;
            break;
        case '<':
            *dest++ = '&';
            *dest++ = 'l';
            *dest++ = 't';
            *dest++ = ';';
            left -= 4;
            break;
        case '&':
            *dest++ = '&';
            *dest++ = 'a';
            *dest++ = 'm';
            *dest++ = 'p';
            *dest++ = ';';
            left -= 5;
            break;
        case '\"':
            *dest++ = '&';
            *dest++ = 'q';
            *dest++ = 'u';
            *dest++ = 'o';
            *dest++ = 't';
            *dest++ = ';';
            left -= 6;
            break;
        default:
            *dest++ = c;
            left--;
        }
    }
    req->buffer_end = dest - req->buffer;
    if (left == 0) {
        log_error_time();
        fprintf(stderr, "Ran out of Buffer space!\n");
        req->status = DEAD;
        return -1;
    }
    return req->buffer_end;
}


/*
 * Name: flush_req
 *
 * Description: Sends any backlogged buffer to client.
 *
 * Returns: -2 for error, -1 for blocked, otherwise how much is stored
 */

int req_flush(request * req)
{
    int bytes_to_write;

    bytes_to_write = req->buffer_end - req->buffer_start;
    if (req->status == DEAD)
        return -2;

    if (bytes_to_write) {
        int bytes_written;

        bytes_written = write(req->fd, req->buffer + req->buffer_start,
                              bytes_to_write);

        if (bytes_written < 0) {
            if (errno == EWOULDBLOCK || errno == EAGAIN)
                return -1;      /* request blocked at the pipe level, but keep going */
            else {
                req->buffer_start = req->buffer_end = 0;
                if (errno != EPIPE)
                    perror("buffer flush"); /* OK to disable if your logs get too big */
                req->status = DEAD;
                req->buffer_end = 0;
                return -2;
            }
        }
#ifdef FASCIST_LOGGING
        log_error_time();
        fprintf(stderr, "%s:%d - Wrote \"", __FILE__, __LINE__);
        fwrite(req->buffer + req->buffer_start, sizeof (char),
               bytes_written, stderr);
        fprintf(stderr, "\" (%d bytes)\n", bytes_written);
#endif
        req->buffer_start += bytes_written;
    }
    if (req->buffer_start == req->buffer_end)
        req->buffer_start = req->buffer_end = 0;
    return req->buffer_end;     /* successful */
}

/*
 * Name: escape_string
 *
 * Description: escapes the string inp.  Uses variable buf.  If buf is
 *  NULL when the program starts, it will attempt to dynamically allocate
 *  the space that it needs, otherwise it will assume that the user
 *  has already allocated enough space for the variable buf, which
 *  could be up to 3 times the size of inp.  If the routine dynamically
 *  allocates the space, the user is responsible for freeing it afterwords
 * Returns: NULL on error, pointer to string otherwise.
 * Note: this function doesn't really belong here, I plopped it here to
 *  work around a "bug" in escape.h (it defines a global, so can't be
 *  used in multiple source files).  Actually, this routine shouldn't 
 *  exist anywhere, it's only usage is in get.c's handling of on-the-fly
 *  directory generation, which would be better configured to use a combination
 *  of req_write_escape_http and req_write_escape_html.  That would involve
 *  more work than I'm willing to put in right now, though, so here we are.
 */

char *escape_string(char *inp, char *buf)
{
    int max;
    char *index;
    unsigned char c;

    max = strlen(inp) * 3;

    if (buf == NULL && max)
        buf = malloc(sizeof (char) * max + 1);

    if (buf == NULL) {
        log_error_time();
        perror("malloc");
        return NULL;
    }

    index = buf;
    while ((c = *inp++) && max > 0) {
        if (needs_escape((unsigned int) c)) {
            *index++ = '%';
            *index++ = INT_TO_HEX(c >> 4);
            *index++ = INT_TO_HEX(c & 15);
        } else
            *index++ = c;
    }
    *index = '\0';
    return buf;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
极品少妇一区二区| 国产成人av影院| 亚洲激情欧美激情| 中文字幕字幕中文在线中不卡视频| 精品播放一区二区| 精品久久久久久久人人人人传媒| 91精品国产综合久久精品| 欧美日韩一区高清| 欧美久久久久久久久| 欧美日韩国产精品自在自线| 欧美日韩国产综合一区二区三区| 欧美手机在线视频| 5858s免费视频成人| 日韩欧美的一区| 久久久精品免费观看| 国产精品嫩草影院com| 亚洲精品午夜久久久| 日韩高清在线不卡| 国产一区二区久久| caoporm超碰国产精品| 在线视频一区二区免费| 91精品国产乱| 精品粉嫩aⅴ一区二区三区四区| 国产亚洲欧洲一区高清在线观看| 国产精品色婷婷久久58| 亚洲女爱视频在线| 男女男精品视频网| 国产精品乡下勾搭老头1| 99r精品视频| 欧美一级搡bbbb搡bbbb| 国产女主播一区| 亚洲激情在线激情| 久久草av在线| 99久久精品国产毛片| 欧美一区二区三区四区视频| 国产精品美女久久久久aⅴ国产馆| 亚洲精品日产精品乱码不卡| 蜜桃av一区二区在线观看| 成人三级在线视频| 91精品国产综合久久福利软件 | 色综合天天做天天爱| 欧美一区二区三区免费观看视频| 国产精品免费av| 美腿丝袜亚洲色图| 成人激情图片网| 91精品久久久久久久99蜜桃 | 亚洲精品一线二线三线| 中文字幕一区二区三区精华液| 日本最新不卡在线| 欧美日韩一区二区在线视频| 精品久久久久久久久久久久久久久 | 成人av在线资源| 欧美va天堂va视频va在线| 亚洲激情图片qvod| 成人精品免费看| 精品少妇一区二区| 亚洲国产三级在线| 成人国产精品免费| 久久综合久久综合久久综合| 肉色丝袜一区二区| 色婷婷av一区二区三区之一色屋| 精品对白一区国产伦| 日本不卡一二三| 欧美伊人久久久久久久久影院| 国产精品麻豆99久久久久久| 精品中文字幕一区二区小辣椒| 91精彩视频在线| 亚洲欧美日韩久久| 99精品国产91久久久久久 | 不卡电影免费在线播放一区| 精品999在线播放| 久久国产精品无码网站| 欧美日韩1区2区| 亚洲国产成人av网| 欧美曰成人黄网| 亚洲一级片在线观看| 在线视频综合导航| 一区二区三区欧美久久| 91麻豆成人久久精品二区三区| 国产精品久久久久aaaa樱花| 99re热这里只有精品视频| 中文字幕av免费专区久久| 东方aⅴ免费观看久久av| 久久免费午夜影院| 国产suv精品一区二区6| 国产精品久久久久影院| 91在线观看污| 亚洲午夜免费福利视频| 欧美一区二区三区免费观看视频| 久热成人在线视频| 亚洲精品一区二区三区精华液 | 99视频精品免费视频| 亚洲日本va午夜在线电影| 91黄色激情网站| 天天av天天翘天天综合网| 日韩午夜在线观看视频| 国产精品一区在线观看你懂的| 日本一区二区动态图| 色综合激情五月| 婷婷成人综合网| 精品99一区二区| a亚洲天堂av| 性做久久久久久久免费看| 精品国产一区久久| 99精品国产一区二区三区不卡| 夜夜嗨av一区二区三区中文字幕| 久久久亚洲精品石原莉奈| 亚洲成人手机在线| 日韩欧美电影一区| 99久久精品国产网站| 欧美a级一区二区| 国产日韩欧美不卡| 欧美视频一区二区三区四区| 精品一区二区久久| 亚洲美女少妇撒尿| 精品国产亚洲在线| 色狠狠色狠狠综合| 国产美女精品一区二区三区| 亚洲日本护士毛茸茸| 精品国内片67194| 欧美日韩一级黄| 丁香六月综合激情| 日韩高清电影一区| 国产精品高清亚洲| 精品成人a区在线观看| 欧美调教femdomvk| 成人午夜激情影院| 麻豆精品视频在线| 依依成人综合视频| 欧美激情综合五月色丁香| 欧美日本国产一区| 91首页免费视频| 国产成人在线色| 青青草精品视频| 亚洲一区二区三区三| 中文幕一区二区三区久久蜜桃| 日韩三级精品电影久久久| 欧亚洲嫩模精品一区三区| 国产精品亚洲一区二区三区妖精 | 成人手机电影网| 国产一区啦啦啦在线观看| 日韩综合小视频| 一区二区在线看| 亚洲欧美怡红院| 国产欧美综合在线观看第十页 | 国产电影一区在线| 国内精品在线播放| 精品一区二区影视| 日本亚洲电影天堂| 秋霞午夜av一区二区三区| 亚洲国产欧美日韩另类综合| 国产精品久久久久7777按摩| 日本一区二区三区四区在线视频| 久久综合九色综合欧美就去吻| 26uuu色噜噜精品一区| 欧美一级艳片视频免费观看| 91精品国产欧美一区二区18 | 亚洲一区二区视频在线| 一个色综合av| 亚洲电影中文字幕在线观看| 一区二区在线电影| 一区二区三区四区亚洲| 一区二区不卡在线播放 | 日韩久久久精品| 久久亚洲精品国产精品紫薇| 26uuu另类欧美| 国产欧美视频一区二区| 国产精品视频线看| 亚洲日本青草视频在线怡红院| 亚洲人成亚洲人成在线观看图片 | 丁香激情综合国产| 成av人片一区二区| 色狠狠综合天天综合综合| 欧美日韩精品三区| 91精品在线一区二区| 久久一区二区三区四区| 国产精品美女一区二区三区| 一区二区三区精品视频| 日本中文字幕一区| 国产精品911| 欧洲生活片亚洲生活在线观看| 欧美日韩国产三级| 欧美激情一区三区| 亚洲自拍欧美精品| 久久精品国产久精国产爱| 成人免费三级在线| 91.com视频| 中文字幕国产精品一区二区| 一区二区三区产品免费精品久久75| 亚洲电影一区二区| 国产麻豆精品在线观看| 色综合久久六月婷婷中文字幕| 欧美日韩精品欧美日韩精品一综合| 精品第一国产综合精品aⅴ| 亚洲精品国产视频| 国产精品系列在线观看| 欧美三级三级三级爽爽爽| 国产日产欧美一区| 奇米精品一区二区三区在线观看一 | 欧美成人性福生活免费看|