PDA

View Full Version : [C] problema getopt()


Cory
30-04-2011, 20:50
Ciao a tutti, sto programmando un'utility in C che simuli il comportamento di ln di Linux. In sè nulla di difficile, ma ho seri problemi a gestire l'ordine dell'input: il mio problema è che il comando

ln -s file1 file2

deve anche funzionare dando in input

ln file1 -s file2

vi posto il codice ed evidenzio la linea che non capisco come modificare


#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
#include "fun_list.h"

int main(int argc, char **argv){


int ch;
int option_index=0;

/*
switch per le opzioni
*/
while((ch=getopt(argc,argv,"b:f:hvs:"))!=-1){ /*TODO: controllare bene quali opzioni vogliono parametri (:)*/

switch(ch){

case 'b':
/*TODO: fa backup del file*/
break;

case 'f':
/*TODO: rimuove file destinazione esistenti*/;
break;

case 'h':

/*
mostra l'help del programma
*/
show_help();
exit(1);
break;

case 'v':

/*
mostra la versione del programma
*/
show_version();
exit(0);
break;

case 's':

/*
crea link simbolico anzichè fisico, se fallisce da messaggio di errore
*/

option_index=2;
break;

case '?':

/*
Se l'opzione scelta non è tra quelle implementate
stampa messaggio di errore e mostra come usare my_ln
*/

show_usage();
exit(-1);
break;

default: break;
}
}

/* se ho meno di due argomenti messaggio di errore e stampo come usare programma */
if(argc<2){

printf("Errore: troppi pochi argomenti\n");
show_usage();
exit(0);
}

/* se non ho opzioni faccio hard linking*/
if((option_index==0)&&(argc==3)){

if(link(argv[1],argv[2])==-1){

perror("Errore:");
exit(-1);
}
}
/* se option_index è settato a 2 e ho 4 argomenti faccio link simbolico */
if((option_index==2)&&(argc==4)){

if(symlink(argv[1],optarg)==-1){

perror("Errore:");
exit(1);
}
}

return 0;
}

optarg è la variabile globale in cui la getopt mi salva il parametro che l'opzione -s richiede, mentre optind dovrebbe essere l'indice del primo argomento di argv che non è un'opzione. E allora perchè usando questo programma con la seguente sintassi

./my_ln file1 -s file2

mi crea un link simbolico da file2 a -s (file che ovviamente non esiste e viene creato appositamente)?
non capisco cosa sbaglio, sono settimane che ci sbatto la testa...grazie a chi vorrà aiutarmi

Cory
02-05-2011, 12:12
provo ad uppare..