DanieleC88
30-11-2004, 20:55
Sto creando una piccola libreria in C per facilitare il lavoro agli sviluppatori con le partizioni. Sarà disponibile solo su sistemi GNU/Unix, perchè si basa su GNU parted. Buona parte del codice è tratto e rielaborato da QtParted, il celebre software di partizionamento che cerca di essere simile a PartitionMagic.
Sto però trovando problemi nel crearla, perchè non sono molto esperto nell'uso di GNU libparted, non so come usare autoconf/automake e quindi uso un metodo di installazione abbastanza rozzo, e perchè ancora non me la cavo bene con la risoluzione degli errori e delle eccezioni in C. Se volete aiutarmi, contattatemi qui sul forum (in questa discussione, o in privato, se preferite) o scrivetemi una e-mail a «danielecocca at yahoo dot it».
Sono graditi anche consigli su come gestire il progetto su SourceForge.net (ho aperto il progetto, ma non so come fare l'upload dei files; qualcuno mi aveva consigliato di usare CVS, ma non so farlo: se sapete come usare CVS per questo proposito mandatemi istruzioni!!).
Se non volete aiutarmi nel progetto, almeno aiutatemi con questi errori! :(
Magari anche con un po' di istruzioni su come usare facilmente GDB, o una sua qualche intuitiva interfaccia per XFree86.
Usando il seguente codice, apro una pipe di un eseguibile per leggerne l'output, ma quando cerco di chiudere il relativo FILE * o di leggere una linea di output, ho solo un Segmentation Fault.
Il codice che effettua la chiamata:char * command, * line;
FILE * fp;
line = (char *) malloc(65 * 1024); /* 65 kb di memoria per l'output */
command = (char *) malloc(65 * 1024); /* 65 kb di memoria per la linea di comando */
sprintf(command, "%s %s -L %s", "/sbin/mkfs.ext3", "/home/daniele/virtual-disk", "VirtualDisk");
/* Apertura della pipe */
spec_cmdl_open(fp, command);
/* Lettura di una linea di output */
spec_cmdl_getl(fp, line);
/* Chiusura della pipe */
spec_cmdl_close(fp);
free(command);
free(line);
Il codice di spec_cmdl_....:bool spec_cmdl_open(FILE * pipe, const char * command)
{
char * redirected = (char *) malloc(65 * 1024);
bool redirect;
if (strstr(command, "2>&1") == NULL)
{
sprintf(redirected, "%s 2>&1", command);
redirect = true;
}
pipe = popen(redirect ? redirected : command, "r");
free(redirected);
return (pipe != NULL);
}
int spec_cmdl_close(FILE * pipe)
{
fflush(pipe);
return pclose(pipe);
}
char * spec_cmdl_getl(FILE * pipe, char * buffer)
{
char * line = (char *) malloc(65 * 1024);
fgets(line, sizeof(line), pipe);
buffer = line;
free(line);
return buffer;
/* return fgets(buffer, sizeof(buffer), pipe); */
}
Avviando GDB con "gdb libspec-test" e dando il comando "run" ottengo questa descrizione per il SIGSEGV:Program received signal SIGSEGV, Segmentation fault.
0x400fccd0 in _IO_link_in () from /lib/libc.so.6
Aspetto vostre risposte, magari posterò anche l'intero codice sorgente (un ammasso di bug, direi :)), se sarete interessati.
Sto però trovando problemi nel crearla, perchè non sono molto esperto nell'uso di GNU libparted, non so come usare autoconf/automake e quindi uso un metodo di installazione abbastanza rozzo, e perchè ancora non me la cavo bene con la risoluzione degli errori e delle eccezioni in C. Se volete aiutarmi, contattatemi qui sul forum (in questa discussione, o in privato, se preferite) o scrivetemi una e-mail a «danielecocca at yahoo dot it».
Sono graditi anche consigli su come gestire il progetto su SourceForge.net (ho aperto il progetto, ma non so come fare l'upload dei files; qualcuno mi aveva consigliato di usare CVS, ma non so farlo: se sapete come usare CVS per questo proposito mandatemi istruzioni!!).
Se non volete aiutarmi nel progetto, almeno aiutatemi con questi errori! :(
Magari anche con un po' di istruzioni su come usare facilmente GDB, o una sua qualche intuitiva interfaccia per XFree86.
Usando il seguente codice, apro una pipe di un eseguibile per leggerne l'output, ma quando cerco di chiudere il relativo FILE * o di leggere una linea di output, ho solo un Segmentation Fault.
Il codice che effettua la chiamata:char * command, * line;
FILE * fp;
line = (char *) malloc(65 * 1024); /* 65 kb di memoria per l'output */
command = (char *) malloc(65 * 1024); /* 65 kb di memoria per la linea di comando */
sprintf(command, "%s %s -L %s", "/sbin/mkfs.ext3", "/home/daniele/virtual-disk", "VirtualDisk");
/* Apertura della pipe */
spec_cmdl_open(fp, command);
/* Lettura di una linea di output */
spec_cmdl_getl(fp, line);
/* Chiusura della pipe */
spec_cmdl_close(fp);
free(command);
free(line);
Il codice di spec_cmdl_....:bool spec_cmdl_open(FILE * pipe, const char * command)
{
char * redirected = (char *) malloc(65 * 1024);
bool redirect;
if (strstr(command, "2>&1") == NULL)
{
sprintf(redirected, "%s 2>&1", command);
redirect = true;
}
pipe = popen(redirect ? redirected : command, "r");
free(redirected);
return (pipe != NULL);
}
int spec_cmdl_close(FILE * pipe)
{
fflush(pipe);
return pclose(pipe);
}
char * spec_cmdl_getl(FILE * pipe, char * buffer)
{
char * line = (char *) malloc(65 * 1024);
fgets(line, sizeof(line), pipe);
buffer = line;
free(line);
return buffer;
/* return fgets(buffer, sizeof(buffer), pipe); */
}
Avviando GDB con "gdb libspec-test" e dando il comando "run" ottengo questa descrizione per il SIGSEGV:Program received signal SIGSEGV, Segmentation fault.
0x400fccd0 in _IO_link_in () from /lib/libc.so.6
Aspetto vostre risposte, magari posterò anche l'intero codice sorgente (un ammasso di bug, direi :)), se sarete interessati.