/* envoiRep() * Arguments: le nom du repertoire, la socket * valeur renvoyee: true si OK, false si erreur */ bool envoiRep(char *rep, int soc) { DIR *dp; struct dirent *pdi; char buf[1024], nom[1024]; dp = opendir(rep); if (dp == NULL) return false; write(soc, OK200, strlen(OK200)); sprintf(buf, "<html><title>Repertoire %s</title><body>", rep); write(soc, buf, strlen(buf)); sprintf(nom, "<ul>"); while ((pdi = readdir(dp)) != NULL) { /* A completer * Le nom de chaque element contenu dans le repertoire est retrouvable a * l'adresse pdi->d_name. Faites man readdir pour vous en convaincre. * Dans un premier temps, on se contentera de la liste simple. * Dans une petite amelioration on poura prefixer chaque element avec * l'icone folder ou generic en fonction du type du fichier. * (Tester le nom de l'element avec le chemin complet.) */ if(typeFichier(pdi->d_name) == NORMAL) { sprintf(nom, "<li> <img src=\"/icons/generic.gif\"> %s</li>", pdi->d_name); write(soc, nom, strlen(nom)); } else if(typeFichier(pdi->d_name) == REPERTOIRE) { sprintf(nom, "<li> <img src=\"/icons/folder.gif\"> %s</li>", pdi->d_name); write(soc, nom, strlen(nom)); } else{ sprintf(nom, "<li> error </li>"); write(soc, nom, strlen(nom)); } } sprintf(nom, "</ul></body></html>"); write(soc, nom, strlen(nom)); write(soc, "\n\r", 2); return true; }
void communication(int soc, struct sockaddr *from, socklen_t fromlen) { int s; char buf[BUFSIZE]; ssize_t nread; char host[NI_MAXHOST]; bool result; char *pf; enum op { GET, PUT } operation; /* Eventuellement, inserer ici le code pour la reconnaissance de la * machine appelante */ s = getnameinfo(from,fromlen,host,NI_MAXHOST,NULL,0,NI_NUMERICHOST); if(s!=0){ perror("cant not getnameinfo\n"); exit(EXIT_FAILURE); } printf("a client connect -host:%s!!\n",host); /* Reconnaissance de la requete */ nread = read(soc, buf, BUFSIZE); printf("recu:%s\n",buf); if (nread > 0) { if (strncmp(buf, "GET", 3) == 0) operation = GET; } else { perror("Erreur lecture socket"); return; } switch (operation) { case GET: pf = strtok(buf + 4, " "); /* ===little example for strtok()==== printf("=========\n"); while(pf){ printf("%s\n",pf); pf = strtok(NULL," "); } exit(EXIT_SUCCESS); */ /* redireciton???? if(strcmp(pf,"/")==0){ envoiRep(".",soc); } */ /* On pointe alors sur le / de "GET /xxx HTTP... * strtok() rend l'adresse du premier caractere * apres l'espace et termine le mot par '\0' */ pf++; /* pour pointer apres le slash */ /* pf pointe sur le nom du fichier suivant le / de la requete. * Si la requete etait "GET /index.html ...", alors pf pointe sur * le "i" de "index.html" */ //index if(strcmp("index.html",pf)==0){ printf("he wants a index.html.\n"); envoiRep(".",soc); }else{ printf("he wants %s\n",pf); /* si le fichier est un fichier ordinaire, on l'envoie avec la fonction * envoiFichier(). * Si c'est un repertoire, on envoie son listing avec la fonction * envoiRep(). * Vous pouvez utiliser la fonction typeFichier() ci-dessous pour tester * le type du fichier. */ /************ A completer ici**********/ enum TypeFichier typef = typeFichier(pf); switch(typef){ case ERREUR: //perror("error to know stat of the fichier\n"); printf("File not exits\n"); write(soc,ERROR404,strlen(ERROR404)); break; case NORMAL: //file printf("This is normal file\n"); //if true wait to send another one envoiFichier(pf,soc); break; case REPERTOIRE: //directory printf("This is normal directory\n"); envoiRep(pf,soc); break; } } } close(soc); }
void communication(int soc, struct sockaddr_storage from, socklen_t fromlen) { int s; char buf[BUFSIZE]; ssize_t nread; char host[NI_MAXHOST]; bool result; char *pf; enum op { GET, PUT } operation; /* Eventuellement, inserer ici le code pour la reconnaissance de la * machine appelante */ /* Reconnaissance de la machine cliente */ s = getnameinfo((struct sockaddr *)&from, fromlen, host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if (s == 0) printf("Client '%s'\n", host); else fprintf(stderr, "getnameinfo: %s\n", gai_strerror(s)); /* Reconnaissance de la requete */ nread = read(soc, buf, BUFSIZE); if (nread > 0) { if (strncmp(buf, "GET", 3) == 0) operation = GET; } else { perror("Erreur lecture socket"); return; } switch (operation) { case GET: pf = strtok(buf + 4, " "); /* On pointe alors sur le / de "GET /xxx HTTP... * strtok() rend l'adresse du premier caractere * apres l'espace et termine le mot par '\0' */ pf++; /* pour pointer apres le slash */ /* pf pointe sur le nom du fichier suivant le / de la requete. * Si la requete etait "GET /index.html ...", alors pf pointe sur * le "i" de "index.html" */ /* si le fichier est un fichier ordinaire, on l'envoie avec la fonction * envoiFichier(). * Si c'est un repertoire, on envoie son listing avec la fonction * envoiRep(). * Vous pouvez utiliser la fonction typeFichier() ci-dessous pour tester * le type du fichier. */ /************ A completer ici**********/ if(typeFichier(pf) == NORMAL){ envoiFichier(pf,soc); }else if(typeFichier(pf) == REPERTOIRE){ envoiRep(pf,soc); }else{ ; } break; case PUT: perror("service not implmented!"); exit(-1); } close(soc); }