/*
  SUBNET PORT Scanner ( for my SRSS )
  =========================
  Coded by Exoduks - exoduks[at]gmail[dot]com
*/

#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

unsigned int alarm_timeout = 10, temp_threads = 1, max_threads = 10;

struct target_info {
   int port;
   char *server;
}; 

void* check_port(void* data)
{
   int smtp_sock;
   FILE *open_list;
   struct sockaddr_in name;
   struct hostent *smtp_host;
   struct target_info *target;

   memset(target, sizeof(target), 0);
   target = (struct target_info *) data;

   if ((smtp_sock = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
       printf(">> Socket error !\n");
       temp_threads--;
       pthread_exit(NULL);
   }

   smtp_host = gethostbyname(target->server);

   name.sin_family = AF_INET;
   name.sin_addr = *((struct in_addr*) smtp_host->h_addr);
   name.sin_port = htons(target->port);

   printf(">> Checking %s \n", target->server);

   //alarm(alarm_timeout);

   if (connect (smtp_sock, (struct sockaddr*)&name, sizeof(struct sockaddr_in)) == -1) {
//       printf(">> %s - Connection error !\n", target->server); 
    perror("connect");  
 }
   else {
      if ((open_list = fopen("scan.log", "a")) != NULL) {
          fprintf(open_list, "%s:%d\n", target->server, target->port);
          fclose(open_list);
      }
      printf(">> %s - Open port %d\n", target->server, target->port);

   }
   close(smtp_sock);

   temp_threads--;
   pthread_exit(NULL);
} 

int threads_manage(char *server, int port)
{
   int status, thread_id;
   pthread_t  p_thread;
   struct target_info target;

   target.server = server;
   target.port = port;

   if(temp_threads < max_threads) {
      thread_id = pthread_create(&p_thread, NULL, check_port, &target);
      printf("---- KREIRAM THREAD %s\n", target.server);
      printf("---- Trenutno: %d thredova \n", temp_threads);
      temp_threads++;
   }
   else sleep(100);

   return 1;
}

int c_class_gen(char *c_class) {
   int a, b;
   char ip_check[16];

   for(a = 0; a < 255; a++) {
      for(b = 0; b < 255; b++) {
         sprintf(ip_check, "%s.%d.%d", c_class, a, b);
         threads_manage(ip_check, 25);
      }
   }

   return 1;
}


int main(int argc, char *argv[]) {

      c_class_gen(argv[1]);
      return 0;
}



