#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>

extern char **environ;
extern int errno;

#define CHEMIN_AUTORISATIONS "/etc/sush"

int
main (int argc, char **argv)
{
  FILE *fd;
  uid_t uid, euid;
  int isOK = 0;
  char tmpBuff[1024];
  struct stat statbuf;

  if (argc < 2)
    {
      fprintf (stderr, "USAGE : sush nom_du_script param_1 param_2 ...\n");
      return 1;
    }

  memset (&tmpBuff, 0, sizeof(tmpBuff));
   if (! stat(CHEMIN_AUTORISATIONS, &statbuf) ) 
   {
      if (statbuf.st_uid || statbuf.st_gid)
      {
	  fprintf (stderr, "ERREUR : Le fichier de configuration %s doit appartenir à l'utilisateur root (groupe root).\n", CHEMIN_AUTORISATIONS);
	  return 3;
      }
      if (statbuf.st_mode & 0x77)
      {
	  fprintf (stderr, "ERREUR : Le fichier de configuration %s ne doit être accessible qu'à l'utilisateur root (groupe root).\n", CHEMIN_AUTORISATIONS);
	  return 4;
      }
   }
   else
   {
      fprintf (stderr, "ERREUR : Fichier de configuration (%s) inexistant.\n", CHEMIN_AUTORISATIONS);
      return 5;
   }
  
  /* escalade des droits d'exécution (sush est suid root) */
  uid = getuid ();
  euid = geteuid ();
  setreuid (euid, euid);
   
  /* Vérfication de l'autorisation du script à lancer */
  if (!(fd = fopen (CHEMIN_AUTORISATIONS, "r")))
    {
      fprintf (stderr, "ERREUR : Impossible d'ouvrir le fichier de configuration des scripts autorisés (%s).\n", CHEMIN_AUTORISATIONS);
      return 2;
    }
  
  while (!feof (fd))
    {
      fscanf (fd, "%s", tmpBuff);
      if (!strcmp (argv[1], tmpBuff))
	{
	  isOK++;
	  break;
	}
    }  
  fclose (fd);
	  
  if (!isOK)
    {
      fprintf (stderr, "ERREUR : %s n'est pas un script autorisé...\n", argv[1]);
      return 3;
    }

  /* lancement du script */
  sprintf (tmpBuff, "%s", argv[1]);
  execve (tmpBuff, &argv[1], environ);
  printf ("Erreur : %d - %s\n", errno, strerror (errno));
  return errno;
}
