kenchunk.c
最終更新:2009/12/15
001: /* kenchunk.c
002: * チャンク形式のデータの作成
003: * ・引数でコンテンツタイプを指定しているが、あまり意味はない。
004: * ・チャンクサイズはランダム
005: */
006:
007: #define USAGE "Usage: kenchunk <in-filename> <content-type> <out-filename>"
008:
009: #include <stdlib.h>
010: #include <time.h>
011: #include "apr_general.h"
012: #include "apr_file_io.h"
013:
014: #include "apr_strings.h"
015:
016: #include "mystab.h"
017:
018: int apr_my_main (int ac, char **av, apr_file_t * astdin, apr_file_t * astdout, apr_file_t * astderr, apr_pool_t * pool) {
019: apr_status_t rv;
020: char error_buf[256];
021:
022: char *ctype=NULL;
023:
024: apr_file_t *fpin = NULL;
025: apr_file_t *fpout = NULL;
026:
027: char *infilename = NULL;
028: char *outfilename = NULL;
029:
030: if (ac < 4) {
031: apr_file_printf(astderr, "%s", USAGE);
032: goto _ERROR_;
033: }
034:
035: infilename = av[1];
036: ctype = av[2];
037: outfilename = av[3];
038:
039: if (APR_SUCCESS !=
040: (rv = apr_file_open(&fpin, infilename, APR_FOPEN_READ|APR_FOPEN_BINARY, APR_OS_DEFAULT, pool))) {
041: apr_file_printf(astderr, "ERROR: apr_file_open: %s\n", apr_strerror(rv, error_buf, sizeof(error_buf)));
042: goto _ERROR_;
043: }
044:
045: if (APR_SUCCESS !=
046: (rv = apr_file_open(&fpout, outfilename,
047: APR_FOPEN_WRITE|APR_FOPEN_CREATE|APR_FOPEN_TRUNCATE|APR_FOPEN_BINARY, APR_OS_DEFAULT, pool))) {
048: apr_file_printf(astderr, "ERROR: apr_file_open: %s\n", apr_strerror(rv, error_buf, sizeof(error_buf)));
049: goto _ERROR_;
050: }
051:
052: /* ヘッダの書き込み */
053:
054: if (fpout && ctype) {
055: apr_file_printf(fpout, "Transfer-Encoding: chunked\r\n");
056: apr_file_printf(fpout, "Content-Type: %s\r\n\r\n", ctype);
057: }
058:
059: srand((unsigned int)time(0));
060:
061: /* チャンク形式での書き込み */
062:
063: if (fpin && fpout && ctype) {
064: char buf[1024];
065: apr_size_t len = 0;
066: while (APR_EOF != (rv=apr_file_eof(fpin))) {
067: len = (apr_size_t)(rand()%1023);
068: if (APR_SUCCESS != (rv=apr_file_read(fpin, buf, &len))) {
069: if (APR_EOF == rv) {
070: break;
071: }
072: apr_file_printf(astderr, "ERROR: apr_file_read: %s\n", apr_strerror(rv, error_buf, sizeof(error_buf)));
073: goto _ERROR_;
074: }
075:
076: /* チャンクサイズの書き込み */
077: apr_file_printf(fpout, "%x\r\n", len);
078:
079: /* チャンクデータの書き込み */
080: apr_file_write(fpout, buf, &len);
081:
082: /* CRLF の書き込み */
083: apr_file_printf(fpout, "\r\n");
084: }
085:
086: /* ラストチャンクと CRLF の書き込み */
087: apr_file_printf(fpout, "0\r\n\r\n");
088: }
089:
090: if (fpin) {
091: apr_file_close(fpin);
092: fpin = NULL;
093: }
094:
095: if (fpout) {
096: apr_file_close(fpout);
097: fpout = NULL;
098: }
099:
100: apr_file_printf(astdout, "\ndone.\n");
101:
102: return 0; /* 正常終了 */
103:
104: _ERROR_:
105:
106: if (fpin) {
107: apr_file_close(fpin);
108: fpin = NULL;
109: }
110:
111: if (fpout) {
112: apr_file_close(fpout);
113: fpout = NULL;
114: }
115:
116: apr_file_printf(astderr, "\nfailed.\n");
117: return 1; /* 異常終了 */
118: }
![]() | KAKU PROJECT (2009) |