NA01
04-02-2006, 15:53
buon giorno!!!
sto sviluppando un demonuccio in c++. a un certo punto devo fare il parse di un file che ha +/- questo aspetto:
08048000-080d4000 r-xp 00000000 03:02 123521 /usr/sbin/named
080d4000-080d6000 rw-p 0008b000 03:02 123521 /usr/sbin/named
080d6000-08152000 rw-p 080d6000 00:00 0 [heap]
44def000-44e05000 r-xp 00000000 03:02 27248 /lib/ld-2.3.2.so
44e05000-44e06000 rw-p 00015000 03:02 27248 /lib/ld-2.3.2.so
44e08000-44f32000 r-xp 00000000 03:02 77965 /lib/tls/libc-2.3.2.so
44f32000-44f3b000 rw-p 00129000 03:02 77965 /lib/tls/libc-2.3.2.so
44f3b000-44f3d000 rw-p 44f3b000 00:00 0
b7eb4000-b7f17000 rw-p b7eb4000 00:00 0
b7f26000-b7f27000 rw-p b7f26000 00:00 0
bfa11000-bfa27000 rw-p bfa11000 00:00 0 [stack]
ffffe000-fffff000 ---p 00000000 00:00 0 [vdso]
il gioco è tirare fuori il nome del file SOLO SE nella seconda colonna c'è una x.
la soluzione iniziale (funzionante) era questa:
char * Filter::getNextLibrariePath(FILE **file){
char* libraryPath;
char permissions[1024];
char *temp = NULL;
size_t dim;
FILE* proc = *file;
libraryPath = new char[4096];
while(1){
if((fscanf(proc,"%*s %s",permissions)) != 1){
break;
}
if(strstr(permissions,"x") == NULL){
getline(&temp,&dim,proc);
continue;
}
if((fscanf(proc,"%*s %*s %*s %s",libraryPath)) != 1){
break;
}
return libraryPath;
}
return NULL;
}
il problema è che mi serve poterlo fare partendo da una stringa.
allora con è uscito questo:
char * Filter::getNextLibrariePath(char **file){
char* libraryPath;
char permissions[1024];
char** proc = file;
int read;
libraryPath = new char[4096];
while(1){
if((sscanf(*proc,"%*s %s%n",permissions, &read)) != 1){
break;
}
*proc += read;
if(strstr(permissions,"x") == NULL){
char tmp;
while(sscanf(*proc, "%c%n", &tmp, &read) == 1){
*proc += read;
if(tmp == '\n'){
break;
}
}
continue;
}
if((sscanf(*proc,"%*s %*s %*s %s%n",libraryPath, &read)) != 1){
break;
}
*proc += read;
return libraryPath;
}
return NULL;
}
il problema è che ha il bruttissimo vizio di incasinarmi lo stack, e di corrompere il database che gestisce il demone (il return fa un salto a un punto della funzione in cui inizia la sezione critica di scrittura sul database).
io non riesco a trovare il problema....
ciao!
sto sviluppando un demonuccio in c++. a un certo punto devo fare il parse di un file che ha +/- questo aspetto:
08048000-080d4000 r-xp 00000000 03:02 123521 /usr/sbin/named
080d4000-080d6000 rw-p 0008b000 03:02 123521 /usr/sbin/named
080d6000-08152000 rw-p 080d6000 00:00 0 [heap]
44def000-44e05000 r-xp 00000000 03:02 27248 /lib/ld-2.3.2.so
44e05000-44e06000 rw-p 00015000 03:02 27248 /lib/ld-2.3.2.so
44e08000-44f32000 r-xp 00000000 03:02 77965 /lib/tls/libc-2.3.2.so
44f32000-44f3b000 rw-p 00129000 03:02 77965 /lib/tls/libc-2.3.2.so
44f3b000-44f3d000 rw-p 44f3b000 00:00 0
b7eb4000-b7f17000 rw-p b7eb4000 00:00 0
b7f26000-b7f27000 rw-p b7f26000 00:00 0
bfa11000-bfa27000 rw-p bfa11000 00:00 0 [stack]
ffffe000-fffff000 ---p 00000000 00:00 0 [vdso]
il gioco è tirare fuori il nome del file SOLO SE nella seconda colonna c'è una x.
la soluzione iniziale (funzionante) era questa:
char * Filter::getNextLibrariePath(FILE **file){
char* libraryPath;
char permissions[1024];
char *temp = NULL;
size_t dim;
FILE* proc = *file;
libraryPath = new char[4096];
while(1){
if((fscanf(proc,"%*s %s",permissions)) != 1){
break;
}
if(strstr(permissions,"x") == NULL){
getline(&temp,&dim,proc);
continue;
}
if((fscanf(proc,"%*s %*s %*s %s",libraryPath)) != 1){
break;
}
return libraryPath;
}
return NULL;
}
il problema è che mi serve poterlo fare partendo da una stringa.
allora con è uscito questo:
char * Filter::getNextLibrariePath(char **file){
char* libraryPath;
char permissions[1024];
char** proc = file;
int read;
libraryPath = new char[4096];
while(1){
if((sscanf(*proc,"%*s %s%n",permissions, &read)) != 1){
break;
}
*proc += read;
if(strstr(permissions,"x") == NULL){
char tmp;
while(sscanf(*proc, "%c%n", &tmp, &read) == 1){
*proc += read;
if(tmp == '\n'){
break;
}
}
continue;
}
if((sscanf(*proc,"%*s %*s %*s %s%n",libraryPath, &read)) != 1){
break;
}
*proc += read;
return libraryPath;
}
return NULL;
}
il problema è che ha il bruttissimo vizio di incasinarmi lo stack, e di corrompere il database che gestisce il demone (il return fa un salto a un punto della funzione in cui inizia la sezione critica di scrittura sul database).
io non riesco a trovare il problema....
ciao!