next   previous   contents

Parsing delle opzioni

 In questa parte del codice sorgente vengono rilevate le opzioni specificate nella linea di comando utilizzata all'avvio di servknock.
 Il programma puo' essere avviato con la seguente linea di comando :

servknock [OPTION] [ -f <conf_file> ]

 Le opzioni che e' possibile specificare sono le seguenti :
 -d : daemon mode. Permette di eseguire il programma come processo demone. In questo caso non e' possibile utilizzare le opzioni verbose e debug
 -D : debug mode . Se viene specificata questa opzione verranno stampate sullo standard output diverse informazioni utili per operazioni di debug, su tutte le operazioni svolte ed i pacchetti analizzati
 -f : permette di specificare un file di configurazione alternativo a quello di default ( /etc/servknock.conf )
 -h : stampa a video una pagina di help
 -V : verbose mode. Specificando l'opzione -V verranno stampate sullo standard output alcune informazioni riassuntive sulle sequenze riconosciute ed i comandi eseguiti.

 Per gestire le opzioni all'interno della linea di comando viene utilizzata la funzione della libreria standard C getopt, i cui parametri sono: argc, argv ed una stringa che serve ad indicare quali siano le opzioni valide. Una volta chiamata, essa esegue la scansione della lista degli argomenti, cercando ogni stringa che cominci per “– “ e ritornando in ogni occasione in cui viene rilevata un'opzione valida.
 Per potere analizzare l'intera linea di comando, getopt viene chiamata piu' volte all'interno di un ciclo while, fino al momento in cui non venga ritornato il valore -1, per indicare che non e' stata trovata piu' alcuna opzione. Negli altri casi invece, la funzione ritorna il valore numerico del carattere, che puo' essere valutato per mezzo di un costrutto switch.

/* parse cmdline */
while ((option = getopt (argc, argv, "f:dhVD?"))!=EOF)
 {//while
 switch (option)
  {//switch
  case 'd':
   daemon_mode=1;
   break;
  case 'D':
   opt_debug=1;
   break;
  case 'f':
   conf_file=malloc(strlen(optarg)+1);
   strcpy(conf_file, optarg);
   break;
  case 'V':
   opt_verbose=1;
   break;
  case 'h':
  case '?': /*unknown option*/
  default: /*Warning falling code*/
   give_help();
   break;
  }//endswitch
 }//endwhile

 Quando specificata l'opzione -d, significa che si desidera eseguire servknock come demone , e quindi e' necessario creare un nuovo processo ricorrendo ad una fork. Il processo figlio creato e' una copia del padre, del quale riceve una copia dei segmenti di testo, dati e stack, ed esegue esattamente lo stesso codice.
 Una volta che il processo padre ha eseguito la fork, viene terminato, in modo che resti solamente il figlio in esecuzione. Per potere verificare da chi dei due processi il programma sta venendo eseguito, si controlla il valore di ritorno della funzione fork, memorizzato nella variabile pid. Tale valore di ritorno e' infatti il pid del figlio per il processo padre, e 0 per il figlio. Nel caso esso sia maggiore di 0, significa che il programma viene eseguito dal padre, che puo' quindi terminare :

/*if in daemon mode fork the process and run it in bg*/
if(daemon_mode)
 {//daemon
 int pid;
 if( opt_debug || opt_verbose )
  {
  printf("You can't use debug or verbose options with daemon mode\n");
  exit(EXIT_FAILURE);
  }

 if( (pid=fork()) < 0 )
  {
  printf("Error can't fork process\n");
  exit(EXIT_FAILURE);
  }
 /*children*/
 if (pid==0)
  {
  /*create new session*/
  setsid();
  }
 /*father*/
 else
  {
  printf("ServKnock, running in background\n");
  exit(EXIT_SUCCESS);
  }
 }//enddaemon

 Infine, se nella linea di comando con cui e' stato invocato il programma non viene specificata l'opzione -f viene utilizzato il file di configurazione di default, ovvero /etc/servknock.conf :

/*if not specified we use standard conf_file*/
if(conf_file==NULL)
 {//conf_file
 char *std_conf="/etc/servknock.conf";
 conf_file=malloc(strlen(std_conf)+1);
 strcpy(conf_file, std_conf);
 }//endconf_file


next   previous   contents