#include #include #include /* A COMPLETER: ajout de directives #include */ #include #include #include #include #define SCRIPT_NAME "./cartoon.sh" #define BUFFER_SIZE 1024 #define NOMTUBESERVEUR "./client-serveur" /* Appelle le script cartoon.sh * input_filename: nom du fichier image a traiter * output_filename: nom du fichier image resultat */ void create_output_image(const char* input_filename, const char* output_filename) { char command[BUFFER_SIZE]; snprintf(command, BUFFER_SIZE, "%s %s %s", SCRIPT_NAME, input_filename, output_filename); printf("Running command %s\n", command); int ret = system(command); if(ret > 0) { fprintf(stderr, "The command '%s' failed !\n", command); abort(); } } /* Traite une requete */ void traiterRequete(char *requete){ char input_filename[BUFFER_SIZE]; char tube_client[BUFFER_SIZE]; /* crée un fichier temporaire pour stocker le resultat */ char output_filename[BUFFER_SIZE]; sprintf(output_filename, "/tmp/image_XXXXXX.jpeg"); int fd = mkstemps(output_filename, 5); close(fd); /* Analyse de la requete */ sscanf(requete,"%s\n%s", tube_client, input_filename); /* Traitement de la requete */ create_output_image(input_filename, output_filename); /* A COMPLETER: renvoyer output_filename au client */ int fdW = open(tube_client, O_WRONLY); if (fdW == -1) { perror("open(nomTubeClient)"); exit(EXIT_FAILURE); } int nbWrite = write(fdW, output_filename, sizeof(output_filename)); if (nbWrite < sizeof(output_filename)) { perror("pb ecriture sur tube nomme"); } /* Dans cette application, le client ne renvoie pas de requête ultérieure*/ /* nécessitant une réponse ==> On peut fermer ce tube */ close(fdW); } void wait_for_a_client() { char requete[BUFFER_SIZE]; /* A COMPLETER : ouvrir un tube nommé NOMTUBESERVEUR */ int fdR; int nbRead; /* Création du tube nommé côté serveur (qui permettra les communications */ /* client-serveur) */ if (mkfifo(NOMTUBESERVEUR, S_IRUSR|S_IWUSR) < 0) { if (errno != EEXIST) { perror("mkfifo(tube nommé serveur"); exit(EXIT_FAILURE); } else { printf("%s existe deja : on suppose que c'est un pipe nomme\n", NOMTUBESERVEUR); printf("et qu'on peut continuer le programme sans probleme\n"); puts(""); } } /* Ouverture de ce tube nommé */ fdR = open(NOMTUBESERVEUR, O_RDWR); if (fdR == -1) { perror("open(tube nommé)"); exit(EXIT_FAILURE); } /* Attente de requêtes */ do{ /* A COMPLETER: recevoir une requete d'un client */ nbRead = read(fdR, requete, sizeof(requete)); if (nbRead != sizeof(requete)) { perror("read sur tube nomme NOK"); abort(); } /* On traite la requête */ traiterRequete(requete); } while(1); } int main(int argc, char**argv) { wait_for_a_client(); return EXIT_SUCCESS; }