Contrôle Final 1 – Année 2016/2017
- Durée du CF: 1h30
- Tous les documents sont autorisés
- Vous avez à votre disposition le code des fichiers serveur_code_etudiant.h et serveur_code_etudiant.c
Echauffement (4 points)
Pointeurs
Pour cet exercice, on s'intéresse à la liste struct list* client_list initialisée à la ligne 16, et modifiée par la fonction queue_add (ligne 95). On considère que cette liste est dans un état cohérent.
Quel est le type de chacune de ces expressions:
- client_list.next
- client_list->client
- client_list->client->pid
- &client_list->client->client_conn
- client_list.next est invalide (client_list est un pointeur)
- client_list->client est de type client_t*
- client_list->client->pid est de type pid_t
- &client_list->client->client_conn est de type FILE**
/kick (10 points)
Envoi d'un signal (5 points)
On souhaite ajouter la commande /kick qui permet à un utilisateur d'expulser un autre utilisateur. Voici un exemple d'utilisation de la commande:
Implémentez la fonction void process_cmd_kick(client_t* client, char*param);. Cette fonction est appelée depuis handle_incoming_cmd lorsque le serveur reçoit la commande /kick. La fonction process_cmd_kick doit envoyer le signal SIGUSR1 au processus client de l'utilisateur dont le nom est stocké dans le paramètre param. La fonction envoie également à tous les utilisateurs le message "* X was kicked by Y" (où X est le nom de l'utilisateur expulsé et Y le nom de l'utilisateur ayant envoyé la commande /kick).
Réception d'un signal (3 points)
Donnez le code permettant d'exécuter une fonction lorsque le client reçoit le signal SIGUSR1. Donnez également le code la fonction qui affiche un message et termine le processus.
/kickban (2 points)
On souhaite maintenant implémenter la commande /kickban qui, en plus d'expulser un utilisateur, l'empêche de se reconnecter. Pour cela, le nom de l'utilisateur est écrit dans le fichier banned_users.txt. Ce fichier est ensuite consulté à chaque fois qu'il client se connecte.
Donnez le code de la fonction void process_cmd_kickban(client_t* client, char* param).
Cette fonction ajoute le nom de l'utilisateur (stocké dans le paramètre