// midget_logi()
// MIDデータベースに検索した名前があるかを確認する。
// 結果
// 無い場合：                新たに作り0を与える、　戻りは　400    400 new connect
// ある場合：                その名前がもってる現在の数字を返す。  200 1
// データベース自体が無い:   500を返す                             500 NG
// 未対応のバージョン：      当然500を返す                         500 not support


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

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



extern pthread_mutex_t name_mutex;
extern global_data_t gd;


int midget_logi(private_data_t * pd)
{
int stat;
int mucount;
int middleid;

mucount = 0;
middleid = -1;

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

int ustat = self_memcmp(pd->rec.user, pd->rec.def_user); 
int astat = self_memcmp(pd->rec.user, "administrator");
int cgstat = self_memcmp(pd->rec.user, "cgiuser");

stat = 0; 

#ifdef MID_BUG
printf("MID_BUG: midget_logi(): in\n");
#endif

// 認証のある普通のユーザーの場合
if(ustat == 0 && astat != 0 && cgstat != 0){ 
  // 送られてきたデータに大きさがある。
   if(2 < strlen(pd->rec.data) || 45 > strlen(pd->rec.data)){

      safe_pthread_mutex_lock(&name_mutex);

      for(mucount = 0; mucount < gd.td.midcount; mucount++){
         if(0 == self_memcmp(gd.td.middle_name[mucount], pd->rec.data)){
            middleid = mucount;
            /* 名前が登録されているので、そのIDを返す */
            #ifdef MID_BUG
            printf("MID_BUG: scan_block(2): MID同じ名前のブロックが既に登録済みです <%s> mucount<%d>\n",
              gd.td.middle_name[mucount], mucount);
            #endif

            swap = safe_sprintf(swap, BUF_LEN,"200 %d\n", gd.td.middle_id[mucount]);
            stat = socket_send(gd.ms.sk[pd->rec.fdno], swap, (pd->life.life_int + pd->life.life_los + 15));

            break;
            }
         } /* for() */


      if(middleid == -1){   /* IDが存在しなかった */
         for(mucount = 0; mucount < gd.td.midcount; mucount++){
            if(gd.td.middle_name[mucount][0] == (char)0x00){
               gd.td.middle_name[mucount] = safe_memcpy(gd.td.middle_name[mucount], pd->rec.data, BUF_MAX);
               gd.td.middle_id[mucount] = 0;
               /* 開いている場所を探して登録する */
               #ifdef MID_BUG
               printf("MID_BUG: scan_block(3): MIDブロック新規に登録しました <%s> mucount<%d>user<%s>count<%d>\n",
               gd.td.middle_name[mucount], mucount, pd->rec.data, gd.td.middle_id[mucount]);
               #endif
               middleid = mucount;

               stat = socket_send(gd.ms.sk[pd->rec.fdno], "400 new connect\n", (pd->life.life_int + pd->life.life_los + 15));

               break;
               }
            } /* for() */
         if(middleid == -1){   /* 開いている場所がないのでこれはエラー */
            fprintf(stderr,"scan_block(): MID上限%dを越えたためブロックが登録出来ません mucount<%d> <%s>\n",
            gd.td.midcount, mucount, pd->rec.data);
            stat = socket_send(gd.ms.sk[pd->rec.fdno], "500 not space\n", (pd->life.life_int + pd->life.life_los + 15));
            }
         }
      pthread_mutex_unlock(&name_mutex);
      }
   else{
      stat = socket_send(gd.ms.sk[pd->rec.fdno], "500 NG NIG command(2).\n", (pd->life.life_int + pd->life.life_los + 15));
      }
  #ifdef LOG_OUT
  safe_pthread_mutex_lock(&con_mutex);
  log_out(gd.fp.con_fd, pd->rec.user, pd->rec.com, pd->rec.data,
   "200 OK It doesn't write it.", (unsigned char *)gd.ms.inip_addr[pd->rec.fdno]);
  pthread_mutex_unlock(&con_mutex);
  #endif
  }
else{
  stat = socket_send(gd.ms.sk[pd->rec.fdno], "500 NG NIG command(3).\n", (pd->life.life_int + pd->life.life_los + 15));
  #ifdef LOG_OUT
  safe_pthread_mutex_lock(&con_mutex);
  log_out(gd.fp.con_fd, pd->rec.user, pd->rec.com, pd->rec.data,
    "500 NG NIG command.", (unsigned char *)gd.ms.inip_addr[pd->rec.fdno]);
  pthread_mutex_unlock(&con_mutex);
  #endif
  } 

#ifdef MID_BUG
printf("MID_BUG: midget_logi(): out\n");
#endif

free(swap);
return(stat);
}









