kenchunk.c

最終更新:2009/12/15

kenchunk.c

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: }
Copyright (C) KAKU PROJECT (2009)KAKU PROJECT (2009)