NA01
13-10-2005, 14:33
salve gente!
ho scritto una bella funzioncina come parte di un progetto che non fa altro che prendere il contenuto di file simili a quello sotto e restituire uno alla volta i percorsi delle librerie condivise (quelle che sulla seconda colonna hanno una x)
08048000-0804f000 r-xp 00000000 03:41 179545 /usr/sbin/cron
0804f000-08050000 rw-p 00007000 03:41 179545 /usr/sbin/cron
08050000-08071000 rw-p 08050000 00:00 0 [heap]
49b26000-49b36000 r-xp 00000000 03:41 167470 /lib/libselinux.so.1
49b36000-49b37000 rw-p 00010000 03:41 167470 /lib/libselinux.so.1
4a19c000-4a1ae000 r-xp 00000000 03:41 179414 /lib/tls/libnsl-2.3.5.so
4a1ae000-4a1b0000 rw-p 00011000 03:41 179414 /lib/tls/libnsl-2.3.5.so
4a1b0000-4a1b2000 rw-p 4a1b0000 00:00 0
4e617000-4e62c000 r-xp 00000000 03:41 20093 /lib/ld-2.3.5.so
4e62c000-4e62e000 rw-p 00014000 03:41 20093 /lib/ld-2.3.5.so
4e742000-4e873000 r-xp 00000000 03:41 166233 /lib/tls/libc-2.3.5.so
4e873000-4e874000 r--p 00130000 03:41 166233 /lib/tls/libc-2.3.5.so
4e874000-4e877000 rw-p 00131000 03:41 166233 /lib/tls/libc-2.3.5.so
4e877000-4e87a000 rw-p 4e877000 00:00 0
4e904000-4e906000 r-xp 00000000 03:41 173226 /lib/tls/libdl-2.3.5.so
4e906000-4e908000 rw-p 00001000 03:41 173226 /lib/tls/libdl-2.3.5.so
b7ea9000-b7eb3000 r-xp 00000000 03:41 51412 /lib/tls/libnss_files-2.3.5.so
b7eb3000-b7eb5000 rw-p 00009000 03:41 51412 /lib/tls/libnss_files-2.3.5.so
b7eb5000-b7ebc000 r-xp 00000000 03:41 51410 /lib/tls/libnss_compat-2.3.5.so
b7ebc000-b7ebe000 rw-p 00006000 03:41 51410 /lib/tls/libnss_compat-2.3.5.so
b7ef5000-b7f16000 rw-p b7ef5000 00:00 0
b7f16000-b7f1d000 r-xp 00000000 03:41 2354 /lib/libpam.so.0.79
b7f1d000-b7f1e000 rw-p 00007000 03:41 2354 /lib/libpam.so.0.79
b7f29000-b7f32000 r-xp 00000000 03:41 51414 /lib/tls/libnss_nis-2.3.5.so
b7f32000-b7f34000 rw-p 00008000 03:41 51414 /lib/tls/libnss_nis-2.3.5.so
b7f34000-b7f36000 rw-p b7f34000 00:00 0
bfe21000-bfe36000 rw-p bfe21000 00:00 0 [stack]
ffffe000-fffff000 ---p 00000000 00:00 0 [vdso]
ora come ora ho una funzione che fa correttamente il lavoro, ma è scritta in modo penoso.
ve la propongo:
char * getNextLibrariePath(FILE **file){
static char buffer[MAX_LINE];
char *temp = NULL;
size_t n;
FILE *proc = *file;
while(1){
if((fscanf(proc,"%s",buffer)) != 1){
break;
}
if((fscanf(proc,"%s",buffer)) != 1){
break;
}
if(strstr(buffer,"x") == NULL){
getline(&temp,&n,proc);
continue;
}
if((fscanf(proc,"%s",buffer)) != 1){
break;
}
if((fscanf(proc,"%s",buffer)) != 1){
break;
}
if((fscanf(proc,"%s",buffer)) != 1){
break;
}
if((fscanf(proc,"%s",buffer)) != 1){
break;
}
return buffer;
}
return NULL;
}
a parte la serie di if e di break/continue che vorrei evitare se si potesse ho dei seri dubbi sull'uso di buffer.
non so quanto sia il limite di lunghezza, e questo mi creerebbe un problema di sicurezza in un demone che deve funzionare da firewall.
idee su come risolvere che non comportino il passaggio al c++ (ho già pensato al port che mi darebbe molti vantaggi anche in altri punti, ma sarebbe tanto lavoro che ritarderebbe ancora l'uscita di una prima versioen anche solo semi funzionante).
ciao!
ho scritto una bella funzioncina come parte di un progetto che non fa altro che prendere il contenuto di file simili a quello sotto e restituire uno alla volta i percorsi delle librerie condivise (quelle che sulla seconda colonna hanno una x)
08048000-0804f000 r-xp 00000000 03:41 179545 /usr/sbin/cron
0804f000-08050000 rw-p 00007000 03:41 179545 /usr/sbin/cron
08050000-08071000 rw-p 08050000 00:00 0 [heap]
49b26000-49b36000 r-xp 00000000 03:41 167470 /lib/libselinux.so.1
49b36000-49b37000 rw-p 00010000 03:41 167470 /lib/libselinux.so.1
4a19c000-4a1ae000 r-xp 00000000 03:41 179414 /lib/tls/libnsl-2.3.5.so
4a1ae000-4a1b0000 rw-p 00011000 03:41 179414 /lib/tls/libnsl-2.3.5.so
4a1b0000-4a1b2000 rw-p 4a1b0000 00:00 0
4e617000-4e62c000 r-xp 00000000 03:41 20093 /lib/ld-2.3.5.so
4e62c000-4e62e000 rw-p 00014000 03:41 20093 /lib/ld-2.3.5.so
4e742000-4e873000 r-xp 00000000 03:41 166233 /lib/tls/libc-2.3.5.so
4e873000-4e874000 r--p 00130000 03:41 166233 /lib/tls/libc-2.3.5.so
4e874000-4e877000 rw-p 00131000 03:41 166233 /lib/tls/libc-2.3.5.so
4e877000-4e87a000 rw-p 4e877000 00:00 0
4e904000-4e906000 r-xp 00000000 03:41 173226 /lib/tls/libdl-2.3.5.so
4e906000-4e908000 rw-p 00001000 03:41 173226 /lib/tls/libdl-2.3.5.so
b7ea9000-b7eb3000 r-xp 00000000 03:41 51412 /lib/tls/libnss_files-2.3.5.so
b7eb3000-b7eb5000 rw-p 00009000 03:41 51412 /lib/tls/libnss_files-2.3.5.so
b7eb5000-b7ebc000 r-xp 00000000 03:41 51410 /lib/tls/libnss_compat-2.3.5.so
b7ebc000-b7ebe000 rw-p 00006000 03:41 51410 /lib/tls/libnss_compat-2.3.5.so
b7ef5000-b7f16000 rw-p b7ef5000 00:00 0
b7f16000-b7f1d000 r-xp 00000000 03:41 2354 /lib/libpam.so.0.79
b7f1d000-b7f1e000 rw-p 00007000 03:41 2354 /lib/libpam.so.0.79
b7f29000-b7f32000 r-xp 00000000 03:41 51414 /lib/tls/libnss_nis-2.3.5.so
b7f32000-b7f34000 rw-p 00008000 03:41 51414 /lib/tls/libnss_nis-2.3.5.so
b7f34000-b7f36000 rw-p b7f34000 00:00 0
bfe21000-bfe36000 rw-p bfe21000 00:00 0 [stack]
ffffe000-fffff000 ---p 00000000 00:00 0 [vdso]
ora come ora ho una funzione che fa correttamente il lavoro, ma è scritta in modo penoso.
ve la propongo:
char * getNextLibrariePath(FILE **file){
static char buffer[MAX_LINE];
char *temp = NULL;
size_t n;
FILE *proc = *file;
while(1){
if((fscanf(proc,"%s",buffer)) != 1){
break;
}
if((fscanf(proc,"%s",buffer)) != 1){
break;
}
if(strstr(buffer,"x") == NULL){
getline(&temp,&n,proc);
continue;
}
if((fscanf(proc,"%s",buffer)) != 1){
break;
}
if((fscanf(proc,"%s",buffer)) != 1){
break;
}
if((fscanf(proc,"%s",buffer)) != 1){
break;
}
if((fscanf(proc,"%s",buffer)) != 1){
break;
}
return buffer;
}
return NULL;
}
a parte la serie di if e di break/continue che vorrei evitare se si potesse ho dei seri dubbi sull'uso di buffer.
non so quanto sia il limite di lunghezza, e questo mi creerebbe un problema di sicurezza in un demone che deve funzionare da firewall.
idee su come risolvere che non comportino il passaggio al c++ (ho già pensato al port che mi darebbe molti vantaggi anche in altri punti, ma sarebbe tanto lavoro che ritarderebbe ancora l'uscita di una prima versioen anche solo semi funzionante).
ciao!