#include #include #include "libpq-fe.h" #include #include #include #include #include #define BDD_PASS_FILE "/srv/bdd/pipi-system.pass" #define BDD_CONN_LENGTH 255 #define CGITRC_BASE_FILE "/srv/etc/cgitrc.base" int main(int argc, char **argv) { char connInfo[BDD_CONN_LENGTH] = "dbname='pipi' user=pipisys password='"; FILE *dbPassFile; char ch; int pos = strlen(connInfo); PGconn *conn; PGresult *res; int i; // Affichage de la première partie du rc FILE* fd = fopen(CGITRC_BASE_FILE, "rb"); if (fd == NULL) { fprintf(stderr,"Z'arrive pas à ouvrir le fichier '%s' : %s\n", CGITRC_BASE_FILE, strerror(errno)); return 1; } char c = fgetc(fd); while (!feof(fd)) { printf ("%c", c); c = fgetc(fd); } fclose(fd); printf("## Maintenant les repos ##\n\n"); // Récupère le mdp à la BDD dbPassFile = fopen(BDD_PASS_FILE,"r"); if (dbPassFile == NULL) { fprintf(stderr,"Cannot open file %s, on peut pas se connecter à la base de données pour lister les clés en tant que %d -> fopen error %d\n", BDD_PASS_FILE,geteuid(),errno); return 1; } while (feof(dbPassFile)) { connInfo[pos] = fgetc(dbPassFile); pos++; } fclose(dbPassFile); connInfo[pos] = '\''; // Connecte à la BDD conn = PQconnectdb(connInfo); if (PQstatus(conn) != CONNECTION_OK) { fprintf(stderr, "Connection to database failed: %s", PQerrorMessage(conn)); PQfinish(conn); return 1; } res = PQexec(conn, "SELECT pg_catalog.set_config('search_path', '', false)"); if (PQresultStatus(res) != PGRES_TUPLES_OK) { fprintf(stderr, "SET failed: %s", PQerrorMessage(conn)); PQclear(res); PQfinish(conn); return 1; } PQclear(res); // Demande les données à la BDD const char const * sqlParamValues[] = {"1"}; res = PQexecParams(conn,"SELECT path,owner,description,logoUrl FROM git.\"ReadableRepos\"($1)",1,NULL,sqlParamValues,NULL,NULL,1); if (PQresultStatus(res) != PGRES_TUPLES_OK) { fprintf(stderr,"Impossible de lancer la requête SQL pour la liste des repos: %s",PQerrorMessage(conn)); PQclear(res); PQfinish(conn); return 1; } // Renvoie le résultat à travers stdout for (i = 0; i < PQntuples(res); i++) { printf("repo.url=%s\n",PQgetvalue(res,i,0)); printf("repo.path=/srv/git/%s\n",PQgetvalue(res,i,0)); if(PQgetisnull(res,i,1)!=1) printf("repo.owner=%s\n",PQgetvalue(res,i,1)); if(PQgetisnull(res,i,2)!=1) printf("repo.desc=%s\n",PQgetvalue(res,i,2)); if(PQgetisnull(res,i,3)!=1) printf("repo.logo=%s\n",PQgetvalue(res,i,3)); printf("\n"); } PQclear(res); PQfinish(conn); return 0; }