BohShell versione prealpha

Postate qui per tutte le discussioni legate a Linux in generale.

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.
Avatar utente
Blizzard
Master
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

Messaggio 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

Avatar utente
Blizzard
Master
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:

Messaggio da Blizzard »

DIMENTICAVO!
postate commenti, impressioni e critiche (costruttive possibilmente :D )

Avatar utente
V
Linux 2.x
Linux 2.x
Messaggi: 313
Iscritto il: gio 23 mar 2006, 10:54

Messaggio da V »

:hello1:

Avatar utente
DaD
Linux 2.x
Linux 2.x
Messaggi: 371
Iscritto il: mer 7 feb 2007, 18:19
Nome Cognome: Antonio Barra
Slackware: 13
Kernel: 3.0
Desktop: KDE 4
Distribuzione: Mac OS X
Contatta:

Messaggio da DaD »

Appena posso mi guardo i source :D
comunque complimenti per lo sforzo, programmare una shell non deve essere così semplice :P, per curiosità in che linguaggio è scritta? C?

Avatar utente
Blizzard
Master
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:

Messaggio 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 :D )
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

Avatar utente
JohnnyMnemonic
Staff
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:

Messaggio da JohnnyMnemonic »

Bel progetto, ho realizzato una shell come la tua per un corso universitario

Avatar utente
acrive
Linux 2.x
Linux 2.x
Messaggi: 306
Iscritto il: mar 27 dic 2005, 0:24
Slackware: 12.0
Località: Brindisi <-> Bologna

Messaggio 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!! ;)

Avatar utente
Blizzard
Master
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:

Messaggio 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

Avatar utente
Blizzard
Master
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:

Messaggio 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

Avatar utente
absinthe
Iper Master
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:

Messaggio 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

Avatar utente
absinthe
Iper Master
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:

Messaggio 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:

Codice: Seleziona tutto

char directory[1024];
getcwd(directory,1024);
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

Avatar utente
Blizzard
Master
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:

Messaggio 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

Avatar utente
Blizzard
Master
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:

Messaggio 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

Avatar utente
Blizzard
Master
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:

Messaggio 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

Avatar utente
absinthe
Iper Master
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:

Messaggio 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:

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 ;)

Rispondi