Newsgroup: it.comp.os.linux.development
Titolo: qualcuno mi sa aiutare?

Salve,
sto cercando di realizzare un semplice programmino in grado di fare il 
mount di alcune periferiche.
Sto usando la libreria sys/mount.h
Avrei alcune domande:
1) Quando il mount fallisce mi viene ritornato -1... perfetto... poi su 
man viene detto che in particolare l'errore lo leggo su "errno" ma se 
provo a leggerlo il compilatore mi dice che errno non è stato 
definito... dove sbaglio?
2) Vorrei, attraverso questo mount, fare il mount di un file di immagine 
crittato con AES256. Purtroppo non vedo come specificare a "mount" la 
password per la crittazione/decrittazione. Qualcuno mi sa aiutare 
(magari con un esempio).
Grazie,
    Luca
P.S.: Questo è quanto ho provato sin'ora per il punto 1.
#include <sys/types.h>
#include <unistd.h>
#include <sys/mount.h>
int main(int argc, char * argv[])
{
         int myresult;
         setreuid(0,0);
         myresult = 
mount("/dev/fd0","/mnt/floppy","reiserfs",MS_NOSUID,"rw");
         if (myresult == -1) {printf("error %d",errno);} //Qui il 
compilatore mi dice che "errno" non è stato definito
}

 definito... dove sbaglio?
  #include <errno.h> 
MM

     Luca
hope it helps
Ciao
matic

 funzione che ti permette di eseguire losetup ?
Ok, hmmm il fatto č che "mount" (da linea di comando) č in grado di 
crearsi il loop-device (addirittura di trovarne uno inutilizzato) da 
solo, quindi ho pensato che anche "mount" (da programma) potesse farlo.
A questo punto mi servirebbe sapere il nome della funzione che fa il 
"losetup"... possibilmente su un loop-device inutilizzato altrimenti 
sarň costretto a doverlo chiamare con "system" cosa che vorrei, se 
possibile, evitare.
Ciao,
   Luca

 (magari con un esempio).
fai una pipe e ci leggi e ci scrivi :-)

 e richiamare mount
Eh... non è così semplice...
Il problema sia con mount che con losetup è che chiedono la password. E 
la chiedono con la funzione "getpass" che purtroppo non funziona con le 
pipe (almeno da quello che ho visto in python... in C non saprei nemmeno 
come fare la prova).
Ciao,
   Luca

 non è una libreria, ma è una chiamata a sistema.
imho, e' una libreria che contiene le definizioni di chiamate a sistema
Riccardo

  imho, e' una libreria che contiene le definizioni di chiamate a sistema
"sys/mount.h" NON e` una libreria, poco da discutere.
Dire "includo la libreria stdio" intendendo "#include <stdio.h>"
o variazioni sul tema sono pessime abitudini, retaggio magari
di corsi universitari dove si abbozza troppo.
-- 
Francesco Romani - Ikitt   (signature under [re]construction)
'A geek is someone who spends time being "social" on a computer.'

 di corsi universitari dove si abbozza troppo.
ikitt, grazie per la correzione, ma potresti aggiungere anche cosa E' una
libreria e cosa si intende per #include?
eliminiamo un po' 'sti retaggi universitari :)
Riccardo

 come fare la prova).
ma tu da shell sei capace a montare un volume? bene, quando usai una pipe
fai la stessa identica cosa.

 imho, e' una libreria che contiene le definizioni di chiamate a sistema
la cosa cambia molto se invece di guardare come le invochi nel codice C
guardi cosa viene poi effettivamente compilato nei binari.
Una funzione di libreria non è altro che una call che fa saltare ad un
simbolo e da cui si torna indietro con una ret senza che avvenga nessuna
commutazione di contesto, perché tutto rimane in userspace.
Una chiamata a sistema prevede che venga messo in eax il numero della
chiamata a sistema desiderata e gli altri dati nei registri in base a
come viene richiesto dalle varie syscall e che venga chiamato l'interrupt
0x80. A questo punto avviene la commutazione di contesto da userspace a
kernelspace, il kernel esegue la chiamata a sistema, mette il valore
ritornato in eax e si ricommuta da kernelspace a userspace.
Sono due cose _molto_ diverse.

e cosa si intende per #include?
In due parole: "cerca il file di seguito specificato e copialo
dentro questo". Seguono eventuali manipolazioni del preprocessore.
prova a giocherellare con l'opzione -E di gcc.


 fai la stessa identica cosa.
Il problema non è montare un volume... il problema è montare un volume 
*crittato* ossia un volume che richiede password per essere decrittato.
"mount" usa internamente la funzione "getpass" per leggere la password, 
sfortunatamente, questa funzione, non ammette l'uso di pipe.
Provaci, vedrai che non funziona (ti dice qualcosa del tipo "standard in 
must be a tty").
Ora... io il problema l'ho bene o male risolto aggiungengo a "mount" 
l'opzione "-p 0" che dice a mount "leggi la password dal file-descriptor 
0" che corrisponde allo standard-in.
Purtroppo sono in grado di usare le pipe solo da python, e non da C (non 
posso usare python perché il programma deve essere "suiddato" e questo 
non è possibile con gli script). Anzi... se qualcuno mi mostra un 
esempio in C glie ne sarei grato.
In particolare a me servirebbe fare quello che fa il seguente pezzo di 
programma python:
import popen2
r,w,e = popen2.popen3('mount -t reiserfs ./MyDisks/DiscoCrittato 
./mnt/mydisk -o loop,encryption=AES256,rw -p 0');
w.write('mypassword');
w.close();
for line in e.readlines():
     print 'E: ' + line
for line in r.readlines():
     print 'R: ' + line
r.close();
e.close();
Grazie,
   Luca

    Luca
char buffer[BUFSIZE];
FILE *pipe;
pipe = popen ("mount -t reiserfs ./MyDisks/DiscoCrittato ./mnt/mydisk -o
			loop, encryption=AES256,rw -p 0", "r+");
fprintf (pipe, "%s\n", password);
fread (buffer, 1, BUFSIZE, pipe);
pclose (pipe);
Buttao già al volo, potrebbe avere qualche errorino, però l'idea c'è :-)