#include<stdio.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in_systm.h>
#include<netinet/in.h>
#include<netinet/ip.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>

#include"zither.h"
#include<almemsys/almemsys.h>

// V6 アドレス対応

int neg(char * user, char * neg_filename, unsigned char * chipadd)
{
int ret;
FILE * FP;
int stat;

char * chA;
char * chB;
char * chC;

ret = 0;
stat = 0;


chA = (char *)calloc(IP_LEN, sizeof(char));

if((FP = fopen(neg_filename, "r"))!=NULL){
    while(1){
      // negファイルよりchAに一行書き込み
      chA = safe_fpcat(FP, chA, &stat, BUF_MAX);
      if(stat == -1){
         fprintf(stderr,"neg(): Terminal of file.\n"); 
         break;
         }
      else {
         int po = mem_tcount(chA, ':');
         int sz = strlen(chA);
         int gg = char_count(chA, ':');
         if( NULL != strchr(chA,':') && 3 <= po && po < sz && 5 <= sz && 8 >= gg &&
            1 <= gg && 1 != mem_count(chA, '#')){ 

            // chAと同じだけchB,chCを確保
            chB = (char *)calloc(strlen(chA), sizeof(char));
            chC = (char *)calloc(strlen(chA), sizeof(char));

            // chB にユーザー名が入る
            chB = count_memcpy2(chB, chA, 0, (mem_tcount(chA, ':') - 1));
            // ユーザー名以降のおそらくIPアドレスがchCに入る
            chC = safe_memcpy(chC, (strchr(chA, ':') + 1), BUF_MAX);

	    if(BUF_LEN > strlen(chC) && IP_LEN > strlen(chB)){
               rm_crlf(chB, strlen(chB));
               rm_crlf(chC, strlen(chC));

               // 持ってきたユーザー名とIPがリストにあるかどうかの確認
               if(0 == self_memcmp(chB, (char *)user)){
                  if(0 == self_memcmp(chC, (char *)chipadd)){
                     ret = 1;
                     fprintf(stderr,"neg(): 認証に成功した  USER=%s %s IP=%s %s\n", user, chB, chipadd, chC); 
                     // 認証に成功した場合はその後を見る意味が無いのでブレークする。
                     free(chA);
                     free(chB);
                     free(chC);
                     fclose(FP);
                     return(ret);
                     }
                  else{
            //       fprintf(stderr,"neg(1): 認証に失敗した  USER=%s %s IP=%s %s\n", user, chB, chipadd, chC); 
                     }
                  }
               else{
         //       fprintf(stderr,"neg(2): 認証に失敗した  USER=%s %s IP=%s %s\n", user, chB, chipadd, chC); 
                  }

	       }

            // chB,chCを開放
            free(chB);
            free(chC);
            }
         }
      } 
   fclose( FP );
   }
else {
   fprintf(stderr,"-- NEG FILE NOT OPEN %s\n",neg_filename);
   }

free(chA);
// free(chB);


printf("NEG(): USER=%s IPAD=%s RET=%d\n", user, chipadd, ret);
return(ret);
}





