myio_bio.c
最終更新:2009/11/9
001: /*
002: * ストリームの抽象化の試み
003: * ・BIO へのラッパー
004: */
005:
006: #include <stdio.h>
007: #include <string.h>
008: #include "openssl/bio.h"
009: #include "myio_bio.h"
010:
011: #define MYIO_METHOD_NAME_BIO "_BIO_"
012:
013: typedef struct myio_bio_ctx_st {
014: BIO *bio;
015: } myio_bio_ctx;
016:
017: /*
018: * size バイト分のデータを読み出す関数。
019: * 返り値は buf に読み出したバイト数。
020: * エラー時には -1 が返る。
021: */
022:
023: int myio_read_bio (
024: MYIO *in
025: , char *buf
026: , int size
027: ) {
028: myio_bio_ctx *ctx = (myio_bio_ctx*)(in->ptr);
029: if (! ctx->bio) {
030: return -1;
031: }
032: return BIO_read(ctx->bio, buf, size);
033: }
034:
035: /*
036: * buf に格納された size バイト分のデータを書き込む関数。
037: * 返り値は書き出したバイト数。
038: * エラー時には -1 が返る。
039: */
040:
041: int myio_write_bio (
042: MYIO *out
043: , const char *buf
044: , int size
045: ) {
046: myio_bio_ctx *ctx = (myio_bio_ctx*)(out->ptr);
047: if (!ctx || ! ctx->bio) {
048: return -1;
049: }
050: return BIO_write(ctx->bio, buf, size);
051: }
052:
053: /* BIO ストリームで必ず puts/gets メソッドが実装されているとは限らない */
054: #if 0
055: /*
056: * 文字列 str (ヌル文字で終端されたデータ)を書き込む関数。
057: * 返り値は書き出した文字列の長さ。
058: * エラー時には -1 が返る。
059: */
060:
061: int myio_puts_bio (
062: MYIO *out
063: , const char *str
064: ) {
065: myio_bio_ctx *ctx = (myio_bio_ctx*)(out->ptr);
066: if (!ctx || ! ctx->bio) {
067: return -1;
068: }
069: return BIO_puts(ctx->bio, str);
070: }
071:
072: /*
073: * size-1 バイトまでの文字列をストリームから読み出し、buf に保存する。
074: * EOF または LF を読み込んだところで停止する。
075: * LF または CRLF は '\0' に書き換えられる。
076: * 返り値は最後のヌル文字を含まない読み出した文字列の長さ。
077: * エラー時には -1 が返る。
078: */
079: int myio_gets_bio (
080: MYIO *in
081: , char *buf
082: , int size
083: ) {
084: myio_bio_ctx *ctx = (myio_bio_ctx*)(in->ptr);
085: if (! ctx->bio) {
086: return -1;
087: }
088: if (BIO_gets(ctx->bio, buf, size) < 0) {
089: return -1;
090: }
091: {
092: int i=0;
093: int len = strlen(buf);
094: for (i=len-1; i>=0; i--) {
095: if (buf[i] == MYIO_CHAR_LF || buf[i] == MYIO_CHAR_CR) {
096: buf[i] = '\0';
097: } else {
098: break;
099: }
100: }
101: }
102: return strlen(buf);
103:
104: }
105: #endif
106:
107: MYIO_METHOD myio_method_bio = {
108: MYIO_METHOD_NAME_BIO
109: , myio_write_bio
110: , myio_read_bio
111: , NULL
112: , NULL
113: };
114:
115: MYIO* MYIO_bio_new(
116: BIO *bio
117: , int flag_in
118: , int flag_out
119: ) {
120: MYIO *myio = NULL;
121: myio_bio_ctx *ctx = NULL;
122:
123: if (!bio) {
124: return NULL;
125: }
126: ctx = (myio_bio_ctx*)malloc(sizeof(myio_bio_ctx));
127: ctx->bio = bio;
128: myio = (MYIO*)malloc(sizeof(MYIO));
129: return MYIO_make(myio, &myio_method_bio, (flag_in)?1:0, (flag_out)?1:0, ctx);
130: }
131:
132: BIO *MYIO_bio_get_BIO(
133: MYIO *myio
134: ) {
135: if (myio) {
136: if (myio->method) {
137: if (!strcmp(myio->method->name, MYIO_METHOD_NAME_BIO)) {
138: myio_bio_ctx *ctx = (myio_bio_ctx *)(myio->ptr);
139: return ctx->bio;
140: }
141: }
142: }
143: return NULL;
144: }
145:
146: /*
147: * MYIO 構造体・BIO 用コンテクストデータの解放
148: * BIO 構造体の解放は行わない。
149: */
150:
151: void MYIO_bio_close(
152: MYIO *myio
153: ) {
154: if (myio) {
155: if (myio->method) {
156: if (!strcmp(myio->method->name, MYIO_METHOD_NAME_BIO)) {
157: myio_bio_ctx *ctx = (myio_bio_ctx *)(myio->ptr);
158: if (ctx) {
159: if (ctx->bio) {
160: /* BIO_free(ctx->bio); */
161: ctx->bio = NULL;
162: }
163: free(ctx);
164: myio->ptr = NULL;
165: }
166: free(myio);
167: }
168: }
169: }
170: }
![]() | KAKU PROJECT (2009) |