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
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