JunkBox_Lib++ (for Windows) 1.10.1
Loading...
Searching...
No Matches
ipaddr_tool.cpp File Reference
#include "ipaddr_tool.h"
Include dependency graph for ipaddr_tool.cpp:

Go to the source code of this file.

Functions

tListread_ipaddr_file (char *fn)
 
tListread_ipaddr_fp (FILE *fp)
 
tListto_ipaddress_list (tList *lp)
 
int is_host_in_list (tList *lp, unsigned char *num, char *hname)
 
int is_ipaddr_num_in_list (tList *lp, unsigned char *num)
 
void print_address_in_list (FILE *fp, tList *lp)
 

Function Documentation

◆ is_host_in_list()

int is_host_in_list ( tList * lp,
unsigned char * num,
char * hname )

int is_host_in_list(tList* lp, unsigned char* num, char* hname)

リストlpの キー部に格納されている ホスト情報と num, hname が同じネットワークに属するか どうかをチェックする.num と hname はどちらか一方が指定されていれば十分である.

先ず,lpのキー部(FQDN)と hname が比較される.つまり,キー部がドメイン名の一部の場合は hnameと比較する(後方一致).
次に,lpのキー部がドメイン名でない場合(IPアドレスの場合)は num と比較される.

Parameters
lpチェックするIPアドレス(文字列)の格納されているリスト.
num比較するIPアドレス(1byte unsigned 整数型)4Byte. 8Byte型(addr/mask)でも作動するが,ネットマスク部はされる.
hname比較するホスト名(文字列).通常は numから逆引きされたもの.
Return values
TRUEリスト中に同じネットワークに属するエントリが存在する.
FALSEリスト中に同じネットワークに属するエントリは存在しない.

Definition at line 143 of file ipaddr_tool.cpp.

144{
145 unsigned char* addr;
146
147 if (lp==NULL) return FALSE;
148 if (lp->ldat.key.buf==NULL) return FALSE;
149 if (hname==NULL && num==NULL) return FALSE;
150
151 while (lp!=NULL) {
152 if (lp->ldat.key.buf!=NULL && strlen((const char*)lp->ldat.key.buf)>0) {
153 addr = to_address_num8_ipv4((char*)lp->ldat.key.buf, 0);
154 if (addr==NULL && hname!=NULL) {
155 if (!strnrvscmp((const char*)lp->ldat.key.buf, hname, (int)strlen((const char*)lp->ldat.key.buf))) return TRUE;
156 }
157 else if(addr!=NULL && num!=NULL) {
158 if (is_same_network_num_ipv4(addr, num, &(addr[4]))) return TRUE;
159 }
160 }
161 lp = lp->next;
162 }
163
164 return FALSE;
165}
#define TRUE
Definition common.h:226
#define FALSE
Definition common.h:223
#define is_same_network_num_ipv4(a1, a2, m)
Definition network.h:263
#define to_address_num8_ipv4(a, m)
IPv4 アドレス(文字列)→ [IPv4 アドレス],[ネットマスク](数字8byte)
Definition network.h:249
int strnrvscmp(const char *s1, const char *s2, int n)
文字列 s1と s2を後ろから n文字比較する.一致するなら 0
Definition tools.cpp:674

References FALSE, is_same_network_num_ipv4, strnrvscmp(), to_address_num8_ipv4, and TRUE.

Here is the call graph for this function:

◆ is_ipaddr_num_in_list()

int is_ipaddr_num_in_list ( tList * lp,
unsigned char * num )

int is_ipaddr_num_in_list(tList* lp, unsigned char* num)

リストlpの キー部に格納されている ホスト情報と num が同じネットワークに属するかどうかをチェックする.
リストのキー部がFQDNであってもチェック可能.

Parameters
lpチェックするIPアドレス(文字列)の格納されているリスト.
num比較するIPアドレス(バイナリ)4Byte. 8Byte型(addr/mask)でも作動するが,ネットマスク部は無視される.
Return values
TRUEリスト中に同じネットワークに属するエントリが存在する.
FALSEリスト中に同じネットワークに属するエントリは存在しない.

Definition at line 181 of file ipaddr_tool.cpp.

182{
183 unsigned char* addr;
184
185 if (lp==NULL || num==NULL) return FALSE;
186 if (lp->ldat.key.buf==NULL) return FALSE;
187
188 while (lp!=NULL) {
189 if (lp->ldat.key.buf!=NULL && strlen((const char*)lp->ldat.key.buf)>0) {
190 addr = to_address_num8_ipv4((char*)lp->ldat.key.buf, 1);
191 if (addr!=NULL) {
192 if (is_same_network_num_ipv4(num, addr, &(addr[4]))) return TRUE;
193 }
194 }
195 lp = lp->next;
196 }
197
198 return FALSE;
199}

References FALSE, is_same_network_num_ipv4, to_address_num8_ipv4, and TRUE.

◆ print_address_in_list()

void print_address_in_list ( FILE * fp,
tList * lp )

void print_address_in_list(FILE* fp, tList* lp)

リスト中のドメイン名,またはIPアドレスを表示する. FQDNはIPアドレスに変換して表示する.

Parameters
fp出力先のファイル記述子
lpドメイン名またはIPアドレスをキー部に格納したリストへのポインタ

Definition at line 211 of file ipaddr_tool.cpp.

212{
213 unsigned char* addr;
214
215 while (lp!=NULL) {
216 if (lp->ldat.key.buf!=NULL && strlen((const char*)lp->ldat.key.buf)>0) {
217 addr = to_address_num8_ipv4((char*)lp->ldat.key.buf, 1);
218 if (addr!=NULL) {
219 fprintf(fp, "[%d.%d.%d.%d/%d.%d.%d.%d]\n", addr[0],addr[1],addr[2],addr[3],addr[4],addr[5],addr[6],addr[7]);
220 }
221 else { // 恐らくドメイン名
222 fprintf(fp, "[%s]\n", lp->ldat.key.buf);
223 }
224 }
225 lp = lp->next;
226 }
227 return;
228}

References to_address_num8_ipv4.

◆ read_ipaddr_file()

tList * read_ipaddr_file ( char * fn)

tList* read_ipaddr_file(char* fn)

ファイルから IPアドレスを読み込んで,[IPアドレス]/[ネットマスク] の形式に 変換して,リストに格納する.FQDNはIPアドレスに変換される.
FQDNでないドメイン名,文字列は / 以後を無視して文字列のままリストに格納する.

データの読み取り時に次の処理が行なわれる.

  • 前後の空白,CR,LFは削除される
  • 空行は無視される.
  • # 以降は無視される.
Parameters
fnファイル名
Returns
リストへのポインタ

Definition at line 25 of file ipaddr_tool.cpp.

26{
27 tList* lp;
28 tList* lt;
29
30 lp = read_tList_file(fn, 2);
31 if (lp==NULL) return NULL;
32
33 lt = to_ipaddress_list(lp);
34 del_all_tList(&lp);
35
36 return lt;
37}
tList * to_ipaddress_list(tList *lp)
void del_all_tList(tList **pp)
リストの全ノードの削除.ポインタ ppのノードを含むリスト全体を削除する.
Definition tlist.cpp:769
tList * read_tList_file(const char *fname, int mode)
ファイルから一行ずつ読み込んでリストのキー部に格納.空行はリストに加えない.
Definition tlist.cpp:2127

References del_all_tList(), read_tList_file(), and to_ipaddress_list().

Here is the call graph for this function:

◆ read_ipaddr_fp()

tList * read_ipaddr_fp ( FILE * fp)

tList* read_ipaddr_fp(FILE* fp)

ファイルから IPアドレスを読み込んで,[IPアドレス]/[ネットマスク] の形式に 変換して,リストに格納する.FQDNはIPアドレスに変換される.
FQDNでないドメイン名,文字列は / 以後を無視して文字列のままリストに格納する.

データの読み取り時に次の処理が行なわれる.

  • 前後の空白,CR,LFは削除される
  • 空行は無視される.
  • # で始まる,または 空白(複数)# で始まる行は無視される.
Parameters
fpファイルポインタ
Returns
リストへのポインタ

Definition at line 55 of file ipaddr_tool.cpp.

56{
57 tList* lp;
58 tList* lt;
59
60 lp = read_tList_fp(fp, 1);
61 if (lp==NULL) return NULL;
62
63 lt = to_ipaddress_list(lp);
64 del_all_tList(&lp);
65
66 return lt;
67}
tList * read_tList_fp(FILE *fp, int mode)
ファイルポインタが示すファイルから一行ずつ読み込んでリストのキー部に格納.
Definition tlist.cpp:2158

References del_all_tList(), read_tList_fp(), and to_ipaddress_list().

Here is the call graph for this function:

◆ to_ipaddress_list()

tList * to_ipaddress_list ( tList * lp)

tList* to_ipaddress_list(tList* lp)

リスト中の IPアドレスを [IPアドレス]/[ネットマスク] の形式に 変換して,新しいリストに格納する.FQDNはIPアドレスに変換される.
変換に to_address_num8() を使用.CIDER対応.

FQDNでないドメイン名,文字列は / 以後を無視して文字列のまま 新しいリストに格納する. 後の is_host_in_list()などを高速に行なうための前処理.

Parameters
lp変換前(ファイルなどから読み込んだまま)のデータの入ったリスト
Returns
変換して新しく生成したリスト.

Definition at line 83 of file ipaddr_tool.cpp.

84{
85 unsigned char* num;
86 char* addr;
87 tList* ls = NULL;
88 tList* lt = NULL;
89
90 if (lp==NULL) return NULL;
91 if (lp->ldat.key.buf==NULL) return NULL;
92
93 while (lp!=NULL) {
94 if (lp->ldat.key.buf!=NULL && strlen((const char*)lp->ldat.key.buf)>0) {
95 if ((lp->ldat.key.buf)[0]!='#') {
96 num = to_address_num8_ipv4((char*)lp->ldat.key.buf, 1);
97 if (num!=NULL) {
98 addr = to_address_char8_ipv4(num);
99 free(num);
100 if (addr!=NULL) {
101 ls = add_tList_node_str(ls, addr, NULL);
102 free(addr);
103 } // ここで addr==NULL となる場合はメモリ不足のみ
104 }
105 else {
106 addr = awk((char*)lp->ldat.key.buf, '/', 1);
107 if (addr!=NULL) {
108 int i = 0;
109 while(addr[i]!='\0' && addr[i]!=',' && addr[i]!=' ') i++;
110 addr[i] = '\0';
111 ls = add_tList_node_str(ls, addr, NULL);
112 free(addr);
113 }
114 }
115 if (lt==NULL) lt = ls;
116 }
117 }
118 lp = lp->next;
119 }
120
121 return lt;
122}
#define to_address_char8_ipv4(a)
[IPv4 アドレス],[ネットマスク](数字8byte)→ IPv4 アドレス(文字列)
Definition network.h:251
#define add_tList_node_str(p, k, v)
add_tList_node_bystr()
Definition tlist.h:142
char * awk(char *buf, char cc, int n)
ccを区切り記号として, strのバッファ内の n番目の項目を返す.要 free()
Definition tools.cpp:567

References add_tList_node_str, awk(), to_address_char8_ipv4, and to_address_num8_ipv4.

Referenced by read_ipaddr_file(), and read_ipaddr_fp().

Here is the call graph for this function:
Here is the caller graph for this function: