kdechunk.c

最終更新:2009/10/10

kdechunk.c

001: /* kdechunk.c
002:  * チャンク形式データ用デコーダ
003:  */
004: 
005: #define USAGE "Usage: kdechunk <chunk-encoded-filename> <out-filename>"
006: 
007: #include <stdlib.h> /* strtol */
008: 
009: #include "apr_general.h"
010: #include "apr_file_io.h"
011: 
012: #include "apr_strings.h"
013: #include "apr_buckets.h"
014: 
015: #include "mystab.h"
016: #include "mybb.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:   apr_finfo_t finfo;
023: 
024:   apr_file_t *fpin = NULL;
025:   apr_file_t *fpout = NULL;
026:   
027:   char *infilename = NULL;
028:   char *outfilename = NULL;
029: 
030:   apr_bucket_alloc_t *ba = NULL;
031:   apr_bucket_brigade *bb = NULL;
032: 
033:   if (ac < 2) {
034:     apr_file_printf(astderr, "%s\n", USAGE);
035:     goto _ERROR_;
036:   }
037: 
038:   infilename = av[1];
039:   outfilename = av[2];
040: 
041:   ba = apr_bucket_alloc_create(pool);
042:   bb = apr_brigade_create(pool, ba);
043: 
044:   if (APR_SUCCESS != 
045:         (rv = apr_file_open(&fpin, infilename, APR_FOPEN_READ|APR_FOPEN_BINARY, APR_OS_DEFAULT, pool))) {
046:     apr_file_printf(astderr, "ERROR: apr_file_open: %s\n", apr_strerror(rv, error_buf, sizeof(error_buf)));
047:     goto _ERROR_;
048:   }
049: 
050:   if (APR_SUCCESS != (rv = apr_file_info_get(&finfo, APR_FINFO_MIN, fpin))) {
051:     apr_file_printf(astderr, "ERROR: apr_file_info_get: %s\n", apr_strerror(rv, error_buf, sizeof(error_buf)));
052:     goto _ERROR_;
053:   }
054: 
055:   if (APR_SUCCESS != 
056:       (rv = apr_file_open(&fpout, outfilename, 
057:         APR_FOPEN_WRITE|APR_FOPEN_CREATE|APR_FOPEN_TRUNCATE|APR_FOPEN_BINARY, APR_OS_DEFAULT, pool))) {
058:     apr_file_printf(astderr, "ERROR: apr_file_open: %s\n", apr_strerror(rv, error_buf, sizeof(error_buf)));
059:     goto _ERROR_;
060:   }
061: 
062:   /* 入力ファイルをストリームに挿入 */
063: 
064:   if (fpin && bb) {
065:     apr_brigade_insert_file(bb, fpin, 0, finfo.size, pool);
066:   }
067: 
068:   if (bb && ba) {
069: 
070:     apr_bucket_brigade *bb2 = apr_brigade_create(pool, ba);
071: 
072:     /* ヘッダの読み出し。読み出すのみ。 */
073: 
074:     if (read_entity_header_CRLF(bb) == 0) {
075:       apr_file_printf(astderr, "ERROR: read_entity_header_CRLF\n");
076:       goto _ERROR_;
077:     }
078: 
079:     /* チャンク形式のボディをデコード。デコード結果はストリーム bb2 に格納。 */
080: 
081:     if (decode_chunked_body (bb, bb2) < 0) {
082:       apr_file_printf(astderr, "ERROR: decode_chunked_body\n");
083:       goto _ERROR_;
084:     }
085: 
086:     /* デコード結果のストリームをファイルに書き込み。 */
087: 
088:     write_from_bb_to_fp (bb2, fpout);
089:   }
090: 
091:   apr_file_printf(astdout, "\ndone.\n");
092:   
093:   if (bb) {
094:     apr_brigade_destroy(bb);
095:     bb = NULL;
096:   }
097:   
098:   if (ba) {
099:     apr_bucket_alloc_destroy(ba);
100:     ba = NULL;
101:   }
102: 
103:   if (fpin) {
104:     apr_file_close(fpin);
105:     fpin = NULL;
106:   }
107: 
108:   if (fpout) {
109:     apr_file_close(fpout);
110:     fpout = NULL;
111:   }
112: 
113:   return 0; /* 正常終了 */
114:   
115:   _ERROR_:
116: 
117:   if (bb) {
118:     apr_brigade_destroy(bb);
119:     bb = NULL;
120:   }
121:   
122:   if (ba) {
123:     apr_bucket_alloc_destroy(ba);
124:     ba = NULL;
125:   }
126: 
127:   if (fpin) {
128:     apr_file_close(fpin);
129:     fpin = NULL;
130:   }
131: 
132:   if (fpout) {
133:     apr_file_close(fpout);
134:     fpout = NULL;
135:   }
136: 
137:   apr_file_printf(astderr, "\nfailed.\n");
138:   return 1; /* 異常終了 */
139: }
Copyright (C) KAKU PROJECT (2009)KAKU PROJECT (2009)