Programme C Linux : fichier de conf spécifique

Programme C Linux : fichier de conf spécifique - C - Programmation

Marsh Posté le 17-03-2006 à 17:07:41    

Slt,
 
Je réécris un soft en C sous Linux (en Fortran avant)
 
Je débute en C
Mon programme s'appelle toto. Je désire sauvegarder un fichier de configuration avec des variables telles que  
chemin1= ...
titi=...
etc= ...
J'ai donc créé un fichier ".toto" comme les fichiers de config que je dépose dans le même répertoire que mon appli : ex : "/usr/DEV/toto/".
 
1) Y a-t-il une api simple qui permet de gérer la lecture et la sauvegarde de paramètres dans un fichier de conf (vu que pas mal de programmes ont un fichier de conf), genre les apis pour lire les fichiers INI sous Windows ?
 
2) sinon je vais utiliser les fonctions C classiques pour lire le fichier (fopen, fgets, etc ...): Comment puis-je en C, récupérer le nom du répertoire où réside le programme toto en cours d'execution pour pouvoir ouvrir le fichier de conf ".toto" dans le même répertoire ?
 
Merci d'avance  [:aztechxx]


---------------
"Comme des pommes d'or sur des ciselures d'argent, Ainsi est une parole dite à propos" (Proverbes de Salomon)
Reply

Marsh Posté le 17-03-2006 à 17:07:41   

Reply

Marsh Posté le 17-03-2006 à 19:44:02    

En général, on met plutot les fichiers de confs dans le répertoire de l utilisateur ($HOME), plutot que là ou le programme s execute.
 
Pour le répertoire utilisateur:

Citation :


       #include <stdlib.h>
       char *getenv(const char *name);


 
A utiliser de la sorte:

Citation :


       char * home=getenv("HOME" );
       if(home && *home) { ... }


 
Pour le répertoire courant:

Citation :


       #include <unistd.h>
       char *getcwd(char *buf, size_t size);
       char *get_current_dir_name(void);
       char *getwd(char *buf);


 

Reply

Marsh Posté le 18-03-2006 à 00:39:26    

Je te remercie beaucoup pour ces informations précieuses ...  ;)  
 
Effectivement je pourrais utiliser getenv pour la recup de Home ... cependant je souhaite que tous les utilisateurs de l'application aient accés à un meme fichier avec des parametres communs
av
Je pense que je vais utiliser les fonctions de recuperation du répertoire courant. Je vois qu'il s'agit d'une lib unistd. Cette lib est elle standard sur tous les linux ? Où peut on, sur quel site, avoir une référence de l'ensemble des libs standards C pour l'environnement Linux, comme la lib unistd ?  
 
Merci ... Je sens que cela avance ...
 
PS : je ne comprend pas le test : if(home && *home) : pourquoi pas tout simplement : if (home) ?  [:aztechxx]  


---------------
"Comme des pommes d'or sur des ciselures d'argent, Ainsi est une parole dite à propos" (Proverbes de Salomon)
Reply

Marsh Posté le 18-03-2006 à 00:40:37    

jipo a écrit :


Effectivement je pourrais utiliser getenv pour la recup de Home ... cependant je souhaite que tous les utilisateurs de l'application aient accés à un meme fichier avec des parametres communs


 
dans ce cas, on le met dans /etc; genre /etc/toto


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 18-03-2006 à 00:58:52    

A quoi correspond etc ? Plutot pourquoi doit etre utilisé ce répertoire en règle général ?
 
J'ai vérifié les fonctions de recuperation du répertoire courant mais je ne suis pas sur qu'elles correspondent à ce que je cherche ... Je ne veux pas le répertoire courant (celui obtenu apres un chdir). Je veux obtenir le répertoire où est installé le programme en cours d'execution ... Les deux répertoires ne sont pas les mêmes : ce n'est pas parce que j'execute un programme que son répertoire hote devient le répertoire courant, n'est-ce pas ?  :hello:    
 
Pouvez-vous me le confirmer ?   :)


---------------
"Comme des pommes d'or sur des ciselures d'argent, Ainsi est une parole dite à propos" (Proverbes de Salomon)
Reply

Marsh Posté le 18-03-2006 à 01:00:35    

jipo a écrit :

A quoi correspond etc ? Plutot pourquoi doit etre utilisé ce répertoire en règle général ?


 
il sert à ranger les fichiers de configurations du système et des application au niveau global (à la différence des configs par utilisateurs,; qui sont dans $HOME


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 18-03-2006 à 01:33:57    

Citation :


Les deux répertoires ne sont pas les mêmes : ce n'est pas parce que j'execute un programme que son répertoire hote devient le répertoire courant, n'est-ce pas ?


 
Tout à fait.
 
Le  répertoire où se situe le programme n est pas très facile à récupérer.
 
Soit il se trouve dans l argument n°0 passé à ton programme par ex.:
/bin/toto
Soit c est un pat hrelatif dans l argument n°0 passé à ton programme par ex.:
../toto
Soit il est trouvé dans la liste des répertoire de la variable d environnement $PATH:
toto
 
Une autre approche, spécifique à linux, est de récupérer les infos du lien /proc/self/exe qui pointe vers le programme en cours d execution:

Citation :


       #include <unistd.h>
       int readlink(const char *path, char *buf, size_t bufsiz);


 
En ce qui concerne la librairie unistd, je n ai aucune idée s il existe un manuel qui liste toutes ses fonctions (en tout cas sous linux).
Très rarement, si j en ai besoin, je regarde directement dans /include/unistd.h (en plus c est instructif), chaque fonction possède un manuel, essaye:
man readlink
et si tu n a pas l habitude de <<man>>, lit:
man man
 
Pour les fichiers ini, il ne me seble pas qu il y ait quelquechose de standard sous linux, mais tu peut utiliser scanf() et printf() si les valeurs que tu va y mettre ont une limite en nombre de caractères, et que les utilisateurs ne viennent pas le bidouiller.

Reply

Marsh Posté le 18-03-2006 à 04:31:59    

jipo a écrit :

Comment puis-je en C, récupérer le nom du répertoire où réside le programme toto en cours d'execution pour pouvoir ouvrir le fichier de conf ".toto" dans le même répertoire ?


Tu ne peux pas. Mais comme d'autres l'ont dit plus haut, c'est de toute façon une mauvaise idée. Le fichier de conf devrait aller sous /etc.

Reply

Marsh Posté le 18-03-2006 à 10:35:28    

jipo a écrit :

je ne comprend pas le test : if(home && *home) : pourquoi pas tout simplement : if (home) ?


C'est une forme simplifiée de

Code :
  1. if (home != NULL && strlen (home) != 0)



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 18-03-2006 à 11:08:41    

Citation :


je ne comprend pas le test : if(home && *home) : pourquoi pas tout simplement : if (home) ?


 
C est un test de validité d une chaîne de caratère. Celà teste si le pointeur retourné est valide, mais aussi si la chaîne n est pas vide, histoire d éviter de coller ``toto.conf`` à une chaîne vide:

Code :
  1. #define TOTO_CONF "toto.conf"
  2. size_t home_len=strlen(home);
  3. char* toto_conf=malloc(sizeof(char)*(len_home+strlen(TOTO_CONF+1)));
  4. strncpy(toto_conf, home, home_len);
  5. strcpy(toto_conf+home_len, TOTO_CONF);
  6. FILE* f_conf=fopen(toto_conf,"r" );
  7. if (f_conf) { ..... }
  8. else { perror(toto_conf); exit(1); }


 
Si $HOME est vide, le fichier ``toto.conf`` peut très probablement être ouvert (avec utilisateur root) dans le répertoire courant, c.à.d. sûrement pas là où il faut.
 
Tester la longeur de la chaîne avec strlen est une autre possibilité puisqu on en a besoin plus tard, mais théoriquement moins efficace puisque (*home) ne teste finalement que le 1er octet (char) au lieu d un mot machine entier (size_t) un appel à strlen et un saut.


Message édité par nargy le 18-03-2006 à 11:13:02
Reply

Marsh Posté le 18-03-2006 à 11:08:41   

Reply

Marsh Posté le 18-03-2006 à 11:53:50    

Merci à tous pour le temps que vous avez pris pour me renseigner ...
SUPER !
J'ai toutes les infos pour progresser ...


---------------
"Comme des pommes d'or sur des ciselures d'argent, Ainsi est une parole dite à propos" (Proverbes de Salomon)
Reply

Marsh Posté le 18-03-2006 à 12:04:18    

OOps!
j ai oublié de traité le cas où $HOME ne contient pas de / final:
 

Code :
  1. #define TOTO_CONF "toto.conf"
  2.     // taille de la chaîne $HOME
  3.     size_t home_len=strlen(home);
  4.     // allouer taille de la chaîne $HOME+taille de toto.conf + 1 slash + 1 zéro final
  5.     char* toto_conf=malloc(sizeof(char)*(len_home+strlen(TOTO_CONF+1+1)));
  6.     // copier $HOME
  7.     strncpy(toto_conf, home, home_len);
  8.     // ajouter slash
  9.     toto_conf[home_len]='/';
  10.     // ajouter toto.conf et zero final
  11.     strcpy(toto_conf+home_len+1, TOTO_CONF);
  12.     // ouvrir fichier
  13.     FILE* f_conf=fopen(toto_conf,"r" );
  14.     if (f_conf) { ..... } // lire ficher
  15.     else { perror(toto_conf); exit(1); } // erreur
  16.     // libérer la mémoire allouée
  17.     free(toto_conf);


 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed