microshell
This commit is contained in:
parent
c8aee5590a
commit
43137eaa24
183
microshell/#microshell.c#
Normal file
183
microshell/#microshell.c#
Normal file
@ -0,0 +1,183 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <stdbool.h>
|
||||
#include <dirent.h>
|
||||
#define BUFFER_SIZE 4096
|
||||
|
||||
void mv(char **args,int size){
|
||||
if(size>3){
|
||||
printf("Too many arguments\n");
|
||||
return;
|
||||
}
|
||||
int des=symlink(args[1],args[2]);
|
||||
if(des==-1){
|
||||
printf("%s\n",strerror(errno));
|
||||
}
|
||||
unlink(args[1]);
|
||||
}
|
||||
|
||||
void ls(char **args,int size){
|
||||
struct dirent *des;
|
||||
DIR *dr;
|
||||
if(size==1) dr=opendir(".");
|
||||
if(size==2) dr=opendir(args[1]);
|
||||
if(size>2){
|
||||
printf("Too many arguments\n");
|
||||
return;
|
||||
}
|
||||
if(dr==NULL){
|
||||
printf("%s\n",strerror(errno));
|
||||
return;
|
||||
}
|
||||
while((des=readdir(dr))!=NULL){
|
||||
char *nazwa=des->d_name;
|
||||
if(nazwa[0]!='.') printf("%s\n",nazwa);
|
||||
}
|
||||
closedir(dr);
|
||||
}
|
||||
|
||||
void mk_dir(char **args,int size){
|
||||
int i=0,w;
|
||||
if(size==1) printf("Missing operand\n");
|
||||
else{
|
||||
for(i=1;i<size;i++){
|
||||
w=mkdir(args[i],0700);
|
||||
if(w==-1) printf("%s (%s)\n",strerror(errno),args[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void touch(char **args,int size){
|
||||
int i;
|
||||
for(i=1;i<size;i++){
|
||||
int des=open(args[i],O_CREAT,S_IWRITE|S_IREAD);
|
||||
if(des==(-1)){
|
||||
printf("%s\n",strerror(errno));
|
||||
}
|
||||
close(des);
|
||||
}
|
||||
}
|
||||
|
||||
void help(){
|
||||
printf(" ls | wyswietla pliki w biezacym katalogu\n");
|
||||
printf(" | z arg -a lacznie z plikami ukrytymi\n");
|
||||
printf(" pwd | wyswietla katalog w ktorym obecnie znajduje sie uzytkownik\n");
|
||||
printf(" |\n");
|
||||
printf(" cp *plik1* *plik2* | kopiuje plik1 pod nazwa i lokalizacja plik2\n");
|
||||
printf(" |\n");
|
||||
printf(" mv *plik1* *plik2* | przenosi plik1 pod nazwa i do lokalizacji plik2\n");
|
||||
}
|
||||
|
||||
void cd(char **args,int size){ghost stories
|
||||
if(size>2) printf("Too many arguments\n");
|
||||
else{
|
||||
int d=chdir(args[1]);
|
||||
if(d==-1){
|
||||
printf("%s\n",strerror(errno));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void rm(char **args,int size){
|
||||
if(size==1) printf("Too few arguments\n");
|
||||
else{
|
||||
int i,des;
|
||||
for(i=1;i<size;i++){
|
||||
des=unlink(args[i]);
|
||||
if(des==-1){
|
||||
printf("%s-(%s)\n",strerror(errno),args[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void read_order(char **args,int size){
|
||||
if(strcmp(args[0],"pwd")==0){
|
||||
char cwd[1024];
|
||||
printf("%s\n",getcwd(cwd,1024));
|
||||
}
|
||||
else if(strcmp(args[0],"exit")==0){
|
||||
system("clear");
|
||||
exit(0);
|
||||
}
|
||||
else if(strcmp(args[0],"help")==0){
|
||||
help();
|
||||
}
|
||||
else if(strcmp(args[0],"touch")==0){
|
||||
touch(args,size);
|
||||
}
|
||||
else if(strcmp(args[0],"cd")==0){
|
||||
cd(args,size);
|
||||
}
|
||||
else if(strcmp(args[0],"mkdir")ghost stories==0){
|
||||
mk_dir(args,size);
|
||||
}
|
||||
else if(strcmp(args[0],"ls")==0){
|
||||
ls(args,size);
|
||||
}
|
||||
else if(strcmp(args[0],"mv")==0){
|
||||
mv(args,size);
|
||||
}
|
||||
else if(strcmp(args[0],"clear")==0){
|
||||
system("clear");
|
||||
}
|
||||
else if(strcmp(args[0],"rm")==0){
|
||||
rm(args,size);
|
||||
}
|
||||
else{
|
||||
pid_t pid=fork();
|
||||
if(pid==0){
|
||||
int des=execvp(args[0],args);
|
||||
if(des==-1){
|
||||
printf("%s\n",strerror(errno));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}else{
|
||||
waitpid(pid,0,0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void extract_args(char line[BUFFER_SIZE]){
|
||||
int i,size=0;
|
||||
for(i=0;i<BUFFER_SIZE;i++){
|
||||
if(line[i]==' '){
|
||||
size++;
|
||||
}
|
||||
if(line[i]=='\n'){ghost stories
|
||||
size++;
|
||||
line[i]=' ';
|
||||
break;
|
||||
}
|
||||
}
|
||||
char **args=malloc((size+1)*sizeof(char));
|
||||
char *del=" ";
|
||||
args[0]=strtok(line,del);
|
||||
for(i=1;i<size;i++){
|
||||
args[i]=strtok(NULL,del);
|
||||
}
|
||||
read_order(args,size);
|
||||
}
|
||||
|
||||
int main(){
|
||||
system("clear");
|
||||
while(true)
|
||||
{
|
||||
char cwd[1024];
|
||||
char line[BUFFER_SIZE];
|
||||
char *login=getlogin();
|
||||
getcwd(cwd,1024);
|
||||
printf("\033[0;36m%s@\033[0m[%s]$ ",login,cwd);
|
||||
fgets(line,BUFFER_SIZE,stdin);
|
||||
if(strcmp(line,"\n")==0) continue;
|
||||
extract_args(line);
|
||||
}
|
||||
return 0;
|
||||
}
|
5
microshell/makefile
Normal file
5
microshell/makefile
Normal file
@ -0,0 +1,5 @@
|
||||
microshell: microshell.c
|
||||
make:
|
||||
gcc microshell.c -o microshell
|
||||
clean:
|
||||
rm microshell
|
BIN
microshell/microshell
Normal file
BIN
microshell/microshell
Normal file
Binary file not shown.
200
microshell/microshell.c
Normal file
200
microshell/microshell.c
Normal file
@ -0,0 +1,200 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <stdbool.h>
|
||||
#include <dirent.h>
|
||||
#define BUFFER_SIZE 2048
|
||||
|
||||
void mv(char **args,int size){
|
||||
if(size>3){
|
||||
printf("Too many arguments\n");
|
||||
return;
|
||||
}
|
||||
int des=link(args[1],args[2]);
|
||||
if(des==-1){
|
||||
printf("%s\n",strerror(errno));
|
||||
}else{
|
||||
unlink(args[1]);
|
||||
}
|
||||
}
|
||||
|
||||
void ls(char **args,int size){
|
||||
struct dirent *des;
|
||||
DIR *dr;
|
||||
if(size==1) dr=opendir(".");
|
||||
if(size==2) dr=opendir(args[1]);
|
||||
if(size>2){
|
||||
printf("Too many arguments\n");
|
||||
return;
|
||||
}
|
||||
if(dr==NULL){
|
||||
printf("%s\n",strerror(errno));
|
||||
return;
|
||||
}
|
||||
while((des=readdir(dr))!=NULL){
|
||||
char *nazwa=des->d_name;
|
||||
if(nazwa[0]!='.') printf("%s\n",nazwa);
|
||||
}
|
||||
closedir(dr);
|
||||
}
|
||||
|
||||
void mk_dir(char **args,int size){
|
||||
int i=0,w;
|
||||
if(size==1) printf("Missing operand\n");
|
||||
else{
|
||||
for(i=1;i<size;i++){
|
||||
w=mkdir(args[i],0777);
|
||||
if(w==-1) printf("%s (%s)\n",strerror(errno),args[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void touch(char **args,int size){
|
||||
int i;
|
||||
for(i=1;i<size;i++){
|
||||
int des=open(args[i],O_CREAT,S_IWRITE|S_IREAD);
|
||||
if(des==(-1)){
|
||||
printf("%s\n",strerror(errno));
|
||||
}
|
||||
close(des);
|
||||
}
|
||||
}
|
||||
|
||||
void help(){
|
||||
printf(" Microshell by: Wojciech Wiśniewski\n");
|
||||
printf("----------------------------------------------------------\n");
|
||||
printf(" cd *path* | zmienia bieżący katalog na *path*\n");
|
||||
printf(" |\n");
|
||||
printf(" ls | wyświetla pliki w bieżacym katalogu\n");
|
||||
printf(" |\n");
|
||||
printf(" pwd | wyswietla katalog w którym obecnie znajduje się użytkownik\n");
|
||||
printf(" |\n");
|
||||
printf(" rm *file* | usuwa plik *file*\n");
|
||||
printf(" |\n");
|
||||
printf(" mv *file1* *file2* | przenosi plik1 do lokalizacji plik2\n");
|
||||
printf(" |\n");
|
||||
printf(" mkdir *katalog* | tworzy folder o nazwie/ścieżce *katalog*\n");
|
||||
printf(" |\n");
|
||||
printf(" touch *file* | wysyła sygnał do pliku *file*, jeżeli plik o tej nazwie nie istnieje to zostaje on stworzony\n");
|
||||
printf(" |\n");
|
||||
printf(" *path* lub ./*name* | wykonuje program o ścieżce *path* lub *name* gdy znajduje sie w bieżącym folderze\n");
|
||||
printf(" |\n");
|
||||
printf(" exit | kończy działanie programu\n");
|
||||
}
|
||||
|
||||
void cd(char **args,int size){
|
||||
if(size>2) printf("Too many arguments\n");
|
||||
else{
|
||||
int d=chdir(args[1]);
|
||||
if(d==-1){
|
||||
printf("%s\n",strerror(errno));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void rm(char **args,int size){
|
||||
if(size==1) printf("Too few arguments\n");
|
||||
else{
|
||||
int i,des;
|
||||
for(i=1;i<size;i++){
|
||||
des=unlink(args[i]);
|
||||
if(des==-1){
|
||||
printf("%s-(%s)\n",strerror(errno),args[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void read_order(char **args,int size){
|
||||
if(strcmp(args[0],"pwd")==0){
|
||||
char cwd[1024];
|
||||
printf("%s\n",getcwd(cwd,1024));
|
||||
}
|
||||
else if(strcmp(args[0],"exit")==0){
|
||||
system("clear");
|
||||
exit(0);
|
||||
}
|
||||
else if(strcmp(args[0],"help")==0){
|
||||
help();
|
||||
}
|
||||
else if(strcmp(args[0],"touch")==0){
|
||||
touch(args,size);
|
||||
}
|
||||
else if(strcmp(args[0],"cd")==0){
|
||||
cd(args,size);
|
||||
}
|
||||
else if(strcmp(args[0],"mkdir")==0){
|
||||
mk_dir(args,size);
|
||||
}
|
||||
else if(strcmp(args[0],"ls")==0){
|
||||
ls(args,size);
|
||||
}
|
||||
else if(strcmp(args[0],"mv")==0){
|
||||
mv(args,size);
|
||||
}
|
||||
else if(strcmp(args[0],"clear")==0){
|
||||
system("clear");
|
||||
}
|
||||
else if(strcmp(args[0],"rm")==0){
|
||||
rm(args,size);
|
||||
}
|
||||
else if(args[0][0]=='/'||(args[0][0]=='.'&&args[0][1]=='/')){
|
||||
pid_t pid=fork();
|
||||
if(pid==0){
|
||||
int des=execvp(args[0],args);
|
||||
if(des==-1){
|
||||
printf("%s\n",strerror(errno));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}else{
|
||||
waitpid(pid,0,0);
|
||||
}
|
||||
}
|
||||
else{
|
||||
printf("Unknown command\n");
|
||||
}
|
||||
}
|
||||
|
||||
void extract_args(char line[BUFFER_SIZE]){
|
||||
int i,size=0;
|
||||
for(i=0;i<BUFFER_SIZE;i++){
|
||||
if(line[i]==' '){
|
||||
size++;
|
||||
}
|
||||
if(line[i]=='\n'){
|
||||
size++;
|
||||
line[i]=' ';
|
||||
break;
|
||||
}
|
||||
}
|
||||
char **args=(char**) calloc((size+1),sizeof(char*));
|
||||
char *del=" ";
|
||||
args[0]=strtok(line,del);
|
||||
for(i=1;i<size;i++){
|
||||
args[i]=strtok(NULL,del);
|
||||
}
|
||||
args[size]=NULL;
|
||||
read_order(args,size);
|
||||
}
|
||||
|
||||
int main(){
|
||||
system("clear");
|
||||
while(true)
|
||||
{
|
||||
char cwd[1024];
|
||||
char line[BUFFER_SIZE];
|
||||
char *login=getlogin();
|
||||
getcwd(cwd,1024);
|
||||
printf("\033[0;36m%s@\033[0m[%s]$ ",login,cwd);
|
||||
fgets(line,BUFFER_SIZE,stdin);
|
||||
if(strcmp(line,"\n")==0) continue;
|
||||
extract_args(line);
|
||||
}
|
||||
return 0;
|
||||
}
|
99
microshell/microshell_backup.c
Normal file
99
microshell/microshell_backup.c
Normal file
@ -0,0 +1,99 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <stdbool.h>
|
||||
#define BUFFER_SIZE 4096
|
||||
|
||||
void mk_dir(){
|
||||
|
||||
}
|
||||
|
||||
void touch(){
|
||||
char file[1024];
|
||||
scanf("%s",file);
|
||||
int des=open(file, O_CREAT | O_EXCL, S_IWRITE|S_IREAD);
|
||||
if(des==(-1)){
|
||||
printf("%s\n",strerror(errno));
|
||||
}
|
||||
}
|
||||
|
||||
void help(){
|
||||
printf(" ls | wyswietla pliki w biezacym katalogu\n");
|
||||
printf(" | z arg -a lacznie z plikami ukrytymi\n");
|
||||
printf(" pwd | wyswietla katalog w ktorym obecnie znajduje sie uzytkownik\n");
|
||||
printf(" |\n");
|
||||
printf(" cp *plik1* *plik2* | kopiuje plik1 pod nazwa i lokalizacja plik2\n");
|
||||
printf(" |\n");
|
||||
printf(" mv *plik1* *plik2* | przenosi plik1 pod nazwa i do lokalizacji plik2\n");
|
||||
}
|
||||
|
||||
void cd(){
|
||||
char pathname[50];
|
||||
scanf("%s",pathname);
|
||||
chdir(pathname);
|
||||
}
|
||||
|
||||
void read_order(char order[20]){
|
||||
if(strcmp(order,"pwd")==0){
|
||||
char cwd[1024];
|
||||
printf("%s\n",getcwd(cwd,1024));
|
||||
}
|
||||
else if(strcmp(order,"exit")==0){
|
||||
exit(0);
|
||||
}
|
||||
else if(strcmp(order,"help")==0){
|
||||
help();
|
||||
}
|
||||
else if(strcmp(order,"touch")==0){
|
||||
touch();
|
||||
}
|
||||
else if(strcmp(order,"cd")==0){
|
||||
cd();
|
||||
}
|
||||
else{
|
||||
printf("Unknown command\n");
|
||||
}
|
||||
}
|
||||
|
||||
void extract_args(char line[BUFFER_SIZE],int *status){
|
||||
int i=0,j=0;
|
||||
char order[16];
|
||||
for(i=0;i<16;i++){
|
||||
if(line[i]!=' '&&line[i]!='\n'){
|
||||
order[i]=line[i];
|
||||
}
|
||||
else if(line[i]=='\n'){
|
||||
i=0;
|
||||
break;
|
||||
}else{
|
||||
i++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
read_order(order);
|
||||
|
||||
}
|
||||
|
||||
int main(){
|
||||
while(true)
|
||||
{
|
||||
char cwd[1024];
|
||||
char line[BUFFER_SIZE];
|
||||
int status=0;
|
||||
int i;
|
||||
getcwd(cwd,1024);
|
||||
printf("%s:-$ ",cwd);
|
||||
fgets(line,BUFFER_SIZE,stdin);
|
||||
if(strcmp(line,"\n")==0) continue;
|
||||
extract_args(line,&status);
|
||||
// extract_args();
|
||||
}
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user