
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<netdb.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<fcntl.h>

#include<sys/stat.h>
#include<errno.h>

#include"sitar_scan.h"
#include"sitar_com.h"
#include<almemsys/almemsys.h>
#include"jpreturn.h"



/* 
http://test.com:80/index.html などのデータからURLと整数ポート番号とパスに分割する
url_data --->   処理するデータ
url_dom ---->   取り出したホスト名
url_pass --->   取り出したパス
datain ----->   処理するデータの大きさ（BUF_URLを越えないこと）

返り値はポート番号、ポート番号が不正な場合は常に0を返す。

注）書き込まれる変数はBUF_URL以上のサイズをすでに確保してあること。（非動的）
*/



 
int urldompass_port(char * url_data, char * url_dom, char * url_pass, int datain)
{
int ret, pp;
int count, count2;
char sw[BUF_URL];
char * swap = sw;

pp = 0;
ret = -1;


// url_data の大きさ定数を越えない場合
if(datain < BUF_URL && datain > 0){

   memset(swap, 0x00, BUF_URL);

   // url_data の先頭からhttp://が存在する場合
   if(0 == memcmp(url_data, "http://", 7)){
      self_memcpy(swap, url_data + 7, BUF_URL);
      }
   // もしくは url_data の先頭からhttps://が存在する場合
   else if(0 == memcmp(url_data, "https://", 8)){
      self_memcpy(swap, url_data + 8, BUF_URL);
      }
   // どちらもない場合はそのままコピー
   else{
      self_memcpy(swap, url_data, BUF_URL);
      }

   // 以後url_data にかわりswapを使用する

   // swap に / がない場合
   if(NULL == strchr(swap, '/')){
      self_memcpy(url_dom, swap, BUF_URL);
      url_pass[0] = (char)0x00;
      ret = 0;
//    return(ret);
      goto portloop;
      }

   // swap に / がある場合
   else {
      // /でない部分だけurl_domにコピーし、/が来たら終端してぬける
      for(count = 0; datain >= count; count++){
         if(swap[count] != '/'){
            url_dom[count] = swap[count];
            }
         else {
            url_dom[count] = (char)0x00;
            break;
            }
         }
      // /があった場所のさらに先が0x00 でない場合
      count++;
      if(swap[count]!=(char)0x00){
         // データがNULLでない限りurl_passにコピーしNULLを読んだら終端して抜ける
         for(count2 = 0; datain >= count; count++){
            if(swap[count] != (char)0x00){
               url_pass[count2] = swap[count];
               }
            else {
               url_pass[count2] = (char)0x00;
               break;
               }
            count2++;
            } 
         }

      // /があった場所のさらに先が0x00なので、url_passはNULLを返す
      else {
         url_pass[0] = (char)0x00;
         ret = 0;
//       return(ret);
         goto portloop;
         }
      ret = 0;
//    return(ret);
      goto portloop;
      }

   portloop :;    // ポート番号の処理

   // url_dom に:が含まれる場合
   if(NULL != strchr(url_dom, ':')){

      memset(swap, 0x00, BUF_URL);

      // :のある場所をカウント
      pp = mem_tcount(url_dom, ':');
      // port番号らしき記載があった場合
      if(pp > 0 && pp < datain){

         #ifdef URL_BUG
         printf("st = %d las = %d\n", (pp + 1), datain);
         #endif

         memcount_cpm(swap, url_dom, (pp + 1), datain, BUF_URL);
         url_dom[pp] = 0x00;

         // port番号らしきデータを数字に変えてみる

         // バッファの大きさの確認 
         if(0 < (int)strlen(swap) && 6 > (int)strlen(swap)){
            // 整数だけなのか確認
            if(0 == ch_int2(swap)){
               // 整数に変換
               ret = strtol(swap, (char **)NULL, 10);
               }
            // 整数ではないので
            else{
               ret = 0;
               }
            }
         // バッファの大きさが変なので
         else{
            ret = 0;
            }
         }
      // port番号らしき記載がない場合
      else{
         ret = 0;
         }
      }
   // url_dom に:が含まれない場合
   else {
      ret = 0;
      }
   }
else {   // サイズがエラー
   self_memcpy(url_dom, "not_url", BUF_URL);
   ret = -1;
   }

return(ret);
} 



