Dernière version: le 24/03/2004.

alink


Organisation

Groupes

Calendrier

Le projet dure environ un mois et demi. Les étudiants sont, pendant cette période, complètement autonomes ; leur seule contrainte est la date de rendu du livrable.

Livrable

Conseils


Technique

Spécification

alink

Un alink, ou active link, ou lien actif, est une extension proposée d'UNIX. Il s'agit d'un nouveau type de fichier, inspiré des liens symboliques (symlinks).

Quand le système résout un symlink, il lit le contenu du fichier, et ce contenu est le résultat souhaité. Quand le système résout un alink, il lit le contenu du fichier ; ce contenu est le chemin d'accès à un programme exécutable, appelé programme d'indirection, situé dans le filesystem. Ce programme est exécuté, et le résultat souhaité est ce qu'il imprime lors de son exécution.

La structure d'un alink est très semblable à celle d'un symlink ; la différence essentielle est que la donnée contenue dans le lien n'est pas le nom de fichier pointé, mais le nom d'un programme qui, exécuté, renverra le nom de fichier pointé. Le chemin d'accès au programme peut être absolu ou relatif à l'emplacement du alink ; de même, le retour du programme peut être absolu ou relatif à l'emplacement du alink.

Le type de fichier alink doit s'intégrer de façon parfaitement transparente dans le système d'exploitation et en particulier dans le système de résolution de liens symboliques. Notamment, la résolution des alinks doit fonctionner dans tous les cas : alink pointant vers un alink ou vers un symlink, symlink pointant vers un alink...

Pour permettre à certains programmes de manipuler des alinks de façon spécifique, deux appels systèmes seront ajoutés au noyau choisi :

L'interface et la sémantique précises de ces nouveaux appels système sont au choix ; chaque choix devra être décrit en détail et justifié. Il est autorisé de modifier la libc du système utilisé, ainsi que de ne pas le faire et de fournir les interfaces C supplémentaires dans une bibliothèque séparée, statique et dynamique. Dans ce cas, le mode opératoire de compilation devra être soigneusement documenté.

Les programmes d'indirection

Un processus d'indirection, instance d'exécution d'un programme d'indirection, doit être considéré comme un fils du programme ayant accédé au alink. Il hérite donc de tout son environnement d'exécution, à deux exceptions près :

Le programme d'indirection prend un argument sur la ligne de commande, qui est le nom de l'alink qui a causé son exécution. Son code de retour doit être 0 pour que l'appel système nécessitant une résolution d'alink retourne avec succès. Tout autre code de retour provoquera un échec de l'appel système ; la variable errno devra alors avoir une valeur significative, justifiée, et conforme à la spécification de l'appel système.

À l'inverse d'un véritable fils du processus appelant, un processus d'indirection doit être parfaitement invisible pour le processus appelant. En particulier, sa mort ne doit jamais provoquer de SIGCHLD, et le PID du processus d'indirection ne doit jamais être renvoyé si le processus appelant effectue un appel système de type wait.

Userland

Afin de permettre la manipulation des alinks, il devra être fourni des utilitaires spécifiques, ou des versions modifiées de certains programmes userland. Les modifications pourront être apportées sur des implémentations existantes de ces programmes, ou bien les programmes pourront être entièrement réécrits, au choix. Les changements de comportement par rapport à la norme ou à l'implémentation existante sont autorisés, pourvu qu'ils soient dûment documentés et justifiés.

Sont obligatoires :

Sont facultatifs :

Indications

Exemple

$ id
uid=588(ska), gid=100(users), groups=100(users)
$ pwd
/home/ska
$ cat mytmp.c
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>

int main ()
{
  struct passwd *pw = getpwuid(getuid()) ;
  if (pw == NULL)
  {
    perror("mytmp: unable to find user name") ;
    if (errno == 0) errno = ENOENT ;
    return errno ;
   /* assuming the kernel interprets the exit code as the right errno to provide */
  }
  printf("/tmp/%s", pw->pw_name) ;
  return 0 ;
}
$ gcc -o bin/mytmp mytmp.c
$ minln -a bin/mytmp kikoo
$ ls -l kikoo
arwxrwxrwx	1 ska	users	9   Mar 16 15:00	kikoo -> bin/mytmp
$ cd kikoo
cd: no such file or directory: kikoo
$ mkdir /tmp/ska
$ cd kikoo
$ pwd
/tmp/ska