Ricerca uid in un testo

di il
6 risposte

Ricerca uid in un testo

Ciao, in Internet ho trovato questo codice per cercare delle note in un file, ma solo quelle scritte dall'utente che sta utilizzando il terminale.
Questa è la funzione di ricerca dell'uid:
int find_usr_note(int fd, int uid)
{
	int note_uid=-1;
	unsigned char byte;
	int lenght;
	
!!!	while (note_uid!=uid) {
		
		if(read(fd, &note_uid, 4)!=4)
		return -1;
		if(read(fd,&byte,1)!=1)
		return -1;
		
		byte=lenght=0;
		while(byte!='\n') {
			
			if(read(fd,&byte,1)!=1)
			return -1;
			lenght++;
		}
	}
	lseek(fd,lenght*-1,SEEK_CUR);
	printf("[DEBUG] found a %d byte note for user id %d\n", lenght, note_uid);
	return lenght;	
}
nella riga dove ci sono i punti di domanda non riesco a capire come faccia a ricercare l'id dell'utente, c'è qualcuno che riuscirebbe a spiegarmelo??

P.S. sono nuovo del sito e potrei aver commesso qualche errore!

6 Risposte

  • Re: Ricerca uid in un testo

    Ciao,

    luca94run ha scritto:


    in Internet ho trovato questo codice per cercare delle note in un file
    "note" di che tipo? In che forma? Facci degli esempi di come e' strutturato il file e di come sono queste "note".

    luca94run ha scritto:


    ma solo quelle scritte dall'utente che sta utilizzando il terminale.
    Perche' chi altro puo' scrivere queste "note"??

    luca94run ha scritto:


    Questa è la funzione di ricerca dell'uid:
    "uid" di chi? Dell'utente? Poi come lo ricavi questo "uid"?

    Cerca di essere il piu' chiaro possibile, inoltre se stai seguendo una traccia precisa (come in un'esercitazione scolastica, per esempio) riportala alla lettera, cosi' risulta tutto piu' chiaro.
    Saluti, netburst.
  • Re: Ricerca uid in un testo

    Ciao,
    io ho imparato un po' del linguaggio C dal libro "L'arte dell'hacking" di Apogeo.

    ora ti posto il codice completo del programma, spero ti aiuti.
    #include <stdio.h>
    #include <string.h>
    #include <fcntl.h>
    #include <sys/stat.h>
    #include <hacking.h>
    
    #define FILENAME "/var/notes"
    
    int print_notes(int,int,char*);
    
    int find_usr_note(int, int);
    int search_note(char *, char *);
    void fatal(char *);
    
    
    int main(int argc, char** argv [])
    { 
    	int uid,printing=1,fd;
    char searchstring[100];
    
    if(argc > 1)
    	strcpy(searchstring,argv[1]);
    	else searchstring [0]=0;
    	
    	uid=getuid();
    	fd=open(FILENAME,O_RDONLY);	
    	if(fd==-1)
    	fatal("in main() while opening file! ");
    	while(printing)
    	printing=print_notes(fd,uid,searchstring);
    	printf("-----[end of note data]-------\n");
    	close(fd);
    }
    int print_notes(int fd, int uid, char *searchstr)
    {
    int note_lenght;
    char byte=0,note_buffer[100];
    
    note_lenght=find_usr_note(fd, uid);
    if(note_lenght == -1)
    return 0;
    
    read(fd, note_buffer, note_lenght);
    note_buffer[note_lenght]=0;
    
    if(search_note(note_buffer,searchstr))
    printf(note_buffer);
    return 1;
    
    }
    
    int find_usr_note(int fd, int uid)
    {
    	int note_uid=-1;
    	unsigned char byte;
    	int lenght;
    	
    	while (note_uid!=uid) {
    		
    		if(read(fd, &note_uid, 4)!=4)
    		return -1;
    		if(read(fd,&byte,1)!=1)
    		return -1;
    		
    		byte=lenght=0;
    		while(byte!='\n') {
    			
    			if(read(fd,&byte,1)!=1)
    			return -1;
    			lenght++;
    		}
    	}
    	lseek(fd,lenght*-1,SEEK_CUR);
    	printf("[DEBUG] found a %d byte note for user id %d\n", lenght, note_uid);
    	return lenght;	
    }
    
    int search_note(char *note, char *keyword)
    {
    	int i, key_lenght,match=0;
    	
    	key_lenght=strlen(keyword);
    	if(key_lenght == 0)
    	return 1;
    	
    	for(i=0; i < strlen(note); i++) {
    		if(note[i]==keyword[match])
    		match++;
    		else {
    			if(note[i]==keyword[0])
    			match=1;
    			else match=0;
    		}
    		if(match==key_lenght)
    		return 1;
    	}
    	return 0;
    }
    
    

    GRAZIE DELL'AIUTO!
  • Re: Ricerca uid in un testo

    Rispondendo alla domanda che fai nel primo post:
    La variabile 'uid' contiene l'id dell'utente che ha lanciato il programma, questo id lo ha ricavato chiamando la funzione getuid().
    La variabile note_uid prendera' un qualche valore durante la lettura su file (con la funzione fread()).

    Rispondendo al tuo ultimo post:
    Credo tu abbia imparato ben poco.
    Saluti, netburst.
  • Re: Ricerca uid in un testo

    Ciao

    se ho ben capito il tuo dubbio è nel merito di questo spezzone di codice

    int find_usr_note(int fd, int uid)
    {
    int note_uid=-1;
    unsigned char byte;
    int lenght;

    while (note_uid!=uid) {

    if(read(fd, &note_uid, 4)!=4)
    return -1;
    if(read(fd,&byte,1)!=1)
    return -1;

    byte=lenght=0;
    while(byte!='\n') {

    if(read(fd,&byte,1)!=1)
    return -1;
    lenght++;
    }
    }
    lseek(fd,lenght*-1,SEEK_CUR);
    printf("[DEBUG] found a %d byte note for user id %d\n", lenght, note_uid);
    return lenght;
    }


    Partiamo da un presupposto , note_uid è un intero ed è importato inizialmente ad 1.
    Detto ciò avviene un ciclo
    il ciclo si blocca restituendo -1 ( quindi dichiarando fallimento ) se non riesce a leggere 4 byte ( a testimonianza che il file è terminato ) o se in alternativa non c'è un byte successivo da leggere oltre i 4 appena letti.
    Al di la di questi "se"
    per ogni ciclo sino a che note_uid non corrisponde a uid ( ricavato dal setuid in un altra funzione, quindi l'uid utente che fa partire il programma), vengono inseriti 4 byte in read_uid e il byte successivo in byte.
    Alla corrispondenza tra read_uid e l'uid dell'utente che ha chiamato il programma, si esce dal ciclo, con il file posizionato dopo i 4 byte dell'uid + un byte.

    Viene per cui azzerati gli interi byte e legnght
    parte un nuovo ciclo
    che cicla sino a che byte non corrisponda al new line
    bla bla bla...
    esce dal ciclo per cui impostando un lenght che identifica lo spazio tra l'uid + 1 byte, ed il new line

    Quindi con lseek, il cursore viene spostato indietro dalla posizione attuale (file posizionato dopo i 4 byte dell'uid + un byte.) di lenght - 1 - quindi proprio sulla fine dell' UID.

    Viene per cui stampata la stringa che dice che è stata trovata una nota di lenght byte per l'uid ....

    da qualche altra parte, leggi con attenzione, sicuramente la nota verrà anche stampata in quanto il cursore è proprio all'inizio di essa.

    ciao
  • Re: Ricerca uid in un testo

    Dopo 1 anno dovrebbe aver risolto non credi?
  • Re: Ricerca uid in un testo

    Grazie il tuo commento è stato prezioso
Devi accedere o registrarti per scrivere nel forum
6 risposte