Bontiv-Sourceer source code viewer
Root | Help
./web-crawler/src/main.c
//Fichier de test, ne fait pas parti du projet.
#include "main.h"
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <signal.h>
#include "bdd-config.h"

void pshutdown()
{
	MYSQL* sql = bdd_connect();
	char* query = malloc(300);

#ifdef DEBUG
	sprintf(query, "DELETE FROM process WHERE process = '%u'", getpid());
#endif
	mysql_query(sql, query);

#ifdef DEBUG
	puts("Shutdown");
#endif
	exit(0);
}

MYSQL *bdd_connect()
{
  MYSQL *sql, *tst;
  sql = mysql_init(NULL);
  if (sql == NULL)
    {
      fprintf(stderr, "Echec d'initialisation SQL: %s\n", mysql_error(sql));
      exit(1);
    }

  mysql_options(sql, MYSQL_READ_DEFAULT_GROUP, "client");
  tst = mysql_real_connect(sql, BDD_HOST, BDD_USER, BDD_PASS, BDD_BASE, 3306, NULL, 0);
  if (tst == NULL)
    {
      fprintf(stderr, "Echec de connexion SQL: %s\n", mysql_error(sql));
      exit(1);
    }
  return sql;
}

void mainloop(MYSQL *sql)
{
  MYSQL_RES *result;
  MYSQL_ROW row;
  char *update;
  update = malloc(300);
  unsigned pid = getpid();
  struct tm *datetime;
  time_t curtime;

  signal(SIGINT, pshutdown);
  signal(SIGTERM, pshutdown);

  sprintf(update, "INSERT INTO process (process, page, start) VALUES (%u, 0, %u)", pid, (unsigned)time(NULL));
  mysql_query(sql, update);

  while (1)
    {
      if(mysql_query(sql, "SELECT pid, url FROM page ORDER BY refresh ASC LIMIT 1"))
	{
	  fprintf(stderr, "Echec de requete: %s\n", mysql_error(sql));
	  exit(1);
	}
      result = mysql_store_result(sql);
      row = mysql_fetch_row(result);
      if (row)
	{
	  sprintf(update, "UPDATE process SET page = '%s' WHERE process = '%u'", row[0], pid);
	  mysql_query(sql, update);
#ifdef DEBUG
	  printf("PID : %s; URL : %s\n", row[0], row[1]);
#endif
	  process_page(sql, row[1], row[0]);
		curtime = time(NULL);
		datetime = gmtime(&curtime);
	  sprintf(update, "UPDATE page SET refresh = '%04d-%02d-%02d %02d:%02d:%02d' WHERE pid = '%s'",
		datetime->tm_year,
		datetime->tm_mon,
		datetime->tm_mday,
		datetime->tm_hour,
		datetime->tm_min,
		datetime->tm_sec,
		row[0]);
	  if (mysql_query(sql, update))
	    fprintf(stderr, "Erreur UPDATE:%s\n", mysql_error(sql));
	}
      mysql_free_result(result);
#ifdef DEBUG
      sleep(1);
#else
      usleep(600);
#endif
    }
}

int main (int argc, char* argv[])
{
  http_page page;
  MYSQL *sql;
  size_t deamon = 0;
  pid_t pid;

  if (argc > 1 && strcmp(argv[1], "daemon") == 0)
	  deamon = 1;
  /* Connect to SQL server */
  sql = bdd_connect();

  /* Start main loop */
  if (deamon)
    {
      if (setuid(PUID) != 0)
	{
	  fputs("Impossible de récupérer les droits d'accès. Etes vous en root ?\n", stderr);
	  exit(1);
	}

      pid = fork();
      if (pid < 0)
	{
	  fputs("Erreur de duplication du processus.", stderr);
	  return -1;
	}
      else if (pid)
	{
	  printf("Child: %d\n", pid);
	  return 0;
	}
    }

  mainloop(sql);
  return 0;
}
Presented with Bontiv-Sourceer