1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
#include <sys/stat.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#define MAXNAME 100
int p[2];
// Fonction principale
int main(int argc, char **argv){
pipe(p);
//**** Opérations effecutées par le père ****//
//On teste les arguments
if(argc!=3){
printf("Usage: find rep_depart ext \n");
exit(2);
}
// initialisation des variables
struct stat buf;
struct dirent *ent;
char nom[MAXNAME];
char *nomRep = NULL;
DIR *rep = NULL;
char *ext = NULL;
char *tmp = NULL;
int tailleNom = 0;
// On stock l'extension en variable
ext = malloc(strlen(argv[2])*sizeof(char));
strcpy(ext,argv[2]);
printf("extension cherchée : %s\n",ext);
//**** Opérations effecutées par le fils ****//
int f = fork();
if(f==0){
printf("Place au fils !\n");
char *fic=NULL;
int taille=0;
close(p[1]);
read(p[0],&taille,sizeof(int));
fic=malloc(taille*sizeof(char));
read(p[0],&fic,taille);
close(p[0]);
printf("Je suis le fils, ce fichier fait une taille de : %d\n",taille);
printf("Je suis le fils, ce fichier a été lu dans le tube : %s\n",fic);
exit(0);
}
//**** FIN des opérations effecutées par le fils ****//
// On stock le nom du repertoire
nomRep = malloc(strlen(argv[1])*sizeof(char));
strcpy(nomRep,argv[1]);
printf("recherche dans le repertoire : %s\n",nomRep);
//ouverture du dossier
rep = opendir(nomRep);
printf("ouverture du repertoire réussie\n");
//Test si le dossier s'ouvre correctement
if(!rep){
// On signale l'erreur
perror("opendir");
}
// Tant qu'il ya des fichiers
while(ent=(readdir(rep)))
{
// On construit l'adresse du fichier
strcpy(nom,nomRep);
// Si le fichier est différent de ./ ou ../
if(strcmp(ent->d_name,".") && strcmp(ent->d_name,"..")){
strcat(nom,"/");
strcat(nom,ent->d_name);
// On récupère les informations sur le fichier
// lstat permet d'éviter de compter les liens symbolique
if(lstat(nom,&buf)!=-1){
// Si c'est un fichier
if(S_ISREG(buf.st_mode)){
// On stock les caractères après le point
tmp = strrchr(ent->d_name,(int)'.');
// On test si le pointeur n'est pas nul ( Pour les fichiers sans extension)
if(tmp != NULL){
// tmp+1 pour enlever le point
if(!strcmp(ext,tmp+1)){
printf("fichier correspondant : %s\n",nom);
// écriture de l'adresse du fichier dans le tube
close(p[0]);
write(p[1],&nom,strlen(nom));
printf("Adresse du fichier écrite dans le tube: %s\n",nom);
// Opération pour la taille de la chaine
tailleNom = strlen(nom);
write(p[1],&tailleNom,sizeof(int));
printf("Nb de caractères écris dans le tube: %d\n",strlen(nom));
printf("Ce fichier a été copié dans le tube : %s\n",nom);
// On ferme le tube
close(p[1]);
}
}
}
}
}
}//fin du while
// On ferme le repertoire
closedir(rep);
} |