BohShell versione prealpha
Moderatore: Staff
Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
- Blizzard
- Master

- Messaggi: 1509
- Iscritto il: mar 2 gen 2007, 22:53
- Nome Cognome: Giovanni Santostefano
- Slackware: 12.2
- Kernel: 2.6.27.7-smp
- Desktop: Fluxbox
- Contatta:
BohShell versione prealpha
Ciao ragazzi!
Ho appena rilasciato la prealpha della mia shell.
Implementa poco e niente al momento (al limite della redirezione e della pipe).
Tuttavia è nel pieno dello sviluppo e ben lungi dall'essere conclusa.
Per chi vuole spulciare per bene il sorgente è disponibile un file nel tar.gz che contiene la lista dei file in ordine dei quali devono essere letti per capire meglio il flow dell'applicazione.
La shell è rilasciata sotto GPLv3 al sito: https://sourceforge.net/projects/bohsh/
Al momento è in uno stadio più che embrionale con parecchie esaltazioni di instabilità (a dire il vero ne ho viste meno del previsto ma l'ho testata altrettanto)
beh! che dire... spero che vi divertirete
ciao
Gio
Ho appena rilasciato la prealpha della mia shell.
Implementa poco e niente al momento (al limite della redirezione e della pipe).
Tuttavia è nel pieno dello sviluppo e ben lungi dall'essere conclusa.
Per chi vuole spulciare per bene il sorgente è disponibile un file nel tar.gz che contiene la lista dei file in ordine dei quali devono essere letti per capire meglio il flow dell'applicazione.
La shell è rilasciata sotto GPLv3 al sito: https://sourceforge.net/projects/bohsh/
Al momento è in uno stadio più che embrionale con parecchie esaltazioni di instabilità (a dire il vero ne ho viste meno del previsto ma l'ho testata altrettanto)
beh! che dire... spero che vi divertirete
ciao
Gio
- Blizzard
- Master

- Messaggi: 1509
- Iscritto il: mar 2 gen 2007, 22:53
- Nome Cognome: Giovanni Santostefano
- Slackware: 12.2
- Kernel: 2.6.27.7-smp
- Desktop: Fluxbox
- Contatta:
Ciao!
grazie per i complimenti!
)
Il linguaggio che ho utilizzato è il C e (ma non ne sono troppo sicuro) dovrei essere dentro lo standard POSIX. I sorgenti non sono nulla di complicato e penso che se segui la lista che ho scritto in ordine riuscirai a capirci e a metterci mano con poco sforzo.
Le cose impicciate arriveranno con le features più avanzate!
ciao
Gio
grazie per i complimenti!
Fidati al momento la cosa più complicata di bohshell è stata quella di trovargli un nome (ed è andata a finire quasi maleAppena posso mi guardo i source Very Happy
comunque complimenti per lo sforzo, programmare una shell non deve essere così semplice :P, per curiosità in che linguaggio è scritta? C?
Il linguaggio che ho utilizzato è il C e (ma non ne sono troppo sicuro) dovrei essere dentro lo standard POSIX. I sorgenti non sono nulla di complicato e penso che se segui la lista che ho scritto in ordine riuscirai a capirci e a metterci mano con poco sforzo.
Le cose impicciate arriveranno con le features più avanzate!
ciao
Gio
- JohnnyMnemonic
- Staff

- Messaggi: 2733
- Iscritto il: dom 5 set 2004, 0:00
- Nome Cognome: Giuseppe Palmiotto
- Slackware: 14.0
- Kernel: 3.5.5-thanatos
- Località: Bologna
- Contatta:
- acrive
- Linux 2.x

- Messaggi: 306
- Iscritto il: mar 27 dic 2005, 0:24
- Slackware: 12.0
- Località: Brindisi <-> Bologna
Guarda, ho programmato poco in C e l'università di Parma mi ha fatto passare la voglia in favore di Java. (Che non c'entra una fava..)
Il tuo progetto oltre ad riaccendere la curiosità è anche un'ottimo strumento didattico per poter cominciare senza scartabellare grossi codici!!
Quindi oltre ai complimenti per il tuo lavoro svolto, un sentito grazie anche da parte mia!!
Il tuo progetto oltre ad riaccendere la curiosità è anche un'ottimo strumento didattico per poter cominciare senza scartabellare grossi codici!!
Quindi oltre ai complimenti per il tuo lavoro svolto, un sentito grazie anche da parte mia!!
- Blizzard
- Master

- Messaggi: 1509
- Iscritto il: mar 2 gen 2007, 22:53
- Nome Cognome: Giovanni Santostefano
- Slackware: 12.2
- Kernel: 2.6.27.7-smp
- Desktop: Fluxbox
- Contatta:
ciao!
se qualcuno di voi (anche per sport) era intenzionato a guardare il codice della shell o a modificarlo o qualsiasi altra cosa, gli sarà utile dare un'occhiata a questo topic
http://www.gameprog.it/?actiongpi=viewt ... 416#p16416
il grande "programmer" mi sta dando dei validi consigli su come procedere nello sviluppo e mi sto muovendo in quel senso.
Lo dico perchè strutturalmente alcune cose andranno a complicarsi (ma neanche poi più di tanto!)
Bye!
Gio
se qualcuno di voi (anche per sport) era intenzionato a guardare il codice della shell o a modificarlo o qualsiasi altra cosa, gli sarà utile dare un'occhiata a questo topic
http://www.gameprog.it/?actiongpi=viewt ... 416#p16416
il grande "programmer" mi sta dando dei validi consigli su come procedere nello sviluppo e mi sto muovendo in quel senso.
Lo dico perchè strutturalmente alcune cose andranno a complicarsi (ma neanche poi più di tanto!)
Bye!
Gio
- absinthe
- Iper Master

- Messaggi: 2354
- Iscritto il: dom 15 mag 2005, 0:00
- Nome Cognome: Matteo Nunziati
- Slackware: 12.1 - defunct
- Kernel: 2.6.32-5-amd64
- Desktop: gnome
- Distribuzione: debian squeeze
- Località: Prato
- Contatta:
ciao,
ho dato un occhio veloce al codice... mi sa che c'è un memory leak!
te definisci il puntatore a struttura usrdat, lo allochi e lo popoli ma poi non dai un free(usrdat) prima della chiusura.
analogamente definisci altri due puntatori di tipo parseresult, però non mi pare tu li utilizzi, quindi non dovrebbero esserci allocazioni a zonzo per il codice in questo caso!
ciao,
M
ho dato un occhio veloce al codice... mi sa che c'è un memory leak!
Codice: Seleziona tutto
int main()
{
int i=0;
struct userdat* data=NULL;
struct parseresult* p=NULL;
struct parseresult* p2=NULL;
char line[2048];
data=GetUserData();
printf(" BOHSHELL ver0.1 prealpha \n");
printf(" Developed by Santostefano Giovanni \n");
printf(" http://santostefanogiovanni.blogspot.com \n\n");
PrintUserData(data);
while(1)
{
PrintPrompt(data,1);
GetPromptCommand(line);
ParseCommands(line);
}
return 0;
}
analogamente definisci altri due puntatori di tipo parseresult, però non mi pare tu li utilizzi, quindi non dovrebbero esserci allocazioni a zonzo per il codice in questo caso!
ciao,
M
- absinthe
- Iper Master

- Messaggi: 2354
- Iscritto il: dom 15 mag 2005, 0:00
- Nome Cognome: Matteo Nunziati
- Slackware: 12.1 - defunct
- Kernel: 2.6.32-5-amd64
- Desktop: gnome
- Distribuzione: debian squeeze
- Località: Prato
- Contatta:
altra cosa:
non ho ben capito una cosa dal man di getcwd:
http://man.he.net/man3/getcwd
tu lo usi almeno una volta nel file prompt.c:
la domanda è: ma getcwd tiene conto anche dello zero a fine stringa? altrimenti dovrebbe essere una cosa del tipo: getcwd(directory,1023); e comunque dovresti inizializzare la tringa a zero... :-/ magari non serve dimmi te!
ciaux,
M
non ho ben capito una cosa dal man di getcwd:
http://man.he.net/man3/getcwd
tu lo usi almeno una volta nel file prompt.c:
Codice: Seleziona tutto
char directory[1024];
getcwd(directory,1024);
ciaux,
M
- Blizzard
- Master

- Messaggi: 1509
- Iscritto il: mar 2 gen 2007, 22:53
- Nome Cognome: Giovanni Santostefano
- Slackware: 12.2
- Kernel: 2.6.27.7-smp
- Desktop: Fluxbox
- Contatta:
ciao,
per quanto riguarda i memory leak hai ragione :P vedo di correggerli al volo.
Per quanto riguarda la getcwd effettivamente non so se ritorna con il \0 (ma credo di si visto che nonostante la dimenticanza dell'inizializzazione la concatenazione funziona senza errori)
tuttavia di solito alle altre parti (ad esempio in launcher.c) ho risolto con
memset(command,0, sizeof(char)*2048);
fillando la stringa di \0 e poi richiedendo al più 2047 caratteri.
//Zeroing out the strings that in future may contain the cwd
memset(directory,0,sizeof(char)*2048);
Grazie mille per le segnalazioni.... se ci riesco stasera metto mano a quegli odiosi leak....
Gio
per quanto riguarda i memory leak hai ragione :P vedo di correggerli al volo.
Per quanto riguarda la getcwd effettivamente non so se ritorna con il \0 (ma credo di si visto che nonostante la dimenticanza dell'inizializzazione la concatenazione funziona senza errori)
tuttavia di solito alle altre parti (ad esempio in launcher.c) ho risolto con
memset(command,0, sizeof(char)*2048);
fillando la stringa di \0 e poi richiedendo al più 2047 caratteri.
//Zeroing out the strings that in future may contain the cwd
memset(directory,0,sizeof(char)*2048);
Grazie mille per le segnalazioni.... se ci riesco stasera metto mano a quegli odiosi leak....
Gio
- Blizzard
- Master

- Messaggi: 1509
- Iscritto il: mar 2 gen 2007, 22:53
- Nome Cognome: Giovanni Santostefano
- Slackware: 12.2
- Kernel: 2.6.27.7-smp
- Desktop: Fluxbox
- Contatta:
ciao!
corretti i leak nel main... mi sa che ce n'è qualcuno sparso anche tra parser e launcher... mo li trovo e li fixo.
Quel main è abbastanza pecora nera e probabilmente verrà totalmente cambiato.
Comunque al momento la situazione è questa:
FreeUserData, presente in userdat.c è così:
Sai che sono rimasto con il dubbio se facendo free(data) all'interno della funzione avrei davvero deallocato la struttura? Nell'attesa che mi risolvo questo dubbio lascio la deallocazione nel main
corretti i leak nel main... mi sa che ce n'è qualcuno sparso anche tra parser e launcher... mo li trovo e li fixo.
Cavolo quello era un residuato bellico del main di test che utilizzavo quando non c'era ancora il parsing generale.definisci altri due puntatori di tipo parseresult, però non mi pare tu li utilizzi, quindi non dovrebbero esserci allocazioni a zonzo per il codice in questo caso!
Quel main è abbastanza pecora nera e probabilmente verrà totalmente cambiato.
Comunque al momento la situazione è questa:
Codice: Seleziona tutto
#include "shinclude.h"
#include "usrdat.h"
#include "prompt.h"
#include "parser.h"
#include "launcher.h"
int main()
{
int i=0;
struct userdat* data=NULL;
int status=0;
char line[2048];
data=GetUserData();
printf(" BOHSHELL ver0.1 prealpha \n");
printf(" Developed by Santostefano Giovanni \n");
printf(" http://santostefanogiovanni.blogspot.com \n\n");
PrintUserData(data);
while(1)
{
PrintPrompt(data,1);
GetPromptCommand(line);
status=ParseCommands(line);
//exit from the shell
if(status==EXITCODE)
{
FreeUserData(data);
free(data);
data=NULL;
exit(EXIT_SUCCESS);
}
}
return 0;
}
Codice: Seleziona tutto
//Free the user data structure
void FreeUserData(struct userdat* data)
{
if(data->username) free(data->username);
if(data->loginname) free(data->loginname);
if(data->home) free(data->home);
if(data->terminal) free(data->terminal);
if(data->shell) free(data->shell);
}- Blizzard
- Master

- Messaggi: 1509
- Iscritto il: mar 2 gen 2007, 22:53
- Nome Cognome: Giovanni Santostefano
- Slackware: 12.2
- Kernel: 2.6.27.7-smp
- Desktop: Fluxbox
- Contatta:
ciao!
Ancora per quanto riguarda la getcwd ora ricordo perchè non mi ero preoccupato del \0.
Sto utilizzando come riferimento "GUIDA ALLA PROGRAMMAZIONE IN LINUX" e a proposito di getcwd dice:
Inoltre come hai potuto vedere dal codice getcwd non restituisce l'ultima /
quindi nel mio caso (concatenare path+nome file) ho dovuto aggiungere il /
getcwd = /home/giovanni/prog
+ / = /home/giovanni/prog/
+ a.out = /home/giovanni/prog/a.out YESSS!!!!
ciao
Gio
Ancora per quanto riguarda la getcwd ora ricordo perchè non mi ero preoccupato del \0.
Sto utilizzando come riferimento "GUIDA ALLA PROGRAMMAZIONE IN LINUX" e a proposito di getcwd dice:
In base a questo non mi sono preoccupato :P ma è sempre meglio inizializzare.La funzione restituisce il pathname completo della directory di lavoro nella stringa puntata
da buffer, che deve essere precedentemente allocata, per una dimensione massima di size. Il
buffer deve essere sufficientemente lungo da poter contenere il pathname completo pi` lo zero di terminazione della stringa. Qualora esso ecceda le dimensioni specificate con size la funzione
restituisce un errore.
Inoltre come hai potuto vedere dal codice getcwd non restituisce l'ultima /
quindi nel mio caso (concatenare path+nome file) ho dovuto aggiungere il /
getcwd = /home/giovanni/prog
+ / = /home/giovanni/prog/
+ a.out = /home/giovanni/prog/a.out YESSS!!!!
ciao
Gio
- absinthe
- Iper Master

- Messaggi: 2354
- Iscritto il: dom 15 mag 2005, 0:00
- Nome Cognome: Matteo Nunziati
- Slackware: 12.1 - defunct
- Kernel: 2.6.32-5-amd64
- Desktop: gnome
- Distribuzione: debian squeeze
- Località: Prato
- Contatta:
sì se fai free(data); data=NULL; deallochi e resetti il puntatore!Blizzard ha scritto:Sai che sono rimasto con il dubbio se facendo free(data) all'interno della funzione avrei davvero deallocato la struttura? Nell'attesa che mi risolvo questo dubbio lascio la deallocazione nel mainCodice: Seleziona tutto
//Free the user data structure void FreeUserData(struct userdat* data) { if(data->username) free(data->username); if(data->loginname) free(data->loginname); if(data->home) free(data->home); if(data->terminal) free(data->terminal); if(data->shell) free(data->shell); }
M
PS: ma sei sicuro della forma:
Codice: Seleziona tutto
void FreeUserData(struct userdat* data)
non dovrebbe essere:
Codice: Seleziona tutto
void FreeUserData(userdat* data)
detto ciò un consiglio generale: quando definisci un puntatore fallo così:
pointerToData *ptr
e non
pointerToData* ptr
Sposta lo spazio dell'asterisco: è più chiaro!!! ti faccio un esempio:
int* a, b, c
cosa dichiara?
1- tre puntatori ad intero
2- un puntatore ad intero e due interi
3- un panettone
indovina