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) |