Xhack
Vuoi reagire a questo messaggio? Crea un account in pochi click o accedi per continuare.
Xhack

Un forum dedicato all'hacking
 
IndiceIndice  PortalePortale  CercaCerca  Ultime immaginiUltime immagini  RegistratiRegistrati  Accedi  

 

 progetto per la creazione di una nuova shell...

Andare in basso 
5 partecipanti
AutoreMessaggio
darkjoker
Admin
Admin
darkjoker


Numero di messaggi : 813
Data d'iscrizione : 30.07.07

progetto per la creazione di una nuova shell... Empty
MessaggioTitolo: progetto per la creazione di una nuova shell...   progetto per la creazione di una nuova shell... EmptyVen Gen 04, 2008 6:56 pm

ciao a tutti... come avrete capito dal titolo, ho un progetto un po' ambizioso... creare una shell interamente scritta in c...
Beh, dopotutto, pensandoci una shell è un semplice ( piu o meno) programma che agisce sopratutto coi file, ma svolge anche altri tipi di funzioni..
col c, anche se avete letto solo la mia guida, saprete certo operare tranquillamente con i file, se vi siete spinti oltre, allora avrete delle ottime conoscenze...
Bene, ora che ci avete pensato un attimo avrete capito che la shell è fattibile, dobbiamo solo unire le nostre menti...
questo è il programma che avevo fatto io un po di tempo fa..:
Codice:

//Beta Version
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <time.h>
#define USERNAME "darkjoker" //mettete qui il vostro nickname...
int inizio ();
int view ();
int quit ();
int calc ();
int help ();
int aboutme ();
int hexdec ();
int dirx ();
int copia ();
main (){
    inizio ();
    while (1 == 1){
    char scelta;
    printf ("%s@shell: & ", USERNAME);
    scanf ("%c", &scelta);
    switch (scelta){
            case 'd':
                dirx ();
                break;
            case 'v':
                view ();
                break;
            case 'q':
                exit (1);
                break;
            case 'c':
                calc ();
                break;
            case 'h':
                help ();
                break;
            case 'a':
                aboutme ();
                break;
            case 'x':
                hexdec ();
                break;
            case 'p':
                copia ();
                break;
            default:
                break;
                }
}
}
int inizio (){
    printf ("\n\nBenvenuto %s\n\nVerra avviata una nuova sessione.\n\n\n", USERNAME);
}
int view (){
    FILE *toread;
    char file[20], txt[100];
    printf ("Inserire il nome del file da leggere: ");
    scanf ("%s", &file);
    toread = fopen (file, "r");
    if (toread == NULL){
              printf ("Impossibile leggere il file.\n");
    }
    while (!feof(toread)){
          fgets (txt, sizeof(txt), toread);
          printf ("%s", txt);
         
          }
}
int calc (){
    int scelta, ad1, ad2, sm, mn, st, df, ft1, ft2, pr, dv, ds, qu;
    printf ("Scegli che cosa fare:\n1. Addizione\n2. Sottrazione\n3. Prodotto\n4. Divisione\n");
    scanf ("%d", &scelta);
    switch (scelta){
          case 1:
                printf ("Inserire il primo addendo: ");
                scanf ("%d", &ad1);
                printf ("Inserire il secondo addendo: ");
                scanf ("%d", &ad2);
                sm = ad1 + ad2;
                printf ("Risultato: %d\n", sm);
                break;                       
          case 2:
                printf ("Inserire il minuendo: ");
                scanf ("%d", &mn);
                printf ("Inserire il sottraendo: ");
                scanf ("%d", &st);
                df = mn - st;
                printf ("Risultato: %d\n", df);
                break;
          case 3:
                printf ("Inserire il primo fattore: ");
                scanf ("%d", &ft1);
                printf ("Inserire il secondo fattore: ");
                scanf ("%d", &ft2);
                pr = ft1 * ft2;
                printf ("Risultato: %d\n", pr);
                break;
          case 4:
                printf ("Inserire il dividendo: ");
                scanf ("%d", &dv);
                printf ("Inserire il divisore: ");
                scanf ("%d", &ds);
                if (ds == 0){
                      printf ("Impossibile dividere per 0\n");
                      break;
                      }
                qu = dv / ds;
                printf ("Risultato: %d\n", qu); 
                break;
          default:
                  printf ("Comando non valido.\n");
                  break;
          }
}
int help (){
    printf ("\n\nHelp\n");
    printf ("\n");
    printf ("v : visualizza il contenuto di un file.\n");
    printf ("\n");
    printf ("c : apre una calcolatrice.\n");
    printf ("\n");
    printf ("q : esce dalla shell\n");     
    printf ("\n");
    printf ("a : mostra un messaggio riguardante l'autore\n");
    printf ("\n");
    printf ("h : visualizza questo messaggio\n");
    printf ("\n");
    printf ("x : apre un proramma per la conversione da decimale a esadecimale\n");
    printf ("\n");
    printf ("d : visualizza il contenuto di una directory\n");
    printf ("\n");
    printf ("p : copia un file.\n");
    printf ("\n\n");
}
int aboutme (){
    printf ("\n\nQuesto programma e stato creato da: darkjoker\nLa parte rigurdante le directory e stata fatta quasi completamente a cura di BlackLight.\n");
}
int hexdec (){
    int scelta, hexdec, dechex;
    printf ("Cosa vuoi fare?\n1. Decimale >> Esadecimale\n2. Esadecimale >> Decimale\n");
    scanf ("%d", &scelta);
    switch (scelta){
          case 1:
                printf ("Inserire valore decimale da trasformare: ");
                scanf ("%d", dechex);
                printf ("%d >> %x\n", dechex, dechex);
                break;
          case 2:
                printf ("Inserire valore esadecimale da trasformare: ");
                scanf ("%x", hexdec);
                printf ("%x >> %d\n", hexdec, hexdec);
          break;
          default:
                  printf ("Opzione non valida.\n");
          }
}


int dirx(){
        DIR *dy;
        struct dirent*info;
        int num=0;
        int max_fname=0;
        int i,rnd;
        char **names;
        char direct[20];
        printf ("Inserire il nome della directory da analizzare: ");
        scanf ("%s", &direct);
        dy = opendir(direct);
        while (info=readdir(dy))  {
                num++;

                if (strlen(info->d_name)>max_fname)
                        max_fname=strlen(info->d_name);
        }
        names = (char**) malloc(num*sizeof(char*));

        for (i=0; i<num; i++)
                names[i] = (char*) malloc(max_fname*sizeof(char));
               

        closedir(dy);
    dy = opendir(direct); 

        for (i=0; info=readdir(dy); i++)
                strncpy (names[i],info->d_name,max_fname);


        closedir(dy);
        i--;
        while (i >= 0){
    printf ("%s\n", names[i]);
    i--;
}
}
int copia (){
    FILE *orig;
    FILE *des;
    char origine[20], dest[20], linea[1000];
    printf ("Inserire il nome del file da copiare: ");
    scanf ("%s", &origine);
    printf ("Inserire il nome della destinazione: ");
    scanf ("%s", &dest);
    if (origine == NULL){
                printf ("Impossibile aprire il file di origine.\n");
    }
    if (dest == NULL){
                printf ("Impossibile aprire il file di destinazione.\n");
    }
    orig = fopen (origine, "r");
    des = fopen (dest, "w");
    while (!feof (orig)){
          fgets (linea, sizeof (linea), orig);
          fprintf (des, "%s", linea);
    }
}
se lo usate, vedete che è abbastanza elementare, usando il comando h potete vedere le sue "capacita".. molto limitate... no?
quello che vi chiedo è di copiarvi il codice e modificarlo a vostro piacimento, aggiungendo nuove funzioni e modificando quelle esistenti...
Se poi c'è qualcuno di voi che se la cava con le stringhe, gli chiederei di trasformare i comandi da semplici lettere a intere parole... Purtroppo bisogna usare la libreria string.h e io, sinceramente, sono un po'imbranato...
Se poi qualcuno riesce a risolvere il problema che quando si mette un comando non valido fa qualcosa di "strano" (ho provato in un po di modi a risolvere, ma niente...)
Beh, io la proposta l'ho lanciata; sta a voi accoglierla o rifiutarla, spero che prendiate la strada giusta...

darkjoker
Torna in alto Andare in basso
certaindeath
Admin
Admin
certaindeath


Numero di messaggi : 343
Data d'iscrizione : 30.07.07

progetto per la creazione di una nuova shell... Empty
MessaggioTitolo: Re: progetto per la creazione di una nuova shell...   progetto per la creazione di una nuova shell... EmptyVen Gen 04, 2008 7:49 pm

buono; un progretto collettivo.
vediamo se insieme riusciamo a fare qualcosa di buono...
Torna in alto Andare in basso
darkjoker
Admin
Admin
darkjoker


Numero di messaggi : 813
Data d'iscrizione : 30.07.07

progetto per la creazione di una nuova shell... Empty
MessaggioTitolo: Re: progetto per la creazione di una nuova shell...   progetto per la creazione di una nuova shell... EmptyVen Gen 04, 2008 7:52 pm

speriamo...
che qualcuno abbia ancora qualche interesse... come dice black, ci stiamo dividendo....
questa mi sa che è una prova definitiva prima di decidere se proseguire o no...
Torna in alto Andare in basso
certaindeath
Admin
Admin
certaindeath


Numero di messaggi : 343
Data d'iscrizione : 30.07.07

progetto per la creazione di una nuova shell... Empty
MessaggioTitolo: Re: progetto per la creazione di una nuova shell...   progetto per la creazione di una nuova shell... EmptyVen Gen 04, 2008 7:55 pm

siamo alla resa dei conti.....
Torna in alto Andare in basso
darkwolf
membro importante
membro importante
darkwolf


Numero di messaggi : 225
Localizzazione : Un pò più a destra ecco bravo adesso un pò più in basso perfetto abito lì
Data d'iscrizione : 05.11.07

progetto per la creazione di una nuova shell... Empty
MessaggioTitolo: Re: progetto per la creazione di una nuova shell...   progetto per la creazione di una nuova shell... EmptyVen Gen 04, 2008 9:42 pm

proseguire un corno xhack NON DEVE CHIUDERE !!!!!!!!!!!!!!!!!!!!!!!!!!!
il progetto mi piace ma io non ne sono capace devo studiare di +
Torna in alto Andare in basso
giga hertz
apprendista
apprendista



Numero di messaggi : 42
Data d'iscrizione : 01.09.07

progetto per la creazione di una nuova shell... Empty
MessaggioTitolo: Re: progetto per la creazione di una nuova shell...   progetto per la creazione di una nuova shell... EmptyVen Gen 04, 2008 10:16 pm

Bel progetto, credo che mi impegnerò a contribuire.
PS:
Ho visto che quando si inserisce un comando non supportato esce tante volte la scritta del nome utente, credo sia un bug nell while.
PSS:
nella calcolatrice basta dichiarare due variabili.
Torna in alto Andare in basso
BlackLight
Moderatore
Moderatore
BlackLight


Numero di messaggi : 277
Età : 37
Data d'iscrizione : 22.08.07

progetto per la creazione di una nuova shell... Empty
MessaggioTitolo: Re: progetto per la creazione di una nuova shell...   progetto per la creazione di una nuova shell... EmptySab Gen 05, 2008 3:31 am

Dai su non è questa la giusta base da cui partire per una shell...una shell deve essere innanzitutto un componente software costruito intorno al kernel, quindi i comandi di base dovranno utilizzare quasi esclusivamente primitive del kernel, e non primitive per l'I/O ad alto livello come quelle di stdio (anche perché una shell deve essere ottimizzata il più possibile rispetto al kernel). Inoltre una buona shell deve essere completamente multiutente e multiprocesso. Ciò vuol dire che, a parte ad avere una buona gestione degli utenti, dovrà implementare pipe e redirezioni varie, che a livello utente vengono viste al solito modo (<, > e |) mentre invece a livello C sono chiusure e duplicazioni di file descriptor e creazioni di canali per la comunicazione inter-processo. Tempo fa ho implementato una mezza shell in questo modo proprio per il corso di sistemi operativi, ed è questo il consiglio che vi posso dare se volete implementare una shell simile quantomeno a quella sui sistemi Unix, non certo mettere insieme un paio di comandi C di base in un solo programmino...
Torna in alto Andare in basso
http://blacklight.gotdns.org
darkjoker
Admin
Admin
darkjoker


Numero di messaggi : 813
Data d'iscrizione : 30.07.07

progetto per la creazione di una nuova shell... Empty
MessaggioTitolo: Re: progetto per la creazione di una nuova shell...   progetto per la creazione di una nuova shell... EmptySab Gen 05, 2008 12:04 pm

lol... hai ragione... ma non punto alla bash Very Happy
pero, sai, mi è venuta in mente cosi, senza che essa facesse molto... bah.. prima o poi, comunque, ne faro una.. spettate e sperate... Very Happy (che poi, piu che una shell vera e propria,.... puntavo piu che altro ad un'insieme di utility, solo che mi è venuto da chiamarla shell, visto che la bash (forever Very Happy ) ne implementa un sacco di queste cose Very Happy

Citazione :
proseguire un corno xhack NON DEVE CHIUDERE !!!!!!!!!!!!!!!!!!!!!!!!!!!
il progetto mi piace ma io non ne sono capace devo studiare di +
anche noi non vorremmo chiudere, ma la community sta morendo... se leggi su annunci troverai i motivi...
ci dispiace, ma stiamo seriamente pensando di andare in pensione... dipende tutto da voi...

Citazione :

Ho visto che quando si inserisce un comando non supportato esce tante volte la scritta del nome utente, credo sia un bug nell while.
lo so... mi sono dannatto abbastanza per mandarlo via... l'unica cosa che ho ottenuto era... sbagliata... piu giusta ma sbagliata...
Torna in alto Andare in basso
Contenuto sponsorizzato





progetto per la creazione di una nuova shell... Empty
MessaggioTitolo: Re: progetto per la creazione di una nuova shell...   progetto per la creazione di una nuova shell... Empty

Torna in alto Andare in basso
 
progetto per la creazione di una nuova shell...
Torna in alto 
Pagina 1 di 1
 Argomenti simili
-
» richiesta nuova sezione
» Shell Pack
» shell by Darkwolf

Permessi in questa sezione del forum:Non puoi rispondere agli argomenti in questo forum.
Xhack :: Programmazione :: C/C++-
Vai verso: