Lib/xtools.c File Reference

汎用拡張ツールプログラム More...

#include "xtools.h"
Include dependency graph for xtools.c:

Go to the source code of this file.

Functions

int udp_recv_Buffer_sockaddr_in (int sock, Buffer *str, struct sockaddr_in *sv_addr)
 recvform()をラッピングした関数.UDPデータを受信する.IPv4専用.
int udp_send_Buffer_sockaddr_in (int sock, Buffer *str, struct sockaddr_in *sv_addr)
 sendto() をラッピングした関数.UDP経由でデータを送る.IPv4専用.
int udp_send_sBuffer_sockaddr_in (int sock, Buffer *str, struct sockaddr_in *sv_addr)
 DP経由で文字列データを送る.IPv4専用.
int udp_recv_Buffer_wait_sockaddr_in (int sock, Buffer *str, struct sockaddr_in *sv_addr, int tm)
 UDP経由でデータを受信する.IPv4専用..
struct sockaddr_in get_sockaddr_in_Buffer (Buffer buf)
 FQDN:port または IPaddress:port の形式の Buffer変数から ソケット情報を得る.IPv4専用.
int udp_recv_Buffer (int sock, Buffer *str, struct addrinfo *sv_addr)
 recvform()をラッピングした関数.UDPデータを受信する.
int udp_send_Buffer (int sock, Buffer *str, struct addrinfo *sv_addr)
 sendto() をラッピングした関数.UDP経由でデータを送る.
int tcp_recv_Buffer (int sock, Buffer *str)
 TCP経由でデータを受信する.バッファリングなし..
int tcp_send_Buffer (int sock, Buffer *str)
 TCP経由でデータを送信する..
int udp_recv_Buffer_wait (int sock, Buffer *str, struct addrinfo *sv_addr, int tm)
 UDP経由でデータを受信する.待ち時間(タイムアウト)を指定できる..
int tcp_recv_Buffer_wait (int sock, Buffer *str, int tm)
 TCP経由でデータを受信する.待ち時間(タイムアウト)を指定できる..
int tcp_recv_Buffer_tosize (int sock, Buffer *str, Buffer *mod, int size)
 TCP経由でデータを size バイトまで受信する.バッファリングなし..
int tcp_recv_Buffer_tosize_wait (int sock, Buffer *str, Buffer *mod, int size, int tm)
 TCP経由でデータを size バイトまで受信する.待ち時間を指定できる..
int udp_send_sBuffer (int sock, Buffer *str, struct addrinfo *sv_addr)
 UDP経由で文字列データを送る..
int tcp_send_sBuffer (int sock, Buffer *str)
 TCP経由で文字列データを送信する..
int tcp_send_sBufferln (int sock, Buffer *str)
 TCPメッセージ(文字列)に改行(0x0d, 0x0a)を付け加えて送信する..
int tcp_recv_mstream_Buffer (int sock, Buffer *mesg, mstream *sb, int tm)
 TCP経由でメッセージを受信する.バッファリングあり..
int tcp_recv_lines_Buffer (int sock, Buffer *mesg, int tm)
 TCP経由でメッセージを複数行受信する.簡易バッファリングあり..
Buffer comp_hostport (char *host, unsigned short port)
 ホスト名とポート番号から,"ホスト名:ポート番号" の文字列を生成する.
int decomp_hostport (Buffer buf, Buffer *host, unsigned short *port)
 "ホスト名:ポート番号" 形式の文字列から,ホスト名とポート番号を分離する.
Buffer comp_url (char *protocol, char *host, unsigned short port, char *dir)
 "プロトコル://ホスト名:ポート番号/ディレクトリ名" の文字列を生成する.
int decomp_url (Buffer url, Buffer *srvurl, Buffer *protocol, Buffer *srvfqdn, unsigned short *sport, Buffer *srvdir)
 URLを分解する..
Buffer make_form_urlenc (const char *key, const char *val)
 key=val (valはURL Encodeされる)の文字を作成する.
void add_form_urlenc (Buffer *buf, const char *key, const char *val)
 既存の文字に &key=val (valはURL Encodeされる) を追加する.
int save_tagged_Buffer (Buffer buf, FILE *fp, unsigned int mode, int prfm)
 Bufferを指定された形式に従ってタグ付きでファイルに保存する..
Buffer read_tagged_Buffer (FILE *fp, unsigned int *mode)
 save_tagged_Buffer() で保存したファイルから,Buffer をタグに従って読み込む.
Buffer fgets_mstream_Buffer (Buffer buf, mstream *sb)
 メッセージ buf.buf はメッセージストリームに一旦バッファリングされ,この関数により一行ずつ読み出される.
int get_runlength_byte (unsigned char *buf, int len, int pos)
 圧縮されていない状態で pos(Byte)の位置が,0の連長圧縮されているデータではどの位置に来るかを計算する
Buffer decode_runlength (unsigned char *buf, int len, int sz)
 0の連長圧縮された bufから szバイトの通常のデータを取り出す.
Buffer encode_runlength (unsigned char *buf, int len)
 bufの szバイトを 0で連長圧縮する
int put_Buffer_ringBuffer (ringBuffer *rb, Buffer *buf)
 リングバッファ rb へ Buffer データを vldszバイト格納する.
Bufferget_Buffer_ringBuffer (ringBuffer *rb, int sz)
 リングバッファ rb から szバイトのデータを取り出し,Buffer型データに格納する.要 del_Buffer()
Bufferget_Buffer_dim_tList (tList *lp)
 リストを分解してキー部(key)の配列を造る
Bufferget_Buffer_dim_tList_value (tList *lp)
 リストを分解してバリュー部(val)の配列を造る
Bufferawk_Buffer_dim (Buffer buf, char cc)
 文字列を awkで分解して配列を作る
Buffercawk_Buffer_dim (Buffer buf, char cc)
 文字列を cawkで分解して配列を作る
Bufferdecompline_Buffer_dim (Buffer buf, int mode)
 データを行単位に分解する.改行は \r\n
Buffer join_Buffer_dim (Buffer *dim, const char *deli)
 配列の要素を dliを間に入れて繋げる
void del_Buffer_dim (Buffer **dim)
 配列を削除する.
tListget_tList_line_Buffer (Buffer buf, int n)
 buf から n行目を取り出して,' ' で分解してリストに格納して返す.
tListget_tList_seq_data_Buffer (Buffer buf, int *ptr)
 buf から行データをシーケンシャルに取り出して,それぞれを ' ' で分解してリストに格納して返す.
int set_item_tList (tList *list, char *key, int no, char deli, int nm, char *value)
 key をキーにした no番目のノードに対して set_item_tList_node() を行う.
int set_item_tList_node (tList *lp, char deli, int nm, char *value)
 deliを区切りにした nm番目の項目(文字列)に value を設定する
int replace_item_tList (tList *list, char *key, int no, char deli, int nm, char *srcval, char *value)
 key をキーにした no番目のノードに対して replace_item_tList_node() を行う.
int replace_item_tList_node (tList *lp, char deli, int nm, char *srcval, char *value)
 deliを区切りにした nm番目の項目(文字列)の srcval部分を valueで置き換える.
tListget_dir_files (const char *dirn)
 指定されたディレクトリにあるファイル名の一覧を取得.
tListget_dir_files_rcsv (const char *dirn)
 指定されたディレクトリにあるファイル名の一覧を再帰的に取得.
void del_file_extension_Buffer (Buffer *path)
 ファイルの拡張子を削除する.
void change_file_extension_Buffer (Buffer *path, const char *ext)
 ファイルの拡張子を extにする.ファイルに拡張子が無い場合は extを付加する
char * get_resource_path (char *name, tList *lp)
 リソースの名前から,ファイルのパスを得る.戻り値は free() してはいけない.
tListadd_resource_list (const char *path, int keylen, tList *list, tList *extn)
 ディレクトリ pathを検索して,リソースリストにファイルを追加し,リストの先頭を返す.

Detailed Description

Version:
1.1
Author:
Fumi.Iseki (C)
Date:
2009 2/13
内容
主に,Buffer型, tList型とネットワークのライブラリ
滅多に使わないけれど,あれば便利な関数.
See also:
Buffer, _tList

Definition in file xtools.c.


Function Documentation

void add_form_urlenc ( Buffer buf,
const char *  key,
const char *  val 
)

Definition at line 928 of file xtools.c.

References cat_s2Buffer, and encode_urlenc().

00929 {
00930     if (buf==NULL || key==NULL) return;
00931 
00932     cat_s2Buffer("&", buf);
00933     cat_s2Buffer(key, buf);
00934     cat_s2Buffer("=", buf);
00935 
00936     if (val!=NULL) {
00937         unsigned char* val_enc = encode_urlenc((unsigned char*)val, -1);
00938         if (val_enc!=NULL) {
00939             cat_s2Buffer(val_enc, buf);
00940             free(val_enc);
00941         }
00942     }
00943 
00944     return;
00945 }

Here is the call graph for this function:

tList* add_resource_list ( const char *  path,
int  keylen,
tList list,
tList extn 
)

ディレクトリ pathを検索して,リソースリストにファイルを追加し,リストの先頭を返す.
リソースリストのキーは,リソースのファイル名の先頭 keylen文字とする.keylenが 0以下ならファイル名全体をキーとする.

Parameters:
path 検索するディレクトリ名
keylen キー長.0以下ならファイル名全体.
list 追加操作を行うリスト.NULLなら新しいリストそ作成して返す.
extn 除外拡張子のリスト.
Returns:
リソースのリスト

Definition at line 2038 of file xtools.c.

References add_tList_node_bydata(), Buffer::buf, find_tList_end(), free_Buffer(), get_dir_files(), get_file_extension(), get_file_name(), make_Buffer_bystr, strncasecmp_tList(), and Buffer::vldsz.

02039 {
02040     if (path==NULL) return list;
02041 
02042     tList* lp = get_dir_files(path);
02043     tList* pp = find_tList_end(list);
02044 
02045     // Generate Key. ファイル名の先頭 keylen文字をキーにする.
02046     while (lp!=NULL) {
02047         Buffer fn = make_Buffer_bystr(get_file_name((char*)lp->ldat.val.buf));
02048         char* ext = get_file_extension((char*)fn.buf);
02049         //
02050         if (extn==NULL || strncasecmp_tList(extn, ext, 0, 1)==NULL) {
02051             if (keylen<=0) {
02052                 lp->ldat.key = make_Buffer_bystr((char*)fn.buf);
02053                 pp = add_tList_node_bydata(pp, lp->ldat);
02054             }
02055             else if (fn.vldsz>=keylen) {
02056                 fn.buf[keylen] = '\0';
02057                 fn.vldsz = keylen;
02058                 lp->ldat.key = make_Buffer_bystr((char*)fn.buf);
02059                 pp = add_tList_node_bydata(pp, lp->ldat);
02060             }
02061         }
02062 
02063         if (list==NULL) list = pp;
02064         lp = lp->next;
02065         free_Buffer(&fn);
02066     }
02067 
02068     return list;
02069 }

Here is the call graph for this function:

Buffer* awk_Buffer_dim ( Buffer  buf,
char  cc 
)

Buffer* awk_Buffer_dim(Buffer buf, char cc)

ccを区切り記号として, バッファ(buf.buf)内の項目を配列にして返す.

Parameters:
buf 処理対象 Buffer型変数.
cc 区切り文字.
Returns:
ccで区切られた項目をbuf部に格納したBuffer型配列へのポインタ. 各要素の stateにその要素以降の要素数(自分も含む)が格納される. すなわち,0番目の要素の stateには配列の大きさが格納される.
See also:
awk()

Definition at line 1456 of file xtools.c.

References awk_Buffer_tList(), del_all_tList(), and get_Buffer_dim_tList().

01457 {
01458     Buffer* bf = NULL;
01459 
01460     tList*  lp = awk_Buffer_tList(buf, cc);
01461     if (lp!=NULL) bf = get_Buffer_dim_tList(lp);
01462     del_all_tList(&lp);
01463     
01464     return  bf;
01465 }

Here is the call graph for this function:

Buffer* cawk_Buffer_dim ( Buffer  buf,
char  cc 
)

Buffer* cawk_Buffer_dim(Buffer buf, char cc)

ccを区切り記号として, バッファ(buf.buf)内の項目を配列にして返す. 連続する cc(区切り)は一つの区切りとみなす.

Parameters:
buf 処理対象 Buffer型変数.
cc 区切り文字.
Returns:
ccで区切られた項目をbuf部に格納したBuffer型配列へのポインタ. 各要素の stateにその要素以降の要素数(自分も含む)が格納される. すなわち,0番目の要素の stateには配列の大きさが格納される.
See also:
cawk()

Definition at line 1484 of file xtools.c.

References cawk_Buffer_tList(), del_all_tList(), and get_Buffer_dim_tList().

Referenced by replace_item_tList_node(), and set_item_tList_node().

01485 {
01486     Buffer* bf = NULL;
01487 
01488     tList*  lp = cawk_Buffer_tList(buf, cc);
01489     if (lp!=NULL) bf = get_Buffer_dim_tList(lp);
01490     del_all_tList(&lp);
01491     
01492     return  bf;
01493 }

Here is the call graph for this function:

Here is the caller graph for this function:

void change_file_extension_Buffer ( Buffer path,
const char *  ext 
)

ファイルの拡張子を extにする.ファイルに拡張子が無い場合は extを付加する.

Definition at line 1973 of file xtools.c.

References Buffer::buf, cat_s2Buffer, and Buffer::vldsz.

01974 {
01975     if (path==NULL) return;
01976 
01977     int count = path->vldsz - 1;
01978     while (count>=0) {
01979         if (path->buf[count]=='.') {
01980             path->buf[count] = '\0';
01981             path->vldsz = (int)strlen((char*)path->buf);
01982             if (ext[0]!='.') cat_s2Buffer(".", path);
01983             cat_s2Buffer(ext, path);
01984             break;
01985         }
01986         else if (path->buf[count]=='/' || path->buf[count]=='\\') {
01987             count = -1;
01988             break;
01989         }
01990         count--;
01991     }
01992     //
01993     if (count<0) {
01994         if (ext[0]!='.') cat_s2Buffer(".", path);
01995         cat_s2Buffer(ext, path);
01996     }
01997 }

Buffer comp_hostport ( char *  host,
unsigned short  port 
)

Buffer comp_hostport(char* host, unsigned short port)

ホスト名とポート番号から,"ホスト名:ポート番号" の文字列を生成する.

Parameters:
host ホスト名,またはIPアドレス
port ポート番号
Returns:
"ホスト名:ポート番号" の文字列が格納されたバッファ型データ.

Definition at line 708 of file xtools.c.

References LBUF, and make_Buffer_bystr.

Referenced by get_sip_via_address().

00709 {
00710     Buffer buf;
00711     char   hostport[LBUF];
00712 
00713     hostport[0] = '\0';
00714 
00715     if (host!=NULL) {
00716         if (port!=0) snprintf(hostport, LBUF-1, "%s:%d", host, port);
00717         else         snprintf(hostport, LBUF-1, "%s", host);
00718     }
00719     else {
00720         if (port!=0) snprintf(hostport, LBUF-1, "%d", port);
00721     }
00722 
00723     buf = make_Buffer_bystr(hostport);
00724 
00725     return buf;
00726 }

Here is the caller graph for this function:

Buffer comp_url ( char *  protocol,
char *  host,
unsigned short  port,
char *  dir 
)

Buffer comp_url(char* protocol, char* host, unsigned short port, char* dir)

"プロトコル://ホスト名:ポート番号/ディレクトリ名" の文字列を生成する.

Parameters:
protocol プロトコル名
host ホスト名
port ポート番号
dir ディレクトリ
Returns:
"プロトコル名://ホスト名:ポート番号/ディレクトリ名" の文字列が格納されたバッファ型データ.

Definition at line 780 of file xtools.c.

References cat_s2Buffer, copy_s2Buffer, LNAME, and make_Buffer().

00781 {
00782     Buffer url;
00783     char   num[20];
00784 
00785     url = make_Buffer(LNAME);
00786 
00787     if (protocol!=NULL) {
00788         copy_s2Buffer(protocol, &url);
00789         cat_s2Buffer("://", &url);
00790     }
00791 
00792     cat_s2Buffer(host, &url);
00793 
00794     if (port!=0) {
00795         snprintf(num, 10, ":%d", port);
00796         cat_s2Buffer(num, &url);
00797     }
00798 
00799     if (dir!=NULL) {
00800         if (dir[0]!='/') cat_s2Buffer("/", &url);
00801         cat_s2Buffer(dir, &url);
00802     }
00803 
00804     return url;
00805 }

Here is the call graph for this function:

Buffer decode_runlength ( unsigned char *  buf,
int  len,
int  sz 
)

Buffer decode_runlength(unsigned char* buf, int len, int sz)

0の連長圧縮された bufから szバイトの通常のデータを取り出す.

Parameters:
buf 連長圧縮(0)されているバイナリデータ
len buf の長さ(チェック用)
sz 取り出すサイズ.0の場合は全て.
Returns:
解凍されたデータを含んだ Buffer型変数

Definition at line 1177 of file xtools.c.

References Buffer::buf, free_Buffer(), init_Buffer(), make_Buffer(), and Buffer::vldsz.

01178 {
01179     int    i, j, k;
01180     Buffer ret = init_Buffer();
01181 
01182     // 長さを数える
01183     i = j = 0;
01184     if (sz<=0) {
01185         while (j<len) {
01186             if (buf[j]==0x00) {
01187                 if (j+1<len) {
01188                     if (buf[j+1]==0x00) return ret;
01189                     i += (int)buf[j+1];
01190                     j += 2;
01191                 }
01192                 else break;
01193             }
01194             else {
01195                 i++;
01196                 j++;
01197             }
01198         }
01199 
01200         if (j==len) sz = i;
01201         else return ret;
01202     }
01203         
01204     ret = make_Buffer(sz);
01205     if (ret.buf==NULL) return ret;
01206 
01207     i = j = 0;
01208     while (i<sz && j<len) {
01209         if (buf[j]==0x00) {
01210             if (j+1<len) {
01211                 for (k=0; k<(int)buf[j+1]; k++) ret.buf[i++] = 0x00;
01212                 j += 2;
01213             }
01214             else break;
01215         }    
01216         else ret.buf[i++] = buf[j++];
01217     }
01218 
01219     if (i==sz) ret.vldsz = sz;
01220     else free_Buffer(&ret);
01221 
01222     return ret;
01223 }

Here is the call graph for this function:

int decomp_hostport ( Buffer  buf,
Buffer host,
unsigned short *  port 
)

int decomp_hostport(Buffer buf, Buffer* host, unsigned short* port)

"ホスト名:ポート番号" 形式の文字列から,ホスト名とポート番号を分離する.

Parameters:
buf "ホスト名:ポート番号" 形式の文字列の入ったBufferデータ
[out] host "ホスト名" が格納されて返る.
[out] port ポート番号 が格納されて返る.
Return values:
TRUE 分離成功
FALSE 分離失敗

Definition at line 742 of file xtools.c.

References Buffer::buf, dup_Buffer(), FALSE, TRUE, and Buffer::vldsz.

Referenced by sql_open().

00743 {
00744     if (buf.buf==NULL) return FALSE;
00745 
00746     if (port!=NULL) {
00747         int i = 0;
00748         while (buf.buf[i]!='\0' && buf.buf[i]!=':') i++;
00749         if (buf.buf[i]!='\0') *port = (unsigned short)atoi((char*)&buf.buf[i+1]);
00750         else *port = 0;
00751     }
00752 
00753     if (host!=NULL) {
00754         Buffer hostport = dup_Buffer(buf);
00755     
00756         int i = 0;
00757         while (hostport.buf[i]!='\0' && hostport.buf[i]!=':') i++;
00758         hostport.buf[i] = '\0';
00759         hostport.vldsz  = (int)strlen((char*)hostport.buf);
00760         *host = hostport;
00761     }
00762 
00763     return TRUE;
00764 }

Here is the call graph for this function:

Here is the caller graph for this function:

int decomp_url ( Buffer  url,
Buffer srvurl,
Buffer protocol,
Buffer srvfqdn,
unsigned short *  sport,
Buffer srvdir 
)

int decomp_url(Buffer url, Buffer* srvurl, Buffer* protocol, Buffer* srvfqdn, unsigned short* sport, Buffer* srvdir)

URLを分解する.

分解できるURLの形式は

  • protocol://www.xxx.yyy.zzz:80/AA/BB
  • www.xxx.yyy.zzz:80/AA/BB

必要ない情報には NULLを指定可能.

Parameters:
url 分解するURLの入った Buffer変数. url が https://AAA.BBB.CCC:80/xxx/yyy/zzz の場合
[out] srvurl https://AAA.BBB.CCC:80 要 free
[out] protocol https 要 free
[out] srvfqdn AAA.BBB.CCC 要 free
[out] sport 80
[out] srvdir /xxx/yyy/zzz 要 free
Return values:
TRUE 分解成功
FALSE 分解失敗

Definition at line 831 of file xtools.c.

References awk_Buffer(), Buffer::buf, cat_Buffer(), cat_s2Buffer, copy_Buffer(), copy_s2Buffer, dup_Buffer(), FALSE, free_Buffer(), init_Buffer(), LBUF, make_Buffer(), make_Buffer_bystr, TRUE, and Buffer::vldsz.

Referenced by http_proxy_header_analyze(), and read_ldap_config().

00832 {
00833     Buffer item1, item2, item3, item4, wrk;
00834 
00835     if (srvurl  !=NULL) *srvurl   = init_Buffer();
00836     if (protocol!=NULL) *protocol = init_Buffer();
00837     if (srvfqdn !=NULL) *srvfqdn  = init_Buffer();
00838     if (srvdir  !=NULL) *srvdir   = init_Buffer();
00839     if (sport   !=NULL) *sport    = 0;
00840     if (url.buf ==NULL) return FALSE;
00841 
00842     item1 = init_Buffer();
00843     item2 = init_Buffer();
00844     item3 = init_Buffer();
00845     item4 = init_Buffer();
00846      
00847     if (strstr((char*)url.buf, "://")!=NULL) {
00848         // http(s)://www.tuis.ac.jp:8100/..... 
00849         item1 = awk_Buffer(url, '/', 1);    // http(s):
00850         item2 = awk_Buffer(url, '/', 3);    // www.tuis.ac.jp:8100
00851         if (protocol!=NULL) {
00852             *protocol = dup_Buffer(item1);
00853             protocol->buf[protocol->vldsz-1] = '\0';
00854             protocol->vldsz--;
00855         }
00856     }
00857     else {
00858         // www.tuis.ac.jp:8100/..... 
00859         item2 = awk_Buffer(url, '/', 1);    // www.tuis.ac.jp:8100
00860     }
00861 
00862     if (item2.buf!=NULL) {
00863         item3 = awk_Buffer(item2, ':', 1);  // www.tuis.ac.jp
00864         if (item3.buf==NULL) {
00865             free_Buffer(&item1);
00866             free_Buffer(&item2);
00867             return FALSE;
00868         }
00869         item4 = awk_Buffer(item2, ':', 2);  // 8100
00870     }
00871     else {
00872         free_Buffer(&item1);
00873         return FALSE;
00874     }
00875 
00876     if (item4.buf!=NULL && sport!=NULL) {
00877         *sport = (unsigned short)atoi((char*)item4.buf);
00878     }
00879      
00880     wrk = make_Buffer(LBUF);
00881     if (item1.buf!=NULL) {
00882         copy_Buffer(&item1, &wrk);
00883         cat_s2Buffer("//",  &wrk);
00884     }
00885     cat_Buffer(&item2,  &wrk);
00886 
00887     if (item3.buf!=NULL) {
00888         if (srvfqdn!=NULL) *srvfqdn = item3;
00889         else free_Buffer(&item3);
00890     }
00891      
00892     if (srvdir!=NULL) {
00893         *srvdir = make_Buffer_bystr((char*)(url.buf+strlen((char*)(wrk.buf))));
00894         if ((srvdir->buf)[0]=='\0') copy_s2Buffer("/", srvdir);
00895     }
00896 
00897     if (srvurl!=NULL) *srvurl = wrk;
00898     else free_Buffer(&wrk);
00899 
00900     free_Buffer(&item1);
00901     free_Buffer(&item2);
00902     free_Buffer(&item4);
00903      
00904     return TRUE;
00905 }                                           

Here is the call graph for this function:

Here is the caller graph for this function:

Buffer* decompline_Buffer_dim ( Buffer  buf,
int  mode 
)

Buffer* decompline_Buffer_dim(Buffer buf, int mode)

buf.buf を行に分解する.行の区切りは CRLF, CR, LF

バイナリデータが混じっている場合は,バイナリデータと思われるデータ以降を一行として返す. 従って最後のデータはバイナリである可能性がある.

Parameters:
buf 分解するデータの入っている Buffer変数
mode ON: 行末の CR, LFを削除しない.OFF: 行末の CR, LFを削除する.
Returns:
行へのポインタが格納された配列へのポインタ.各データの state に配列の大きさが入る. 使い終わったら del_Buffer_dim()でメモリを解放する.

Definition at line 1511 of file xtools.c.

References Buffer::buf, CHAR_CR, CHAR_LF, make_Buffer(), ON, Buffer::state, and Buffer::vldsz.

01512 {
01513     Buffer* dim;
01514     int i, n, m;
01515 
01516     if (buf.buf==NULL) return NULL;
01517 
01518     n = i = 0;
01519     while(buf.buf[i]!='\0' && i<buf.vldsz) {
01520         if (buf.buf[i]==CHAR_CR) {
01521             n++;
01522             if (i+1<buf.vldsz && buf.buf[i+1]==CHAR_LF) i++;
01523         }
01524         else if (buf.buf[i]==CHAR_LF) n++;
01525         else if (i+1<buf.vldsz  && buf.buf[i+1]=='\0') n++;
01526         else if (i+1==buf.vldsz || buf.buf[i+1]=='\0') n++;
01527         i++;
01528     }
01529     if (n==0) n = 1;            // buf.buf[0]=='\0' の場合
01530 
01531     dim = (Buffer*)malloc(sizeof(Buffer)*n);
01532     if (dim==NULL) return NULL;
01533 
01534     int nxt = 0;
01535     for (m=0; m<n-1; m++) {
01536         int cnt = 0;
01537         int fwd = 0;
01538         while (buf.buf[nxt+cnt]!=CHAR_CR && buf.buf[nxt+cnt]!=CHAR_LF && nxt+cnt<buf.vldsz)  cnt++;
01539 
01540         if (buf.buf[nxt+cnt]==CHAR_CR || buf.buf[nxt+cnt]==CHAR_LF) fwd++;
01541         if (buf.buf[nxt+cnt]==CHAR_CR && nxt+cnt+1<buf.vldsz && buf.buf[nxt+cnt+1]==CHAR_LF) fwd++;
01542         if (mode==ON) cnt += fwd;
01543 
01544         dim[m] = make_Buffer(cnt);
01545         for (i=0; i<cnt; i++) {
01546             dim[m].buf[i] = buf.buf[nxt+i];
01547         }
01548         dim[m].vldsz = cnt;
01549         dim[m].state = n;
01550 
01551         if (mode==ON) nxt += cnt;
01552         else          nxt += cnt + fwd;
01553     }
01554 
01555     // m == n-1  一番最後の領域
01556     dim[n-1] = make_Buffer(buf.vldsz-nxt);
01557     for (i=0; i<buf.vldsz-nxt; i++) {
01558         dim[n-1].buf[i] = buf.buf[nxt+i];
01559     }
01560     dim[n-1].vldsz = buf.vldsz - nxt;
01561     dim[n-1].state = n;
01562 
01563     return dim;
01564 }

Here is the call graph for this function:

void del_Buffer_dim ( Buffer **  dim  ) 

void del_Buffer_dim(Buffer** dim)

動的に確保された Bufferの配列を削除する.

Definition at line 1600 of file xtools.c.

References free_Buffer(), and Buffer::state.

Referenced by replace_item_tList_node(), and set_item_tList_node().

01601 {
01602     int  i, nn;
01603     Buffer* buf;
01604 
01605     if (dim==NULL || *dim==NULL) return;
01606     buf = *dim;
01607     
01608     nn = buf->state;
01609     if (nn<=0) free_Buffer(buf);
01610 
01611     for (i=0; i<nn; i++) {
01612         free_Buffer(buf);
01613         buf++;
01614     }
01615 
01616     free(*dim);
01617     *dim = NULL;
01618     return;
01619 }

Here is the call graph for this function:

Here is the caller graph for this function:

void del_file_extension_Buffer ( Buffer path  ) 

Definition at line 1953 of file xtools.c.

References Buffer::buf, and Buffer::vldsz.

01954 {
01955     if (path==NULL) return;
01956 
01957     int count = path->vldsz - 1;
01958     while (count>=0) {
01959         if (path->buf[count]=='.') {
01960             path->buf[count] = '\0';
01961             path->vldsz = (int)strlen((char*)path->buf);
01962             break;
01963         }
01964         count--;
01965     }
01966 }

Buffer encode_runlength ( unsigned char *  buf,
int  len 
)

Definition at line 1226 of file xtools.c.

References Buffer::buf, init_Buffer(), make_Buffer(), and Buffer::vldsz.

01227 {
01228     int    i, j, k;
01229     Buffer ret = init_Buffer();
01230 
01231     ret = make_Buffer(2*len);
01232     if (ret.buf==NULL) return ret;
01233 
01234     i = j = 0;
01235     while (j<len) {
01236         ret.buf[i] = buf[j];
01237 
01238         if (buf[j]==0x00) {
01239             k = 0;
01240             while (buf[j]==0x00 && j<len) {
01241                 k++;
01242                 j++;
01243             }
01244             ret.buf[i+1] = (unsigned char)k;
01245             i += 2;
01246         }
01247         else {
01248             i++;
01249             j++;
01250         }
01251     }
01252 
01253     ret.vldsz = i;
01254     return ret;
01255 }

Here is the call graph for this function:

Buffer fgets_mstream_Buffer ( Buffer  buf,
mstream *  sb 
)

Buffer fgets_mstream_Buffer(Buffer buf, mstream* sb)

メッセージ buf.buf はメッセージストリームに一旦バッファリングされ,この関数により一行ずつ読み出される.
結果が返される時,行中の改行コードは削除され,行末には必ず \0 が入る.

メッセージストリームのバッファ部が確保されていない場合は,最初に呼び出された時点で確保される.
一旦この関数を使用して,受信データをバッファリングしたら,最後まで読み取りには 必ず同じストリームを使用してこの関数を呼び出さばければならない.そうで無い場合は受信データ の整合性は保証されない.

Parameters:
buf バッファに一旦格納されるメッセージの入ったBuffer型変数.buf.bufはNULLでも可.
[in] sb ストリームバッファ(リングバッファ型のストリームバッファ).バッファ部が確保さえていなければ,自動的に確保される.
[out] sb state JBXL_ERROR : メッセージストリーム操作中にエラー
[out] sb state JBXL_NODATA: メッセージストリーム中に有効なデータがない.return は NULL
Returns:
取り出した文字列へのポインタ

Definition at line 1106 of file xtools.c.

References Buffer::buf, copy_s2Buffer, fgets_mstream(), init_Buffer(), LBUF, and make_Buffer().

01107 {
01108     Buffer   ret;
01109     unsigned char* pp;
01110 
01111     ret = init_Buffer();
01112 
01113     pp = fgets_mstream(buf.buf, sb);
01114     if (pp!=NULL) {
01115         ret = make_Buffer(LBUF);
01116         copy_s2Buffer((char*)pp, &ret);
01117         free(pp);
01118     }
01119     return ret;
01120 }

Here is the call graph for this function:

Buffer* get_Buffer_dim_tList ( tList lp  ) 

Buffer* get_Buffer_dim_tList(tList* lp)

リストを分解して,キー部(lp->ldat.key)の配列を造る

Parameters:
lp 処理対象リスト
Returns:
リストのキー部(lp->ldat.key)をコピーしたBuffer型配列(Buffer[0],Buffer[1],.....)へのポインタ. 各要素の stateにその要素以降の要素数(自分も含む)が格納される. すなわち,0番目の要素の stateには配列の大きさが格納される.

Definition at line 1360 of file xtools.c.

References dup_Buffer(), and Buffer::state.

Referenced by awk_Buffer_dim(), and cawk_Buffer_dim().

01361 {
01362     int     nn, mx;
01363     tList*  lt;
01364     Buffer* buf;
01365     Buffer* ret;
01366 
01367     if (lp==NULL) return NULL;
01368 
01369     // リスト中のノードの数を数える.
01370     lt = lp;
01371     nn = 0;
01372     while(lt!=NULL && lt->ldat.key.buf!=NULL) {
01373         nn++;
01374         lt = lt->next;
01375     }
01376     if (nn==0) return NULL;
01377 
01378     mx = nn;
01379     buf = ret = (Buffer*)malloc(sizeof(Buffer)*mx);
01380     if (ret==NULL) return NULL;
01381     
01382     nn = 0;
01383     while(lp!=NULL && lp->ldat.key.buf!=NULL) {
01384         *buf = dup_Buffer(lp->ldat.key);
01385         buf->state = mx - nn;
01386         nn++;
01387         buf++;
01388         lp = lp->next;
01389     }
01390         
01391     return ret;
01392 }

Here is the call graph for this function:

Here is the caller graph for this function:

Buffer* get_Buffer_dim_tList_value ( tList lp  ) 

Buffer* get_Buffer_dim_tList_value(tList* lp)

リストを分解して,バリュー部(lp->ldat.val)の配列を造る

Parameters:
lp 処理対象リスト
Returns:
リストのバリュー部(lp->ldat.val)をコピーしたBuffer型配列へのポインタ. 各要素の stateにその要素以降の要素数(自分も含む)が格納される. すなわち,0番目の要素の stateには配列の大きさが格納される.

Definition at line 1407 of file xtools.c.

References dup_Buffer(), and Buffer::state.

01408 {
01409     int     nn, mx;
01410     tList*  lt;
01411     Buffer* buf;
01412     Buffer* ret;
01413 
01414     if (lp==NULL) return NULL;
01415 
01416     lt = lp;
01417     nn = 0;
01418     while(lt!=NULL && lt->ldat.val.buf!=NULL) {
01419         nn++;
01420         lt = lt->next;
01421     }
01422     if (nn==0) return NULL;
01423 
01424     mx = nn;
01425     buf = ret = (Buffer*)malloc(sizeof(Buffer)*mx);
01426     if (ret==NULL) return NULL;
01427     
01428     nn = 0;
01429     while(lp!=NULL && lp->ldat.val.buf!=NULL) {
01430         *buf = dup_Buffer(lp->ldat.val);
01431         buf->state = mx - nn;
01432         nn++;
01433         buf++;
01434         lp = lp->next;
01435     }
01436         
01437     return ret;
01438 }

Here is the call graph for this function:

Buffer* get_Buffer_ringBuffer ( ringBuffer rb,
int  sz 
)

Buffer* get_Buffer_ringBuffer(ringBuffer* rb, int sz)

リングバッファ rb から szバイトのデータを取り出し,Buffer型データに格納する.
返されたデータは del_Buffer() する必要がある.

Parameters:
[in] rb リングバッファへのポインタ
[out] rb state JBXL_NORMAL: バッファは正常状態.JBXL_ERROR: バッファは異常な状態にある.
sz 取り出すバイト数.
Return values:
NULL以外 取り出した Bufferデータへのポインタ.要 del_Buffer()
NULL データ取得失敗.現在有効なデータサイズはszより小さい.または単に失敗した.

Definition at line 1319 of file xtools.c.

References ringBuffer::buf, ringBuffer::bufsz, cat_b2Buffer(), copy_b2Buffer(), ringBuffer::datasz, new_Buffer(), and ringBuffer::spoint.

01320 {
01321     if (rb==NULL) return NULL;
01322     if (rb->buf==NULL) return NULL;
01323     if (sz>rb->datasz) return NULL;
01324 
01325     Buffer* buf = new_Buffer(sz);
01326 
01327     if (rb->spoint + sz <= rb->bufsz) {
01328         copy_b2Buffer(&(rb->buf[rb->spoint]), buf, sz);
01329         rb->spoint = rb->spoint + sz;
01330         if (rb->spoint==rb->bufsz) rb->spoint = 0;
01331     }
01332     else {
01333         copy_b2Buffer(&(rb->buf[rb->spoint]), buf, rb->bufsz - rb->spoint);
01334         cat_b2Buffer(rb->buf, buf, sz - (rb->bufsz - rb->spoint));
01335         rb->spoint = rb->spoint + sz - rb->bufsz;
01336     }
01337 
01338     rb->datasz -= sz;
01339     return buf;
01340 }

Here is the call graph for this function:

tList* get_dir_files ( const char *  dirn  ) 

tList* get_dir_files(const char* dirn)

指定されたディレクトリにあるファイル名の一覧を取得.
Windows の場合は 非 Unicode専用

Parameters:
dirn ディレクトリ名
Returns:
ファイル名をバッファ部(ldat.val)に格納したリストへのポインタ.
Attention:
ファイルの種類は区別しない.

Definition at line 1856 of file xtools.c.

References add_tList_node_str, Buffer::buf, cat_s2Buffer, dup_Buffer(), free_Buffer(), make_Buffer_bystr, and swap_tList_node().

Referenced by add_resource_list(), and get_dir_files_rcsv().

01857 {
01858     tList* lp = NULL;
01859     tList* ln = NULL;
01860 
01861 #ifdef WIN32
01862 //    WIN32_FIND_DATA  FindFileData;
01863     WIN32_FIND_DATAA FindFileData;
01864     HANDLE hFind;
01865 
01866     Buffer pth = make_Buffer_bystr(dirn);
01867     if (pth.buf[strlen((char*)pth.buf)-1]!='\\') cat_s2Buffer("\\", &pth);
01868     Buffer buf = dup_Buffer(pth);
01869     cat_s2Buffer("*", &buf);
01870 
01871 //    hFind = FindFirstFile((LPCTSTR)(buf.buf), &FindFileData);
01872     hFind = FindFirstFileA((LPCSTR)(buf.buf), &FindFileData);
01873     if (hFind!=INVALID_HANDLE_VALUE) {
01874         Buffer tmp;    
01875         do {
01876             if (strcmp(".", FindFileData.cFileName) && strcmp("..", FindFileData.cFileName)) { 
01877                 tmp = dup_Buffer(pth);
01878                 cat_s2Buffer(FindFileData.cFileName, &tmp);
01879                 ln = add_tList_node_str(ln, NULL, tmp.buf);
01880                 if (lp==NULL) lp = ln;
01881                 free_Buffer(&tmp);
01882             }
01883         } while (FindNextFileA(hFind, &FindFileData));
01884 
01885         FindClose(hFind);
01886     }
01887     free_Buffer(&buf);
01888     free_Buffer(&pth);
01889 
01890 #else
01891 
01892     DIR *dp;
01893     struct dirent *dir;
01894     
01895     Buffer pth = make_Buffer_bystr(dirn);
01896     if (pth.buf[strlen((char*)pth.buf)-1]!='/') cat_s2Buffer("/", &pth);
01897 
01898     dp = opendir(dirn);
01899     if (dp!=NULL ){
01900         Buffer tmp;
01901         dir = readdir(dp);
01902         while (dir != NULL ){
01903             if (strcmp(".", dir->d_name) && strcmp("..", dir->d_name)) { 
01904                 tmp = dup_Buffer(pth);
01905                 cat_s2Buffer(dir->d_name, &tmp);
01906                 ln = add_tList_node_str(ln, NULL, (char*)tmp.buf);
01907                 if (lp==NULL) lp = ln;
01908                 free_Buffer(&tmp);
01909             }
01910             dir = readdir(dp);
01911         }
01912 
01913         closedir(dp);
01914     }
01915     free_Buffer(&pth);
01916 
01917 #endif
01918 
01919     // sort
01920     ln = lp;
01921     while (ln!=NULL) {
01922         tList* lo = ln->next;
01923         while (lo!=NULL) {
01924             if (strcmp((char*)ln->ldat.val.buf, (char*)lo->ldat.val.buf)>0) {
01925                 swap_tList_node(ln, lo);
01926             }
01927             lo = lo->next;
01928         }
01929         ln = ln->next;
01930     }
01931 
01932     return lp;
01933 }

Here is the call graph for this function:

Here is the caller graph for this function:

tList* get_dir_files_rcsv ( const char *  dirn  ) 

Definition at line 1936 of file xtools.c.

References add_tList_end(), del_tList(), dup_tList(), get_dir_files(), and get_dir_files_rcsv().

Referenced by get_dir_files_rcsv().

01937 {
01938     tList* lp = get_dir_files(dirn);
01939     if (lp==NULL) return NULL;
01940 
01941     tList* lt = dup_tList(lp);
01942     while (lt!=NULL) {
01943         tList* lc = get_dir_files_rcsv((char*)lt->ldat.val.buf);
01944         if (lc!=NULL) add_tList_end(lp, lc);
01945         lt = lt->next;
01946     }
01947     del_tList(&lt);
01948 
01949     return lp;
01950 }

Here is the call graph for this function:

Here is the caller graph for this function:

char* get_resource_path ( char *  name,
tList lp 
)

リソースの名前から,ファイルのパスを得る.戻り値は freeしてはいけない.

Parameters:
name リソース名
lp リソースリスト.key部に名前,val部にパスが格納されている.
Returns:
リソース名に対応したパス.

Definition at line 2012 of file xtools.c.

02013 {
02014     if (name==NULL) return NULL;
02015 
02016     while (lp!=NULL) {
02017         if (!strcasecmp((char*)lp->ldat.key.buf, name)) {
02018             return (char*)lp->ldat.val.buf;
02019         }
02020         lp = lp->next;
02021     }
02022 
02023     return NULL;
02024 }

int get_runlength_byte ( unsigned char *  buf,
int  len,
int  pos 
)

int get_runlength_byte(unsigned char* buf, int len, int pos)

圧縮されていない状態で pos(Byte)の位置が,0の連長圧縮されているデータではどの位置に来るかを計算する.

Parameters:
buf 連長圧縮(0)されているバイナリデータ
len buf の長さ
pos 圧縮されていない場合の位置.
Returns:
0以上 連長圧縮されているデータでの位置.
Return values:
JBXL_ERROR 位置を見つけられなかった.
JBXL_XTOOLS_RUNLEN_ERROR 0x00 で終わっている.
JBXL_XTOOLS_RUNLEN2_ERROR 0x00, 0x00 が存在する(連長圧縮のデータではないのでは?)

Definition at line 1143 of file xtools.c.

References JBXL_ERROR, JBXL_XTOOLS_RUNLEN2_ERROR, and JBXL_XTOOLS_RUNLEN_ERROR.

01144 {
01145     int i, sz;
01146 
01147     sz = -1;
01148     for (i=0; i<len; i++) {
01149         if (buf[i]==0x00) {
01150             if (i+1>=len) return JBXL_XTOOLS_RUNLEN_ERROR;
01151             if (buf[i+1]==0x00) return JBXL_XTOOLS_RUNLEN2_ERROR;
01152             sz += buf[i+1];
01153             if (sz>=pos) return i;
01154             i++;
01155         }
01156         else sz++;
01157 
01158         if (sz>=pos) return i;
01159     }
01160 
01161     return JBXL_ERROR;
01162 }

struct sockaddr_in get_sockaddr_in_Buffer ( Buffer  buf  )  [read]

struct sockaddr_in get_sockaddr_in_Buffer(Buffer buf)

FQDN:port または IPaddress:port の形式の Buffer変数から ソケット情報を得る.
get_sockaddr_in() (in network.c) の Buffer版

Parameters:
buf "FQDN:ポート番号" または "IPアドレス:ポート番号" 形式のデータ.
Returns:
sockaddr_in 構造体型のソケット情報
See also:
get_sockaddr_in()

Definition at line 162 of file xtools.c.

References get_sockaddr_in().

00163 {
00164     int i, port = 0;
00165     struct sockaddr_in  addr;
00166     memset(&addr, 0, sizeof(struct sockaddr_in));
00167 
00168     if (buf.buf==NULL) return addr;
00169     
00170     i = 0;
00171     while (buf.buf[i]!='\0' && buf.buf[i]!=':') i++;
00172     buf.buf[i] = '\0';
00173 
00174     port = atoi((char*)&buf.buf[i+1]);
00175     addr = get_sockaddr_in((char*)buf.buf, port);
00176 
00177     return addr;
00178 }

Here is the call graph for this function:

tList* get_tList_line_Buffer ( Buffer  buf,
int  n 
)

tList* get_tList_line_Buffer(Buffer buf, int n)

dataのn行目を分解してリストに格納して返す.

Parameters:
buf 文字データが格納されたBuffer型変数
n 読み出す行数
Returns:
アイテムを格納したリストへのポインタ.失敗した場合は NULL

Definition at line 1637 of file xtools.c.

References awk_tList(), Buffer::buf, free_Buffer(), get_line_Buffer(), line(), and pack_char.

01638 {
01639     if (buf.buf==NULL || n<=0) return NULL;
01640 
01641     Buffer line = get_line_Buffer(buf, n);
01642     if (line.buf==NULL) return NULL;
01643 
01644     char*  packline = pack_char((char*)line.buf, ' ');
01645     free_Buffer(&line);
01646     if (packline==NULL) return NULL;
01647 
01648     tList* list = awk_tList(packline, ' ');
01649     free(packline);
01650 
01651     return list;
01652 }

Here is the call graph for this function:

tList* get_tList_seq_data_Buffer ( Buffer  buf,
int *  ptr 
)

tList* get_tList_seq_data_Buffer(Buffer buf, int* ptr)

Parameters:
buf 文字データが格納されたBuffer型変数
ptr 読み出開始場所へのポインタ.
Returns:
アイテムを格納したリストへのポインタ.失敗した場合は NULL

Definition at line 1663 of file xtools.c.

References awk_tList(), Buffer::buf, free_Buffer(), get_seq_data_Buffer(), line(), pack_char, and Buffer::vldsz.

01664 {
01665     if (buf.buf==NULL || *ptr<0) return NULL;
01666     if (*ptr>=buf.vldsz) return NULL;
01667 
01668     Buffer line = get_seq_data_Buffer(buf, ptr);
01669     if (line.buf==NULL) return NULL;
01670 
01671     char*  packline = pack_char((char*)line.buf, ' ');
01672     free_Buffer(&line);
01673     if (packline==NULL) return NULL;
01674 
01675     tList* list = awk_tList(packline, ' ');
01676     free(packline);
01677 
01678     return list;
01679 }

Here is the call graph for this function:

Buffer join_Buffer_dim ( Buffer dim,
const char *  deli 
)

Buffer join_Buffer_dim(Buffer* dim, const char* deli)

Buffer配列の内容を繋げて一個のデータにする.

Definition at line 1573 of file xtools.c.

References cat_Buffer(), cat_s2Buffer, init_Buffer(), LBUF, make_Buffer(), and Buffer::state.

Referenced by replace_item_tList_node(), and set_item_tList_node().

01574 {
01575     int    i, nn;
01576     Buffer buf;
01577 
01578     buf = init_Buffer();
01579     if (dim==NULL) return buf;
01580 
01581     buf = make_Buffer(LBUF);
01582     nn  = dim->state;
01583 
01584     for (i=0; i<nn; i++) {
01585         cat_Buffer(dim, &buf);
01586         if (deli!=NULL && i!=nn-1) cat_s2Buffer(deli, &buf);
01587         dim++;
01588     }
01589 
01590     return buf;
01591 }

Here is the call graph for this function:

Here is the caller graph for this function:

Buffer make_form_urlenc ( const char *  key,
const char *  val 
)

Definition at line 908 of file xtools.c.

References cat_s2Buffer, encode_urlenc(), init_Buffer(), and make_Buffer_str.

00909 {
00910     Buffer buf = init_Buffer();
00911     if (key==NULL) return buf;
00912 
00913     buf = make_Buffer_str(key);
00914     cat_s2Buffer("=", &buf);
00915 
00916     if (val!=NULL) {
00917         unsigned char* val_enc = encode_urlenc((unsigned char*)val, -1);
00918         if (val_enc!=NULL) {
00919             cat_s2Buffer(val_enc, &buf);
00920             free(val_enc);
00921         }
00922     }
00923     
00924     return buf;
00925 }

Here is the call graph for this function:

int put_Buffer_ringBuffer ( ringBuffer rb,
Buffer buf 
)

int put_Buffer_ringBuffer(ringBuffer* rb, Buffer* buf)

リングバッファ rb へ Buffer データを vldszバイト格納する.

Parameters:
[in] rb リングバッファへのポインタ
[out] rb state JBXL_NORMAL: バッファは正常状態.JBXL_ERROR: バッファは異常な状態にある.
buf 格納する Bufferデータへのポインタ.
Return values:
0以上 書き込んだバイト数.
JBXL_ARGS_ERROR 引数にNULLのデータがある.
JBXL_TOOLS_BUF_ERROR バッファ(データ格納)部の領域がない.
JBXL_TOOLS_BUFSZ_ERROR バッファ(データ格納)部の大きさがたりない.データはputされなかった.

Definition at line 1277 of file xtools.c.

References Buffer::buf, ringBuffer::buf, ringBuffer::bufsz, ringBuffer::datasz, ringBuffer::epoint, JBXL_ARGS_ERROR, JBXL_ERROR, JBXL_NORMAL, JBXL_TOOLS_BUF_ERROR, JBXL_TOOLS_BUFSZ_ERROR, ringBuffer::state, and Buffer::vldsz.

01278 {
01279     if (rb==NULL) return JBXL_ARGS_ERROR;
01280     rb->state = JBXL_NORMAL;
01281 
01282     if (buf==NULL)     return JBXL_ARGS_ERROR;
01283     if (rb->buf==NULL) return JBXL_TOOLS_BUF_ERROR;
01284     if (rb->datasz + buf->vldsz > rb->bufsz) {
01285         rb->state = JBXL_ERROR;
01286         return JBXL_TOOLS_BUFSZ_ERROR;
01287     }
01288 
01289     if (rb->epoint + buf->vldsz <= rb->bufsz) {
01290         memcpy(&(rb->buf[rb->epoint]), buf->buf, buf->vldsz);
01291         rb->epoint = rb->epoint + buf->vldsz;
01292         if (rb->epoint==rb->bufsz) rb->epoint = 0;
01293     }
01294     else {
01295         memcpy(&(rb->buf[rb->epoint]), buf->buf, rb->bufsz - rb->epoint);
01296         memcpy(rb->buf, &(buf->buf[rb->bufsz - rb->epoint]), buf->vldsz - (rb->bufsz - rb->epoint));
01297         rb->epoint = rb->epoint + buf->vldsz - rb->bufsz;
01298     }
01299 
01300     rb->datasz += buf->vldsz;
01301     return buf->vldsz;
01302 }

Buffer read_tagged_Buffer ( FILE *  fp,
unsigned int *  mode 
)

Buffer read_tagged_Buffer(FILE* fp, unsigned int* mode)

save_tagged_Buffer() で保存したファイルから,Buffer をタグに従って読み込む.

Parameters:
fp ファイルポインタ.
[in] mode 読み出したいデータの種別と読み出し時のデータ形式を JBXL_FIO_ マクロで指定する. 保存方されているデータと読み出したいデータの種別が一致しない場合は,データを返さない. ただし,JBXL_FIO_ANY を指定した場合は一致しなくともデータを返す.
[out] mode 読み出し時のデータ形式は現在のところ JBXL_FIO_ORIGINAL, JBXL_FIO_BASE64 のみサポート. リターン時に,保存されていたデータの種別のが JBXL_FIO_ マクロで格納される.
Return values:
TRUE 成功.
FALSE 失敗.
Attention:
データ形式が,JBXL_FIO_ORIGINAL, JBXL_FIO_BIN, JBXL_FIO_DER等で保存されている場合は,そのデータ形式に 対して結局はプログラマが責任を持たなければならない.

参考:

tag部  tag.buf[0]  保存データの種別
        tag.buf[1]  保存形式          JBXL_FIO_ORIGINAL, JBXL_FIO_BASE64 をサポート
See also:
xtool.h

Definition at line 1038 of file xtools.c.

References Buffer::buf, decode_base64_Buffer(), dup_Buffer(), encode_base64_Buffer(), free_Buffer(), init_Buffer(), JBXL_FIO_ANY, JBXL_FIO_BASE64, and read_Buffer2_fp().

Referenced by read_DHspki_with_private(), and read_spki_with_ipaddr().

01039 {    
01040     unsigned char mthd, kind;
01041     Buffer   tmp, tag, enc, buf;
01042 
01043     buf = init_Buffer();
01044     if (mode==NULL) return buf;
01045 
01046     if (!read_Buffer2_fp(&tag, &enc, fp)) return buf;
01047 
01048     kind = *mode & 0x0f;                // データの種別
01049     mthd = *mode & 0xf0;                // データの形式
01050     if (kind!=tag.buf[0] && kind!=JBXL_FIO_ANY) {
01051         free_Buffer(&enc);
01052         free_Buffer(&tag);
01053         return buf;
01054     }
01055 
01056     // JBXL_FIO_ORIGINAL, JBXL_FIO_BASE64 以外は未サポート
01057     if (mthd==tag.buf[1]) {                // 保存形式と呼び出し形式は同じ
01058         buf = dup_Buffer(enc);
01059     }
01060     else {
01061         // 保存データをオリジナルへ
01062         if (tag.buf[1]==JBXL_FIO_BASE64) {
01063             tmp = decode_base64_Buffer(enc);
01064         }
01065         else {
01066             tmp = dup_Buffer(enc);
01067         }
01068 
01069         // オリジナルを呼び出し形式へ
01070         if (mthd==JBXL_FIO_BASE64) {
01071             buf = encode_base64_Buffer(tmp);
01072         }
01073         else {
01074             buf = dup_Buffer(tmp);
01075         }
01076         free_Buffer(&tmp);
01077     }
01078 
01079     *mode = (unsigned int)tag.buf[0];    // データ種別
01080     free_Buffer(&enc);
01081     free_Buffer(&tag);
01082 
01083     return  buf;
01084 }

Here is the call graph for this function:

Here is the caller graph for this function:

int replace_item_tList ( tList list,
char *  key,
int  no,
char  deli,
int  nm,
char *  srcval,
char *  value 
)

int replace_item_tList(tList* list, char* key, int no, char deli, int nm, char* srcval, char* value)

key をキーにした no番目のノードの値の中で,deliを区切りにした nm番目の項目(文字列)の srcval部分を valueで置き換える.

Parameters:
list 検索対象のヘッダ情報を格納したリスト
key ヘッダ種別.
no 同じヘッダ種別が複数ある場合,何番目のノードかを指定する.1から数える. noが 0以下の場合は keyが一致する全てのノードに対して操作を行う.
deli ノード値(文字列)の区切り文字.
nm deli を区切り文字として何番目の項目か? 1から数える.
srcval 置き換え対象の文字列.NULLなら指定した項目の文字列全体
value 置き換える文字列.
Returns:
置き換えを行ったノード数.

Definition at line 1777 of file xtools.c.

References JBXL_ARGS_ERROR, replace_item_tList_node(), set_item_tList(), and strncasecmp_tList().

01778 {
01779     int    cn = 0;
01780     tList* lp;
01781 
01782     if (list==NULL || key==NULL || value==NULL) return JBXL_ARGS_ERROR;
01783     if (srcval==NULL) {
01784         return     set_item_tList(list, key, no, deli, nm, value);
01785     }
01786 
01787     if (no>0) {
01788         lp = strncasecmp_tList(list, key, 0, no);
01789         if (lp!=NULL) {
01790             int rep = replace_item_tList_node(lp, deli, nm, srcval, value);
01791             if (rep) cn = 1;
01792         }
01793     }   
01794     else {      // no<=0
01795         int nn = 1;
01796         cn = 0;
01797         lp = strncasecmp_tList(list, key, 0, nn);
01798         while (lp!=NULL) {
01799             int rep = replace_item_tList_node(lp, deli, nm, srcval, value);
01800             if (rep) cn++;
01801             lp = strncasecmp_tList(list, key, 0, ++nn);
01802         }
01803     }
01804 
01805     return cn;
01806 }

Here is the call graph for this function:

int replace_item_tList_node ( tList lp,
char  deli,
int  nm,
char *  srcval,
char *  value 
)

Definition at line 1809 of file xtools.c.

References cawk_Buffer_dim(), del_Buffer_dim(), FALSE, free_Buffer(), join_Buffer_dim(), replace_sBuffer, set_item_tList_node(), Buffer::state, and TRUE.

Referenced by replace_item_tList().

01810 {
01811     int  rep = FALSE;
01812     char dl[2] = " ";
01813     Buffer* bp;
01814     Buffer  buf;
01815 
01816     if (lp==NULL || value==NULL) return FALSE;
01817     if (nm<=0) nm = 1;
01818     if (srcval==NULL) {
01819         return set_item_tList_node(lp, deli, nm, value);
01820     }
01821 
01822     dl[0] = deli;
01823 
01824     bp = cawk_Buffer_dim(lp->ldat.val, deli);
01825     if (bp!=NULL && bp->state>=nm) {
01826            buf = replace_sBuffer(bp[nm-1], srcval, value);
01827         free_Buffer(&bp[nm-1]);
01828         bp[nm-1] = buf;
01829         free_Buffer(&lp->ldat.val);
01830         lp->ldat.val = join_Buffer_dim(bp, dl);
01831         rep = TRUE;
01832     }
01833     del_Buffer_dim(&bp);
01834 
01835     return rep;
01836 }

Here is the call graph for this function:

Here is the caller graph for this function:

int save_tagged_Buffer ( Buffer  buf,
FILE *  fp,
unsigned int  mode,
int  prfm 
)

int save_tagged_Buffer(Buffer buf, FILE* fp, unsigned int mode, int prfm)

Bufferを指定された形式に従ってタグ付きでファイルに保存する.

Parameters:
buf 保存する情報.
fp ファイルポインタ.
mode 保存するデータの種別と保存方法を JBXL_FIO_ マクロで指定する. ただし,保存方法は現在のところ JBXL_FIO_ORIGINAL, JBXL_FIO_BASE64 のみサポート.
prfm 保存方法に JBXL_FIO_ORIGINAL 以外を指定した場合,その形式に変換するかどうかを指定する. この関数外で,既に変換が完了している場合に FALSE を指定する. (TERUE: 変換する. FALSE: 変換しない)
Return values:
TRUE 成功.
FALSE 失敗.ファイルの内容は保証されない.
Attention:
結局どの形式で保存されるかは,プログラマが保証しなければならない. できるだけデータ形式を指定すべきである.

参考:

tag部  tag.buf[0]  保存データの種別
        tag.buf[1]  保存形式          JBXL_FIO_ORIGINAL, JBXL_FIO_BASE64 をサポート
See also:
xtool.h

Definition at line 980 of file xtools.c.

References Buffer::buf, dup_Buffer(), encode_base64_Buffer(), FALSE, free_Buffer(), JBXL_FIO_BASE64, JBXL_FIO_ORIGINAL, make_Buffer(), save_Buffer2_fp(), TRUE, and Buffer::vldsz.

Referenced by save_DHspki_with_private(), and save_spki_with_ipaddr().

00981 {    
00982     int     cc;
00983     Buffer  tag, enc;
00984 
00985     tag = make_Buffer(2);
00986     if (tag.buf==NULL) return FALSE;
00987     tag.buf[0] = mode & 0x0f;            // データの種別
00988     tag.buf[1] = mode & 0xf0;            // データの形式
00989 
00990     // JBXL_FIO_ORIGINAL, JBXL_FIO_BASE64 以外は未サポート
00991     if (tag.buf[1]==JBXL_FIO_ORIGINAL || !prfm) {
00992         enc = dup_Buffer(buf);
00993     }
00994     else if (tag.buf[1]==JBXL_FIO_BASE64) {
00995         enc = encode_base64_Buffer(buf);
00996     }
00997     else {                            
00998         enc = dup_Buffer(buf);
00999     }
01000 
01001     tag.vldsz = 2;
01002     cc = save_Buffer2_fp(tag, enc, fp); 
01003     free_Buffer(&enc);
01004     free_Buffer(&tag);
01005 
01006     if (!cc) return FALSE;
01007     return  TRUE;
01008 }

Here is the call graph for this function:

Here is the caller graph for this function:

int set_item_tList ( tList list,
char *  key,
int  no,
char  deli,
int  nm,
char *  value 
)

int set_item_tList(tList* list, char* key, int no, char deli, int nm, char* value)

key をキーにした no番目のノードの値の中で,deliを区切りにした nm番目の項目(文字列)に value を設定する.

Parameters:
list 検索対象のヘッダ方向を格納したリスト
key ヘッダ種別.
no 同じヘッダ種別が複数ある場合,何番目のノードかを指定する.1から数える. noが 0以下の場合は keyが一致する全てのノードに対して操作を行う.
deli ノード値(文字列)の区切り文字.
nm deli を区切り文字として何番目の項目か? 1から数える.
value 設定する文字列.
Returns:
設定を行ったノード数.

Definition at line 1704 of file xtools.c.

References JBXL_ARGS_ERROR, set_item_tList_node(), and strncasecmp_tList().

Referenced by replace_item_tList().

01705 {
01706     int    cn = 0;
01707     tList* lp;
01708 
01709     if (list==NULL || key==NULL || value==NULL) return JBXL_ARGS_ERROR;
01710 
01711     if (no>0) {
01712         lp = strncasecmp_tList(list, key, 0, no);
01713         if (lp!=NULL) {
01714             int rep = set_item_tList_node(lp, deli, nm, value);
01715             if (rep) cn = 1;
01716         }
01717     }   
01718     else {      // no<=0
01719         int nn = 1;
01720         cn = 0;
01721         lp = strncasecmp_tList(list, key, 0, nn);
01722         while (lp!=NULL) {
01723             int rep = set_item_tList_node(lp, deli, nm, value);
01724             if (rep) cn++;
01725             lp = strncasecmp_tList(list, key, 0, ++nn);
01726         }
01727     }
01728 
01729     return cn;
01730 }

Here is the call graph for this function:

Here is the caller graph for this function:

int set_item_tList_node ( tList lp,
char  deli,
int  nm,
char *  value 
)

Definition at line 1733 of file xtools.c.

References cawk_Buffer_dim(), del_Buffer_dim(), FALSE, free_Buffer(), join_Buffer_dim(), make_Buffer_bystr, Buffer::state, and TRUE.

Referenced by replace_item_tList_node(), and set_item_tList().

01734 {
01735     int  rep = FALSE;
01736     char dl[2] = " ";
01737     Buffer* bp;
01738 
01739     if (lp==NULL || value==NULL) return FALSE;
01740 
01741     dl[0] = deli;
01742 
01743     bp = cawk_Buffer_dim(lp->ldat.val, deli);
01744     if (bp!=NULL && bp->state>=nm) {
01745         Buffer buf = make_Buffer_bystr(value);
01746         free_Buffer(&bp[nm-1]);
01747         bp[nm-1] = buf;
01748 
01749         free_Buffer(&lp->ldat.val);
01750         lp->ldat.val = join_Buffer_dim(bp, dl);
01751         rep = TRUE;
01752     }
01753     del_Buffer_dim(&bp);
01754 
01755     return rep;
01756 }

Here is the call graph for this function:

Here is the caller graph for this function:

int tcp_recv_Buffer ( int  sock,
Buffer str 
)

int tcp_recv_Buffer(int sock, Buffer* str)

TCP経由でデータを受信する.バッファリングなし.

Parameters:
sock ソケット記述子
str 受信用メッセージバッファへのポインタ.予めバッファ部を確保しておく.
Return values:
1以上 受信したバイト数.
0 正常切断.
JBXL_NET_RECV_ERROR 受信失敗

Definition at line 287 of file xtools.c.

References Buffer::buf, Buffer::bufsz, JBXL_ARGS_ERROR, JBXL_NET_RECV_ERROR, JBXL_NORMAL, Buffer::state, and Buffer::vldsz.

Referenced by recv_http_closed(), tcp_recv_Buffer_tosize(), tcp_recv_crypt_Buffer(), tcp_relay(), and www2browser_relay().

00288 {
00289     int cc;
00290 
00291     if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
00292 
00293     memset(str->buf, 0, str->bufsz);
00294     str->vldsz = 0;
00295     str->state = JBXL_NORMAL;
00296     cc = recv(sock, (char*)str->buf, str->bufsz, 0);
00297 
00298     if (cc>=0) str->vldsz = cc;
00299     else       str->state = cc = JBXL_NET_RECV_ERROR;
00300 
00301     return cc;
00302 }

Here is the caller graph for this function:

int tcp_recv_Buffer_tosize ( int  sock,
Buffer str,
Buffer mod,
int  size 
)

int tcp_recv_Buffer_tosize(int sock, Buffer* str, Buffer* mod, int size)

TCP経由でデータを現データと合わせて size バイトまで受信する.

Parameters:
sock ソケット記述子
str 受信用メッセージバッファへのポインタ.予めバッファ部を確保しておく.
mod size 以上受信した場合はここに保存する.予めメモリを確保しておく.NULL でも OK
size 目標バイト数.
Return values:
1以上 受信したバイト数.
0 正常切断.
JBXL_ARGS_ERROR 引数に NULLのデータがある.
JBXL_NET_RECV_ERROR 受信失敗

Definition at line 415 of file xtools.c.

References Buffer::buf, cat_Buffer(), copy_b2Buffer(), FALSE, free_Buffer(), JBXL_ARGS_ERROR, make_Buffer(), RECVBUFSZ, tcp_recv_Buffer(), TRUE, and Buffer::vldsz.

00416 {
00417     int cc, sz;
00418     int modon = FALSE;
00419 
00420     if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
00421     if (mod!=NULL && mod->buf!=NULL) modon = TRUE;
00422 
00423     if (modon) memset(mod->buf, 0, mod->vldsz);
00424     Buffer buf = make_Buffer(RECVBUFSZ);
00425 
00426     sz = str->vldsz;
00427     while (sz<size) {
00428         cc = tcp_recv_Buffer(sock, &buf);
00429         if (cc>0) {
00430             cat_Buffer(&buf, str);
00431             sz += cc;
00432         }
00433         else {
00434             if (cc<0) sz = cc;
00435             break;
00436         }
00437     }
00438     free_Buffer(&buf);
00439 
00440     if (sz>size && modon) {
00441         copy_b2Buffer((void*)(str->buf+size), mod, sz-size);
00442         str->vldsz = size;
00443     }
00444     return sz;
00445 }

Here is the call graph for this function:

int tcp_recv_Buffer_tosize_wait ( int  sock,
Buffer str,
Buffer mod,
int  size,
int  tm 
)

int tcp_recv_Buffer_tosize_wait(int sock, Buffer* str, Buffer* mod, int size, int tm)

TCP経由でデータを 現データと合わせて size バイトまで受信する.待ち時間(タイムアウト)を指定できる.

タイムアウトの設定が可能.タイムアウトに 0を指定した場合, recv_wait()関数を呼び出した時点で 読み込み可能データがなければすぐにタイムアウトとなる (JBXL_NET_RECV_TIMEOUT が返る).

Parameters:
sock ソケット記述子
str 受信用メッセージバッファへのポインタ.予めバッファ部を確保しておく.
mod size 以上受信した場合はここに保存する.予めメモリを確保しておく.NULL でも OK
size 目標バイト数.
tm タイムアウト時間.秒単位.
Return values:
1以上 受信されたバイト数.
0 受信エラー.おそらくは相手側がセッションをクローズした.
JBXL_ARGS_ERROR 引数に NULLのデータがある.
JBXL_NET_RECV_ERROR 受信エラー.
JBXL_NET_RECV_TIMEOUT タイムアウト.

Definition at line 469 of file xtools.c.

References Buffer::buf, cat_Buffer(), copy_b2Buffer(), FALSE, free_Buffer(), JBXL_ARGS_ERROR, make_Buffer(), RECVBUFSZ, tcp_recv_Buffer_wait(), TRUE, and Buffer::vldsz.

00470 {
00471     int cc, sz;
00472     int modon = FALSE;
00473 
00474     if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
00475     if (mod!=NULL && mod->buf!=NULL) modon = TRUE;
00476 
00477     if (modon) memset(mod->buf, 0, mod->vldsz);
00478     Buffer buf = make_Buffer(RECVBUFSZ);
00479 
00480     sz = str->vldsz;
00481     while (sz<size) {
00482         cc = tcp_recv_Buffer_wait(sock, &buf, tm);
00483         if (cc>0) {
00484             cat_Buffer(&buf, str);
00485             sz += cc;
00486         }
00487         else {
00488             if (cc<0) sz = cc;
00489             break;
00490         }
00491     }
00492     free_Buffer(&buf);
00493 
00494     if (sz>size && modon) {
00495         copy_b2Buffer((void*)(str->buf+size), mod, sz-size);
00496         str->vldsz = size;
00497     }
00498     return sz;
00499 }

Here is the call graph for this function:

int tcp_recv_Buffer_wait ( int  sock,
Buffer str,
int  tm 
)

int tcp_recv_Buffer_wait(int sock, Buffer* str, int tm)

TCP経由でデータを受信する.待ち時間(タイムアウト)を指定できる.

タイムアウトの設定が可能.タイムアウトに 0を指定した場合, recv_wait()関数を呼び出した時点で 読み込み可能データがなければすぐにタイムアウトとなる (JBXL_NET_RECV_TIMEOUT が返る).

Parameters:
sock ソケット記述子
str 受信用メッセージバッファへのポインタ.予めバッファ部を確保しておく.
tm タイムアウト時間.秒単位.
Return values:
1以上 受信されたバイト数.
0 受信エラー.おそらくは相手側がセッションをクローズした.
JBXL_NET_RECV_ERROR 受信エラー.
JBXL_NET_RECV_TIMEOUT タイムアウト.

Definition at line 384 of file xtools.c.

References Buffer::buf, Buffer::bufsz, JBXL_ARGS_ERROR, tcp_recv_wait(), and Buffer::vldsz.

Referenced by command_KEYEX(), recv_http_chunked(), recv_http_chunked_remain(), recv_http_content(), recv_http_header(), recv_mesg_until_end(), send_command_recv_ans(), tcp_recv_Buffer_tosize_wait(), tcp_recv_lines_Buffer(), and tcp_recv_mstream_Buffer().

00385 {
00386     int cc;
00387 
00388     if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
00389 
00390     //memset(str->buf, 0, str->bufsz);
00391     str->vldsz = 0;
00392     cc = tcp_recv_wait(sock, (char*)str->buf, str->bufsz, tm);
00393     if (cc>=0) str->vldsz = cc;
00394 
00395     return cc;
00396 }

Here is the call graph for this function:

Here is the caller graph for this function:

int tcp_recv_lines_Buffer ( int  sock,
Buffer mesg,
int  tm 
)

int tcp_recv_lines_Buffer(int sock, Buffer* mesg, int tm)

TCP経由でメッセージを受信する.

複数行分(\nで終わることが保証される)のデータを取り出さすことのできる簡易バッファ機能付き. ここからさらに一行分のデータを取り出すには,get_line() などを使用する.
また,ネットワークより直接一行づつ取り出すには,tcp_recv_mstream_Buffer() を使うほうが良い.

Parameters:
sock ソケット記述子
mesg 受信用データバッファ.予めメモリを確保しておく.
tm タイムアウト時間.秒単位.
Return values:
1以上 受信されたバイト数.
0 おそらくは相手側がセッションをクローズした.
JBXL_NET_RECV_ERROR 受信エラー.
JBXL_ARGS_ERROR bufがNULL
JBXL_NET_RECV_TIMEOUT タイムアウト.
Bug:
受信データが必ず LFで終わることが保障されている場合にしか使用できない. つまり汎用的には「使えない」

Definition at line 667 of file xtools.c.

References Buffer::buf, cat_Buffer(), CHAR_LF, clear_Buffer(), free_Buffer(), JBXL_ARGS_ERROR, LBUF, make_Buffer(), tcp_recv_Buffer_wait(), and Buffer::vldsz.

00668 {
00669     int    cc;
00670     Buffer buf;
00671 
00672     if (mesg==NULL) return JBXL_ARGS_ERROR;
00673     buf = make_Buffer(LBUF);
00674 
00675     cc = tcp_recv_Buffer_wait(sock, &buf, tm);
00676     while (cc>0) {
00677         cat_Buffer(&buf, mesg);
00678         if (buf.buf[cc-1]==CHAR_LF) break;
00679         clear_Buffer(&buf);
00680         cc = tcp_recv_Buffer_wait(sock, &buf, tm);
00681     }
00682     free_Buffer(&buf);
00683         
00684     if (cc<=0) {
00685         free_Buffer(mesg);
00686         return cc;
00687     }
00688 
00689     return mesg->vldsz;
00690 }

Here is the call graph for this function:

int tcp_recv_mstream_Buffer ( int  sock,
Buffer mesg,
mstream *  sb,
int  tm 
)

int tcp_recv_mstream_Buffer(int sock, Buffer* mesg, mstream* sb, int tm)

TCP経由でメッセージを受信する.

受信メッセージはメッセージストリーム に一旦バッファリングされ,この関数により一行ずつ読み出される.
mesgに格納される時,行中の改行コードは削除され,行末には必ず '\0' が入る.

タイムアウトの設定が可能でタイムアウトに 0を指定した場合, 呼び出した時点で 読み込み可能データがなければすぐにタイムアウトとなる (JBXL_NET_RECV_TIMEOUT が返る).
メッセージストリームのバッファ部が確保されていない場合は,最初に呼び出された時点で確保される.

一旦この関数を使用して,受信データをバッファリングしたら,ソケットをクローズするまで, 読み取りには必ず同じストリームを使用してこの関数を呼び出さばければならない.
そうで無い場合は受信データの整合性は保証されない.

Parameters:
sock ソケット記述子
mesg 受信用データバッファ.バッファ部を確保する必要はない.
sb メッセージバッファ(リング型のストリームバッファ) バッファ部が確保さえていなければ,自動的に確保される.
tm タイムアウト時間.秒単位.
Return values:
1以上 mesgに格納したメッセージのバイト数.
0 おそらくは相手側がセッションをクローズした.
JBXL_NET_RECV_ERROR 受信エラー.
JBXL_ARGS_ERROR 引数に NULLのデータがある.
JBXL_MALLOC_ERROR メッセージバッファ部が無いので確保しようとしたが,確保に失敗した.
JBXL_NET_BUF_ERROR メッセージバッファにデータは存在するはずだが,原因不明の理由により獲得に失敗した.
JBXL_NET_RECV_TIMEOUT タイムアウト.

Definition at line 612 of file xtools.c.

References Buffer::buf, clear_Buffer(), copy_s2Buffer, free_Buffer(), get_mstream(), JBXL_ARGS_ERROR, JBXL_MALLOC_ERROR, JBXL_NET_BUF_ERROR, LBUF, make_Buffer(), make_mstream, put_mstream(), RECVBUFSZ, tcp_recv_Buffer_wait(), and Buffer::vldsz.

00613 {
00614     int    cc;
00615     unsigned char* pp;
00616 
00617     if (mesg==NULL || sb==NULL) return JBXL_ARGS_ERROR;
00618     *mesg = make_Buffer(LBUF);
00619 
00620     if (sb->buf==NULL) {
00621         *sb = make_mstream(RECVBUFSZ);
00622         if (sb->buf==NULL) return JBXL_MALLOC_ERROR;
00623     }
00624 
00625     while (sb->datano==0) {
00626         cc = tcp_recv_Buffer_wait(sock, mesg, tm);
00627         if (cc<=0) {
00628             free_Buffer(mesg);
00629             return cc;
00630         }
00631         put_mstream(sb, mesg->buf);
00632         clear_Buffer(mesg);
00633     }
00634 
00635     pp = get_mstream(sb);
00636     if (pp==NULL) return JBXL_NET_BUF_ERROR;
00637     copy_s2Buffer((char*)pp, mesg);
00638     free(pp);
00639 
00640     return mesg->vldsz;
00641 }

Here is the call graph for this function:

int tcp_send_Buffer ( int  sock,
Buffer str 
)

int tcp_send_Buffer(int sock, Buffer* str)

TCP経由でデータを送信する.

Parameters:
sock ソケット記述子
str 送信用データバッファ.
Return values:
0以上 送信したバイト数.
JBXL_NET_SEND_ERROR 送信失敗

Definition at line 317 of file xtools.c.

References Buffer::buf, JBXL_ARGS_ERROR, JBXL_NET_SEND_ERROR, and Buffer::vldsz.

Referenced by send_http_Buffer(), send_http_file(), send_http_header(), simple_web_proxy(), tcp_relay(), tcp_send_crypt_Buffer(), and www2browser_relay().

00318 {
00319     int cc;
00320 
00321     if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
00322 
00323     if (str->vldsz<0) str->vldsz = (int)strlen((const char*)str->buf);
00324     cc = send(sock, (char*)str->buf, str->vldsz, 0);
00325 
00326     if (cc<0) cc = JBXL_NET_SEND_ERROR;
00327     return cc;
00328 }

Here is the caller graph for this function:

int tcp_send_sBuffer ( int  sock,
Buffer str 
)

int tcp_send_sBuffer(int sock, Buffer* str)

TCP経由で文字列データを送信する.

Parameters:
sock ソケット記述子
str 送信用データバッファ.
Return values:
0以上 送信バイト数.
-1 失敗 (send()の戻り値).

Definition at line 542 of file xtools.c.

References Buffer::buf, and JBXL_ARGS_ERROR.

Referenced by tcp_send_crypt_sBuffer().

00543 {
00544     int cc;
00545 
00546     if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
00547 
00548     cc = send(sock, (char*)str->buf, (int)strlen((const char*)str->buf), 0);
00549     return cc;
00550 }

Here is the caller graph for this function:

int tcp_send_sBufferln ( int  sock,
Buffer str 
)

int tcp_send_sBufferln(int sock, Buffer* str)

TCPメッセージ(文字列)に改行(\r\n)を付け加えて送信する.

Parameters:
sock ソケット記述子
str 送信用メッセージバッファ.
Return values:
0以上 送信バイト数(改行を含む).
- 1 失敗 (send()の戻り値).

Definition at line 565 of file xtools.c.

References Buffer::buf, cat_s2Buffer, dup_Buffer(), free_Buffer(), and JBXL_ARGS_ERROR.

Referenced by tcp_send_crypt_mesg(), and tcp_send_crypt_sBuffer().

00566 {
00567     int   cc;
00568     Buffer buf;
00569 
00570     if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
00571 
00572     buf = dup_Buffer(*str);
00573     cat_s2Buffer("\r\n", &buf);
00574     cc = send(sock, (char*)buf.buf, (int)strlen((const char*)buf.buf), 0);
00575     free_Buffer(&buf);
00576 
00577     return cc;
00578 }

Here is the call graph for this function:

Here is the caller graph for this function:

int udp_recv_Buffer ( int  sock,
Buffer str,
struct addrinfo *  sv_addr 
)

int udp_recv_Buffer(int sock, Buffer* str, struct addrinfo* sv_addr)

recvform()をラッピングした関数.UDPデータを受信する.

Parameters:
sock ソケット記述子
str 受信用メッセージバッファへのポインタ.予めバッファ部を確保しておく.
sv_addr サーバの情報が格納された addrinfo 構造体へのポインタ.
Return values:
1以上 受信したバイト数.
0 正常切断.
JBXL_ARGS_ERROR 不正な引数
JBXL_NET_RECV_ERROR 受信失敗
See also:
recvform()

Definition at line 221 of file xtools.c.

References Buffer::buf, Buffer::bufsz, JBXL_ARGS_ERROR, JBXL_NET_RECV_ERROR, JBXL_NORMAL, Buffer::state, and Buffer::vldsz.

Referenced by udp_recv_crypt_Buffer().

00222 {
00223     int cc;
00224     socklen_t cadlen;
00225 
00226     if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
00227     if (sv_addr==NULL) return JBXL_ARGS_ERROR;
00228 
00229     cadlen = (int)sv_addr->ai_addrlen;
00230     memset(str->buf, 0, str->bufsz);
00231     str->vldsz = 0;
00232     str->state = JBXL_NORMAL;
00233     cc = recvfrom(sock, (char*)str->buf, str->bufsz, 0, sv_addr->ai_addr, &cadlen);
00234 
00235     if (cc>=0) str->vldsz = cc;
00236     else       str->state = cc = JBXL_NET_RECV_ERROR;
00237 
00238     return cc;
00239 }

Here is the caller graph for this function:

int udp_recv_Buffer_sockaddr_in ( int  sock,
Buffer str,
struct sockaddr_in *  sv_addr 
)

int udp_recv_Buffer_sockaddr_in(int sock, Buffer* str, struct sockaddr_in* sv_addr)

recvform()をラッピングした関数.UDPデータを受信する.IPv4専用.

Parameters:
sock ソケット記述子
str 受信用メッセージバッファへのポインタ.予めバッファ部を確保しておく.
sv_addr サーバの情報が格納された sockaddr_in 構造体へのポインタ.
Return values:
1以上 受信したバイト数.
0 正常切断.
JBXL_ARGS_ERROR 不正な引数
JBXL_NET_RECV_ERROR 受信失敗
See also:
recvform()

Definition at line 41 of file xtools.c.

References Buffer::buf, Buffer::bufsz, JBXL_ARGS_ERROR, JBXL_NET_RECV_ERROR, JBXL_NORMAL, Buffer::state, and Buffer::vldsz.

Referenced by udp_recv_crypt_Buffer_sockaddr_in().

00042 {
00043     int cc, cadlen;
00044 
00045     if (sv_addr==NULL) return JBXL_ARGS_ERROR;
00046 
00047     cadlen = sizeof(*sv_addr);
00048     memset(str->buf, 0, str->bufsz);
00049     str->vldsz = 0;
00050     str->state = JBXL_NORMAL;
00051     cc = recvfrom(sock, (char*)str->buf, str->bufsz, 0, (struct sockaddr*)sv_addr, (socklen_t*)&cadlen);
00052 
00053     if (cc>=0) str->vldsz = cc;
00054     else       str->state = cc = JBXL_NET_RECV_ERROR;
00055 
00056     return cc;
00057 }

Here is the caller graph for this function:

int udp_recv_Buffer_wait ( int  sock,
Buffer str,
struct addrinfo *  sv_addr,
int  tm 
)

int udp_recv_Buffer_wait(int sock, Buffer* str, struct addrinfo* sv_addr, int tm)

UDP経由でデータを受信する.待ち時間(タイムアウト)を指定できる.

タイムアウトの設定が可能.タイムアウトに 0を指定した場合, recv_wait()関数を呼び出した時点で読み込み可能データがなければ すぐにタイムアウトとなる (JBXL_NET_RECV_TIMEOUT が返る).

Parameters:
sock ソケット記述子
str 受信用メッセージバッファ.予めメモリを確保しておく.
sv_addr サーバの情報が格納された sockaddar_in 構造体へのポインタ.
tm タイムアウト時間.秒単位.
Return values:
0以上 受信したバイト数.
JBXL_ARGS_ERROR 不正な引数
JBXL_NET_RECV_ERROR 受信失敗.
JBXL_NET_RECV_TIMEOUT タイムアウト.

Definition at line 350 of file xtools.c.

References Buffer::buf, Buffer::bufsz, JBXL_ARGS_ERROR, udp_recv_wait(), and Buffer::vldsz.

00351 {
00352     int cc;
00353 
00354     if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
00355     if (sv_addr==NULL) return JBXL_ARGS_ERROR;
00356 
00357     //memset(str->buf, 0, str->bufsz);
00358     str->vldsz = 0;
00359     cc = udp_recv_wait(sock, (char*)str->buf, str->bufsz, sv_addr, tm);
00360     if (cc>=0) str->vldsz = cc;
00361 
00362     return cc;
00363 }

Here is the call graph for this function:

int udp_recv_Buffer_wait_sockaddr_in ( int  sock,
Buffer str,
struct sockaddr_in *  sv_addr,
int  tm 
)

int udp_recv_Buffer_wait_sockaddr_in(int sock, Buffer* str, struct sockaddr_in* sv_addr, int tm)

UDP経由でデータを受信する.

タイムアウトの設定が可能.タイムアウトに 0を指定した場合, recv_wait()関数を呼び出した時点で読み込み可能データがなければ すぐにタイムアウトとなる (JBXL_NET_RECV_TIMEOUT が返る).

Parameters:
sock ソケット記述子
str 受信用メッセージバッファ.予めメモリを確保しておく.
sv_addr サーバの情報が格納された sockaddar_in 構造体へのポインタ.
tm タイムアウト時間.秒単位.
Return values:
0以上 受信したバイト数.
JBXL_ARGS_ERROR 不正な引数
JBXL_NET_RECV_ERROR 受信失敗.
JBXL_NET_RECV_TIMEOUT タイムアウト.

Definition at line 135 of file xtools.c.

References Buffer::buf, Buffer::bufsz, JBXL_ARGS_ERROR, udp_recv_wait_sockaddr_in(), and Buffer::vldsz.

00136 {
00137     int cc;
00138 
00139     if (sv_addr==NULL) return JBXL_ARGS_ERROR;
00140 
00141     //memset(str->buf, 0, str->bufsz);
00142     str->vldsz = 0;
00143     cc = udp_recv_wait_sockaddr_in(sock, (char*)str->buf, str->bufsz, sv_addr, tm);
00144     if (cc>=0) str->vldsz = cc;
00145 
00146     return cc;
00147 }

Here is the call graph for this function:

int udp_send_Buffer ( int  sock,
Buffer str,
struct addrinfo *  sv_addr 
)

int udp_send_Buffer(int sock, Buffer* str, struct addrinfo* sv_addr)

sendto() をラッピングした関数.UDP経由でデータを送る.

Parameters:
sock ソケット記述子
str 送信するデータ
sv_addr サーバの情報を格納する addrinfo 構造体へのポインタ.
Return values:
0以上 送信したバイト数.
JBXL_ARGS_ERROR 不正な引数
JBXL_NET_SEND_ERROR 送信失敗
See also:
sendto()

Definition at line 258 of file xtools.c.

References Buffer::buf, JBXL_ARGS_ERROR, JBXL_NET_SEND_ERROR, and Buffer::vldsz.

Referenced by udp_send_crypt_Buffer().

00259 {
00260     int cc;
00261 
00262     if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
00263     if (sv_addr==NULL) return JBXL_ARGS_ERROR;
00264     
00265     if (str->vldsz<0) str->vldsz = (int)strlen((const char*)str->buf);
00266     cc = sendto(sock, (char*)str->buf, str->vldsz, 0, sv_addr->ai_addr, (int)sv_addr->ai_addrlen);
00267 
00268     if (cc<0) cc = JBXL_NET_SEND_ERROR;
00269 
00270     return cc;
00271 }

Here is the caller graph for this function:

int udp_send_Buffer_sockaddr_in ( int  sock,
Buffer str,
struct sockaddr_in *  sv_addr 
)

int udp_send_Buffer_sockaddr_in(int sock, Buffer* str, struct sockaddr_in* sv_addr)

sendto() をラッピングした関数.UDP経由でデータを送る.IPv4専用.

Parameters:
sock ソケット記述子
str 送信するデータ
sv_addr サーバの情報を格納する sockaddr_in 構造体へのポインタ.
Return values:
0以上 送信したバイト数.
JBXL_ARGS_ERROR 不正な引数
JBXL_NET_SEND_ERROR 送信失敗
See also:
sendto()

Definition at line 76 of file xtools.c.

References Buffer::buf, JBXL_ARGS_ERROR, JBXL_NET_SEND_ERROR, and Buffer::vldsz.

Referenced by udp_send_crypt_Buffer_sockaddr_in().

00077 {
00078     int cc;
00079 
00080     if (sv_addr==NULL) return JBXL_ARGS_ERROR;
00081     
00082     if (str->vldsz<0) str->vldsz = (int)strlen((const char*)str->buf);
00083     cc = sendto(sock, (char*)str->buf, str->vldsz, 0, (struct sockaddr*)sv_addr, sizeof(*sv_addr));
00084 
00085     if (cc<0) cc = JBXL_NET_SEND_ERROR;
00086     return cc;
00087 }

Here is the caller graph for this function:

int udp_send_sBuffer ( int  sock,
Buffer str,
struct addrinfo *  sv_addr 
)

int udp_send_sBuffer(int sock, Buffer* str, struct addrinfo* sv_addr)

UDP経由で文字列データを送る.

Parameters:
sock ソケット記述子
str 送信するデータ
sv_addr サーバの情報を格納する addrinfo 構造体へのポインタ.
Return values:
0以上 送信したバイト数.
JBXL_ARGS_ERROR 不正な引数
JBXL_NET_SEND_ERROR 送信失敗

Definition at line 516 of file xtools.c.

References Buffer::buf, JBXL_ARGS_ERROR, and JBXL_NET_SEND_ERROR.

00517 {
00518     int cc;
00519 
00520     if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
00521     if (sv_addr==NULL) return JBXL_ARGS_ERROR;
00522     
00523     cc = sendto(sock, (char*)str->buf, (int)strlen((const char*)str->buf), 0, sv_addr->ai_addr, (int)sv_addr->ai_addrlen);
00524     if (cc<0) cc = JBXL_NET_SEND_ERROR;
00525 
00526     return cc;
00527 }

int udp_send_sBuffer_sockaddr_in ( int  sock,
Buffer str,
struct sockaddr_in *  sv_addr 
)

int udp_send_sBuffer_sockaddr_in(int sock, Buffer* str, struct sockaddr_in* sv_addr)

UDP経由で文字列データを送る.IPv4専用.

Parameters:
sock ソケット記述子
str 送信するデータ
sv_addr サーバの情報を格納する sockaddr_in 構造体へのポインタ.
Return values:
0以上 送信したバイト数.
JBXL_ARGS_ERROR 不正な引数
JBXL_NET_SEND_ERROR 送信失敗

Definition at line 104 of file xtools.c.

References Buffer::buf, JBXL_ARGS_ERROR, and JBXL_NET_SEND_ERROR.

00105 {
00106     int cc;
00107 
00108     if (sv_addr==NULL) return JBXL_ARGS_ERROR;
00109     
00110     cc = sendto(sock, (char*)str->buf, (int)strlen((const char*)str->buf), 0, (struct sockaddr*)sv_addr, sizeof(*sv_addr));
00111     if (cc<0) cc = JBXL_NET_SEND_ERROR;
00112 
00113     return cc;
00114 }


Generated on 15 Nov 2023 for JunkBox_Lib by  doxygen 1.6.1