//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; }