Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119

    [C] Problema con 'stat' su directory...

    Ciao, faccio una stat su una directory passata da linea di comando e, prima di tentarne la apertura, vorrei controllare che sia effettivamente una directory e che, chi ha lanciato il comando, abbia i diritti per accedervi. In particolare vorrei permettere l'apertura solo se la directory indicata e' accessibile in LETTURA sia al "group" che ad "other". So che il field "st_mode" (Della struct stat) e' quello di riferimento per questa "questione". Ci sono delle macro apposite(S_IRUSR, S_IRGRP, etc.), riferite ai possibili valori di st_mode, con le quali, appunto, poter capire i diritti di accesso della directory. Il problema e' che non so come "utilizzarle"... Pertanto... per controllare che la directory su cui ho fatto la stat sia accessibile in lettura sia a 'group' che ad 'other' quale CONDIZIONE deve valere su st_mode ?!?

    thks

  2. #2
    Utente di HTML.it L'avatar di marco_c
    Registrato dal
    Jun 2004
    Messaggi
    1,047
    (sono anni che non tocco sta roba ma...)
    non e' qualcosa del tipo S_IRUSR = 777 oppure S_IRUSR = 700 ....? come per i file e le cartelle in linux

  3. #3
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    Per sapere se e' una directory o meno puoi fare:

    codice:
    DIR * directory;
    struct dirent * possilbe_subdir;
    int fd;
    struct stat data;
    
    directory = opendir ( directory_path );
    if ( directory == NULL ) {
    	printf ( "Impossibile accedere a %s.\n", directory_path );
    	exit ( 1 );
    }
    
    
    fd = dirfd ( directory );
    chdir ( directory_path );
    
    while ( ( possilbe_subdir = readdir ( directory ) ) != NULL ) {
    	
    	if ( ! strcmp ( possilbe_forum->d_name, ".." ) || ! strcmp ( possilbe_forum->d_name, "." ) )
    			continue;
    		
    	stat ( possilbe_subdir->d_name, &data );
    	if ( S_ISDIR ( data.st_mode ) ) {
    		printf ( "Trovata la sottodirectory %s.\n", possilbe_subdir->d_name );
    	}
    		
    }
    	
    closedir ( directory );
    E' una funzione che ho fatto un paio di giorni fa, l'ho provata un po' e dovrebbe funzionare...
    Se c'e' qualche problema e' colpa dei nomi delle variabili, che ho modificato adesso per far capire meglio il programma...

    Non controlla esplicitamente i permessi, ma prova direttamente ad entrare nella directory e cercare le sottodirectories...

    Funziona cosi':
    prova ad aprire la dir "directory_path"
    se ce la fa ci si sposta dentro ***
    e legge ogni nome di file presente nella directory
    se quel file e' "." (la dir corrente) o ".." (la dir superiore) lo salta
    altrimenti fa lo stat del file trovato
    se e' una dir lo comunica all'utente




    *** E' necessario spostarcisi poiche' quando viene usata la funzione stat che prende come parametro un nome di file, lo va a cercare nella directory corrente.
    Se quindi ti trovi fuori dalla directory dove hai trovato quel file (se ti trovi in una dir dove quel file non e' presente) ti dice che e' un regular file, anche se in realta' non esiste...
    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  4. #4
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119
    Originariamente inviato da /dev/null
    Per sapere se e' una directory o meno puoi fare:

    codice:
    DIR * directory;
    struct dirent * possilbe_subdir;
    int fd;
    struct stat data;
    
    directory = opendir ( directory_path );
    if ( directory == NULL ) {
    	printf ( "Impossibile accedere a %s.\n", directory_path );
    	exit ( 1 );
    }
    
    
    fd = dirfd ( directory );
    chdir ( directory_path );
    
    while ( ( possilbe_subdir = readdir ( directory ) ) != NULL ) {
    	
    	if ( ! strcmp ( possilbe_forum->d_name, ".." ) || ! strcmp ( possilbe_forum->d_name, "." ) )
    			continue;
    		
    	stat ( possilbe_subdir->d_name, &data );
    	if ( S_ISDIR ( data.st_mode ) ) {
    		printf ( "Trovata la sottodirectory %s.\n", possilbe_subdir->d_name );
    	}
    		
    }
    	
    closedir ( directory );
    E' una funzione che ho fatto un paio di giorni fa, l'ho provata un po' e dovrebbe funzionare...
    Se c'e' qualche problema e' colpa dei nomi delle variabili, che ho modificato adesso per far capire meglio il programma...

    Non controlla esplicitamente i permessi, ma prova direttamente ad entrare nella directory e cercare le sottodirectories...

    Funziona cosi':
    prova ad aprire la dir "directory_path"
    se ce la fa ci si sposta dentro ***
    e legge ogni nome di file presente nella directory
    se quel file e' "." (la dir corrente) o ".." (la dir superiore) lo salta
    altrimenti fa lo stat del file trovato
    se e' una dir lo comunica all'utente




    *** E' necessario spostarcisi poiche' quando viene usata la funzione stat che prende come parametro un nome di file, lo va a cercare nella directory corrente.
    Se quindi ti trovi fuori dalla directory dove hai trovato quel file (se ti trovi in una dir dove quel file non e' presente) ti dice che e' un regular file, anche se in realta' non esiste...
    La funzione l'ho gia' fatta e anch'iocredevo funzionasse. Implemento il tutto in maniera ricorsiva. Poi, per testarla un po' meglio ho provato ad eseguirla a partire da / (Figurati...) e dopo una marea di nomi mi ha dato errore su una opendir (No such file or directory). Il file in questione ha come icona un link a directory ma il tipo risulta essere SCONOSCIUTO pertanto la condizione !S_ISDIR(...) e' sempre valida e cosi' mi causa errore nella successiva opendir. Ora provo a ridargli un'occhiata e semmai posto il codice...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.