Bonjour à tous.
Mon amie n’est pas une fan d’informatique et c’est à moi d’administrer
son poste de travail. Je lui ai installer Fluxbox parce qu’il est
simple et rapide. Je lui mâche donc le travail de construction des
menus, etc…
Mon amie s’est dernièrement (enfin) décidée à utiliser une clé USB et
la mémoire de masse de son téléphone portable.
Néanmoins, Fluxbox ne monte pas automatiquement les supports de masse
amovibles. J’ai alors décidé de lui concocter un menu de
montage/démontage pour chaque support.
Les supports utilisés étant toujours les mêmes, j’ai décidé d’utiliser
la capacité de udev à générer un lien symbolique en fonction de l’UUID
du support concerné.
Une solution simple aurait été d’invoquer à partir du menu Fluxbox un
script à base de pmount/pumont.
Mais, comme j’avais envie de me frotter à la programmation système
(juste l’effleurer), j’ai décidé de programmer cela à l’aide de C/C++.
Je dois admettre que le travail à fournir est largement plus
conséquent qu’avec un script! Mais c’est intéressant.
Bon, tout cela pour écrire que mon problème est le suivant (ce n’est
pas le seul, d’autres vont suivre: Lorsque je lance, via le menu, mon
programme concernant la clé USB, j’ai dans le /proc/mounts
/dev/cle_USB_SanDisk_a_Sabine /media/cle_USB_SanDisk_a_Sabine vfat
rw,noexec,relatime,uid=1001,gid=1001,fmask=0022,dmask=0022,codepage=cp437,iocharset=utf8,shortname=mixed,errors=remount-ro
0 0
Mais dans le /etc/mtab, je n’ai rien de ressemblant. En
fait, rien n’a changé.
Je pourrais ajouter la chaîne à l’aide du programme dans le /etc/mtab
puisque le celui-ci s’exécute sous root (via sudo), mais cela ne me
paraît pas très élégant.
Je vous livre ci-joint, le code du programme de montage. Il est simple
et utilise de fonctions du système les unes après les autres. J’ai
commencé par un exemple donné par MisterFreez et de fils en
aiguilles… Cela a donné ça :
//mount.cpp :
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/mount.h>
#include <linux/fs.h>
#include <errno.h>
#include <string.h>
#include <string>
#include <iostream>
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Button.H>
#include <stdio.h>
#include "../classe_etat_disque_movible/etat_disque_movible.h"
int main(int argc, char **argv) {
using namespace std;
char disque[] = "/dev/cle_USB_SanDisk_a_Sabine" ;
char rep_cible[] = "/media/cle_USB_SanDisk_a_Sabine" ;
char sys_fic[] = "vfat" ;
uid_t uid = 1001 ;
gid_t gid= 1001 ;
if(mkdir(rep_cible, 0777) !=0) {
etat_disque_amovible eda("Le r\351pertoire n'a pas pu \352tre cr\351\351!", strerror(errno)) ;
return Fl::run();
return(-1) ;
}
if(chown(rep_cible, uid, gid) != 0) {
etat_disque_amovible eda("Impossible de changer le nom du r\351pertoire de montage!", strerror(errno)) ;
return Fl::run();
return(-1) ;
}
char option_mount[20] = "uid=" ;
sprintf(option_mount + strlen(option_mount), "%d", uid);
strcat(option_mount, ",gid=") ;
sprintf(option_mount + strlen(option_mount), "%d", gid);
if (mount(disque, rep_cible, sys_fic, MS_NOEXEC, option_mount) != 0){
if(rmdir(rep_cible) !=0) {
etat_disque_amovible eda("Le r\351pertoire de montage n'a pas pu \352tre effac\351!\nVous devrez l'effacer manuellement.", strerror(errno)) ;
return Fl::run();
}
etat_disque_amovible eda("La cl\351 n'a pas pu \352tre mont\351e!\nVeuillez v\351rifier que le support est bien connect\351!", strerror(errno)) ;
return Fl::run();
return(-1) ;
}
}
Une petite boîte de dialogue s’affiche si un problème survient.
etat_disque_movible.h ne sert qu’à construire la boîte de dialogue.
Pour le démontage, le principe reste le même.
En définitive, existe-t-il une façon de dire au noyau de mettre à jour le /etc/mtab ?