Shell (p,cmid); /* interprete di comandi del sistema */ { se in modalita' IOPX Stampa l'intestazione; altrimenti se in modalita' PROMPTPX Stampa il prompt; altrimenti se in modalita' INTPX { se c'e' un comando copia il puntatore al buffer; altrimenti se c'e' un comando parziale stampa l'eco; ParseDetect /* riconosce la riga di comando */ } }
void ParseDetect() /* spezza e riconosce una riga di comando */ { se la riga di comando termina con il carattere `&' setta il flag Background spezza la riga di comando in parole memorizza la prima parola come comando per tutte le parole dopo la prima { se la parola comincia con il carattere `-' aggiungila ai flag altrimenti memorizza la parola come parametro } confronta il comando con tutti i comandi interni se coincide con un comando CallData /* Avvia un processo nella coda d'attesa */ altrimenti se access(comando,x) /* verifica permesso d'esecuzione */ CallData /* Avvia un processo nella coda d'attesa */ altrimenti stampa che il comando e' sconosciuto }
Comando | Descrizione |
asm | assemblatore |
chmod | modifica le proprietà di un file |
cls | cancella lo schermo |
copy | fa la copia di un file |
compact | cancella i file nel cestino |
create | crea un file di caratteri casuali |
del | cancella o mette nel cestino un file |
dir | visualizza i file presenti nella directory |
download | salva il contenuto del disco virtuale su HD |
dump | visualizza e modifica una locazione di memoria |
edit | edita un testo |
format | formatta il disco |
help | fornisce la lista dei comandi |
kill | termina l'esecuzione di un processo |
logout | termina la sessione |
loop | esegue un ciclo infinito |
passwd | modifica la password |
ps | mostra lo stato dei processi in corso |
seeheap | visualizza lo stato della memoria Heap |
stat | mostra una statistica degli errori di sistema |
testheap | permette di testare la memoria Heap |
tiny | avvia il compilatore tiny |
type | visualizza il contenuto di un file |
upload | carica il contenuto del disco virtuale |
users | mostra il nome degli utenti accreditati |
version | mostra la versione del sistema |
chmod Modifica i permessi d'accesso ad un file. I permessi possono essere cambiati o dal proprietario del file o dal superuser. Il superuser può cambiare i permessi di tutti i file tranne che quelli del file password.
La sintassi del comando da shell prevede che si pongano prima la lista dei permessi da aggiungere e da togliere e poi il nome del file su cui operare. I permessi vengono specificati dalle lettere `r' (lettura), `w' (scrittura) e `x' (esecuzione) e possono essere preceduti dal segno `-' se li si vuole togliere, comunque valgono sia per il proprietario che per tutti gli altri utenti. I permessi, in alternativa, possono essere specificati in modo più dettagliato mediante un numero ottale a due cifre, secondo le solite regole di Unix. Per maggiore chiarezza si consideri il seguente esempio:
Se da shell il proprietario del file ``filename'' digita:
chmod 61 filenameil sistema risponderà nel modo seguente:
filename rw---xse a questo punto il proprietario digita:
chmod +r -x filenamequesta volta il sistema risponde con:
rw-r-- filename
void chmod(pun,cmid) /* comando builtin */ /* Cambia i permessi d'accesso a un file. */ { se i parametri non sono corretti mostra un piccolo aiuto ed esci riordina i parametri se il file non esiste o e' nel cestino esci se l'utente non e' il proprietario o il superuser esci aggiungi i permessi da mettere togli i permessi da levare visualizza i permessi risultanti }cls Questo comando si limita a cancellare lo schermo della porta da cui viene lanciato, gli unici caratteri che restano sono quelli del prompt.
COPY (cmid,pun) /* comando builtin */ /* copia un file */ { se la sintassi e' errata stampa aiuto; altrimenti se spazio su disco insufficiente stampa evento; altrimenti se il file sorgente non esiste o e' nel cestino stampa evento; altrimenti se il file destinazione esiste o e' nel cestino stampa evento; altrimenti se accesso non consentito al file sorgente stampa evento; altrimenti { chiama down (DISK); copia i blocchi di dati; aggiorna l'indice; aggiorna i dati del disco; chiama up (DISK); } }
CREATE (cmid,pun) /* comando builtin */ /* crea un file contenente caratteri casuali */ { Se la sintassi e' errata stampa l'aiuto; altrimenti verifica se il file esiste gia' altrimenti verifica se lo spazio su disco e' sufficiente altrimenti { stampa l'intestazione; chiama down (DISK); per i da 0 fino alla dim. del file con passo 1 { scrivi lettere casuali sul disco; } aggiorna l'indice della directory chiama up (DISK); } }
DELETE (cmid,pun) /* comando builtin */ /* cancella un file */ { se la sintassi e' errata stampa aiuto; altrimenti se il file non esiste stampa l'evento; altrimenti (!access(file,w)) /* file non scrivibile */ stampa l'evento; altrimenti { chiama down (DISK); aggiorna il flag di cancellatura del file; chiama up (DISK); } }
DIR (cmid,pun) /* comando builtin */ /* visualizza il contenuto della directory */ { se la sintassi e' errata stampa l'aiuto; altrimenti { stampa l'intestazione; se il file non e' specificato { stampa i file nel disco o nel cestino; stampa eventuali informazioni aggiuntive; stampa informazioni sul disco; } altrimenti se il file non esiste stampa l'evento; altrimenti stampa le informazioni aggiuntive sul file; } } }
FORMAT (cmid,pun) /* comando builtin */ /* formatta il disco virtuale */ { se si e' in modalita' di inizializzazione assegna automaticamente il nome del disco; se l'utente != superuser stampa l'evento; altrimenti se sintassi errata stampa l'aiuto; altrimenti { chiama down(DISK); scrivi il blocco zero; chiama up(DISK); se in modalita' di inizializzazione stampa dati sul disco; } }
LOGIN (cmid,pun) /* comando builtin */ /* inizializza la sessione di lavoro di un utente */ { se si e' in modalita' di inizializzazione entra in modalita' login; altrimenti { cancella schermo; attendi che UPLD diventi up; se il file password non e' sul disco stampa l'evento; altrimenti { chiama down (DISK); cerca il nome utente nel file; se esiste { verifica la password se e' esatta { stampa accesso consentito; assegna il codice utente; entra in modalita' comando; } altrimenti stampa password errata; } altrimenti stampa utente inesistente; chiama up (DISK); } } }
PASSWD (cmid,pun) /* comando builtin */ /* gestione delle password */ { se esiste il file password { se l'utente e' il superuser { se si e' in modalita' di inizializzazione inizializza il file; altrimenti se si e' in modalita' di eliminazione elimina l'utente dal file; altrimenti se si e' in modalita' di inserimento inserisci nuovo utente con password; altrimenti se si e' in modalita' di modifica modifica la password; } altrimenti se la sintassi e' corretta modifica la password dell'utente attuale; altrimenti stampa aiuto; } altrimenti stampa file non esistente; }
void PS() /* comando builtin */ /* mostra la lista dei thread in esecuzione */ { per tutte le priorita' { p punta alla testa della coda finche' p != NULL { stampa le caratteristiche del TCB puntato da p p punta al prossimo TCB della coda } } }
PrintERROR (p,cmid) /* algoritmo di basso livello e comando builtin */ /* visualizza una stringa per ogni errore riconosciuto */ { se si e' in modalita' di inizializzazione stampa la lista degli errori con le relative statistiche altrimenti { verifica il tipo di errore; stampa il codice dell'errore; stampa la descrizione dell'errore; } }
TYPE (cmid,pun) /* comando builtin */ /* stampa il contenuto di un file { Se la sintassi e' errata stampa l'aiuto; altrimenti verifica se il file non esiste altrimenti verifica se il file e' nel cestino altrimenti verifica se l'accesso non e' consentito in lettura altrimenti { se si vuole l'intestazione stampa l'intestazione; apri il file finche' il file non e' finito { leggi un blocco del file; stampa il contenuto blocco } chiudi il file } }
UPLOAD (cmid,pun) /* comando builtin */ /* carica il disco virtuale */ { se in modalita' di inizializzazione prepara le variabili di comunicazione; se la sintassi e' errata stampa aiuto; altrimenti { se non viene specificato nomefile nomefile diventa "theos"; chiama down (DISK); chiama down (UPLD); upload diventa 1; attendi che upload sia 0; chiama up (UPLD); chiama up (DISK); } }
USERS (cmid,pun) /* comando builtin */ /* visualizza gli utenti accreditati */ { se la sintassi e' errata stampa aiuto; altrimenti se il file password non esiste stampa l'evento; altrimenti { stampa intestazione; scansiona il file stampando il nome ed il codice; } }