Pagina 1 di 3
BohShell versione prealpha
Inviato: ven 14 set 2007, 18:39
da Blizzard
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
Inviato: ven 14 set 2007, 18:47
da Blizzard
DIMENTICAVO!
postate commenti, impressioni e critiche (costruttive possibilmente

)
Inviato: ven 14 set 2007, 19:24
da V
Inviato: ven 14 set 2007, 19:39
da DaD
Appena posso mi guardo i source

comunque complimenti per lo sforzo, programmare una shell non deve essere così semplice :P, per curiosità in che linguaggio è scritta? C?
Inviato: ven 14 set 2007, 19:51
da Blizzard
Ciao!
grazie per i complimenti!
Appena 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?
Fidati al momento la cosa più complicata di bohshell è stata quella di trovargli un nome (ed è andata a finire quasi male

)
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
Inviato: ven 14 set 2007, 19:55
da JohnnyMnemonic
Bel progetto, ho realizzato una shell come la tua per un corso universitario
Inviato: sab 15 set 2007, 10:31
da acrive
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!!

Inviato: sab 15 set 2007, 11:26
da Blizzard
ciao,
grazie a voi... sapere che il progetto piace e soprattutto che può essere utile è forse la più grande motivazione per ampliarlo. :P
ciao
Gio
Inviato: mar 18 set 2007, 10:09
da Blizzard
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
Inviato: mar 18 set 2007, 11:01
da absinthe
ciao,
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;
}
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
Inviato: mar 18 set 2007, 11:29
da absinthe
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
Inviato: mar 18 set 2007, 11:54
da Blizzard
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
Inviato: mar 18 set 2007, 12:17
da Blizzard
ciao!
corretti i leak nel main... mi sa che ce n'è qualcuno sparso anche tra parser e launcher... mo li trovo e li fixo.
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!
Cavolo quello era un residuato bellico del main di test che utilizzavo quando non c'era ancora il parsing generale.
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;
}
FreeUserData, presente in userdat.c è così:
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);
}
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
Inviato: mar 18 set 2007, 12:31
da Blizzard
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:
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.
In base a questo non mi sono preoccupato :P ma è sempre meglio inizializzare.
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
Inviato: mar 18 set 2007, 14:37
da absinthe
Blizzard ha scritto:
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);
}
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
sì se fai free(data); data=NULL; deallochi e resetti il puntatore!
M
PS: ma sei sicuro della forma:
non dovrebbe essere:
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
