#include #include #include #include #include #include #include #define cls() printf("\033H \033J\n") typedef void (*PFI)(void); typedef int (*COM_FUN)(void); enum { UNKNOWN=0,PRINT,DIRE,EDIT,PASCOMP,CCOMP,FORCOMP,DELETE,RUN,EXIT}; /* * The Global variables * * error_num : error number * user_name : the user's name * words : number of arguments * user_dir : user's directory * user_prn : user's printer number(0 or 1) * arg_id : argument's extension * argument : THE ARGUMENT !!! */ char work[30]="~sioan/prog"; char *user_name; char user_dir[50]; int words; int arg_id; int error_num; char user_prn[6]="-dlp"; char argument[10]; int dir() { int i=0; struct dirent *dp; DIR *mine; cls(); printf("Τα αςψεόα ρπυ ϋψετε στπ ψύςπ σαχ εόξαι:\n\n"); /* Open directory */ mine=opendir("."); /* Discard . and .. entries */ dp=readdir(mine); dp=readdir(mine); /* Start getting entries */ while((dp=readdir(mine))!=NULL) { printf("%-20s",dp->d_name); i= (i==2) ? (printf("\n"),0) : (printf(" "),i+1); } /* Close directory */ closedir(mine); printf("\n\n&dBΡΫτα Return για ξα εριστςϋωειχ στπ menu:&d@"); while (getchar()!='\n'); } int check_tty(char **tname) { *tname=ttyname(0); if (strstr(*tname,"pty")) { return -1; } else return 0; } giveword(word) char *word; { int i=0; char ch; while( (ch=getchar())==' ' ) ; ungetc(ch,stdin); while ( (ch=getchar())!='\n' && ch!=' ' ) word[i++]=ch; ungetc(ch,stdin); return (i) ? (word[i]='\0',i) : (getchar(),0); } void show_error() { static char *errors[]={ "Αξερυτιψάχ Ελτϋμεση","ΜΫθπχ Συστάννατπχ Αςψεόϊξ","Fork: Αξεραςλάχ Νξάνη", "Τπ αςψεόπ δεξ ϋψει λατΫμηοη .exec","Τπ αςψεόπ ϋψει λατΫμηοη .exec", "Αξΰραςλτα Πςόσνατα","Αγξϊστη Εξτπμά","ΜΫθπχ ΛατΫμηοη Αςψεόπυ" }; if (error_num==-1) return; printf("&a0c22R"); printf("&dB%s&d@\n",errors[error_num]); error_num=-1; } getcom(command,arg) char *command,*arg; { int num; if (giveword(command)==0) return (-1); else if ((num=giveword(arg))==0) return (0); while (getchar()!='\n'); return num; } set_tty(tty_name) char *tty_name; { int fd; struct termio test; fd=open(tty_name,O_WRONLY); ioctl(fd, TCGETA, &test); test.c_cc[VERASE]=''; test.c_cc[VKILL]=''; test.c_cc[VINTR]=3; test.c_cc[VEOF]=4; test.c_lflag |= ISIG; ioctl(fd, TCSETA, &test); close(fd); } char *get_login(char *passfile) { char encr[10]; int i,len,times=0; static char login[30]; char log[30]; char passwd[10]; char temp; char *pass; FILE *fp; cls(); fp=fopen(passfile,"r"); while (times<3) { printf("Login:"); scanf("%s",log); pass=getpass("Password:"); while(fscanf(fp,"%s %s %c",login,passwd,&temp)!=EOF && strcmp(login, log)); if (feof(fp)) printf("LOGIN NOT FOUND\n"); else { len=strlen(pass); for(i=0;pass[i];i++) encr[i]= (i==0) ? (pass[i]+pass[i+1]*len+len)%90+32 : (pass[i]+encr[i-1]+i)%90+32; encr[i]='\0'; if (strcmp(passwd,encr)==0) { fclose(fp); user_prn[4]=temp; user_prn[5]='\0'; printf("Got here\n uprn %s temp %c",user_prn,temp);getchar(); return (login); } else printf("Password Incorrect\n"); } rewind(fp); times++; } fclose(fp); exit (0); } int file_id(filename,len) char *filename; int len; { if (len<3) { return 5; } if (filename[len-2]=='.') /* Pascal,C or Fortran file (perhaps) */ { switch(filename[len-1]) { case 'c': return 1; case 'f': return 3; case 'p': return 2; default: return 5; } } else if (filename[len-5]=='.' && /* Perhaps a .exec file */ filename[len-4]=='e' && filename[len-3]=='x' && filename[len-2]=='e' && filename[len-1]=='c') return 4; else /* Definitely unknown */ return 5; } void menu() { cls(); printf("&dB%s&d@ &dDΕςγαστάςιπ ΝΠΡ Ρμηςπφπςιλάχ&d@\n", user_name); printf("\n**************************************************************************\n"); printf("&dDedit&d@ filename :Ερεοεςγασόα αςψεόπυ\n"); printf(" filename=έξπνα αςψεόπυ\n"); printf("&dDpascomp&d@ filename :ΝετΫφςαση αςψεόπυ γςαννϋξπ σε PASCAL\n"); printf(" filename=έξπνα αςψεόπυ\n"); printf("&dDforcomp&d@ filename :ΝετΫφςαση αςψεόπυ γςαννϋξπ σε FORTRAN\n"); printf(" filename=έξπνα αςψεόπυ\n"); printf("&dDccomp&d@ filename :ΝετΫφςαση αςψεόπυ γςαννϋξπ σε C\n"); printf(" filename=έξπνα αςψεόπυ\n"); printf("&dDrun&d@ filename :Ελτϋμεση ρςπγςΫννατπχ\n"); printf(" filename=έξπνα αςψεόπυ\n"); printf("&dDprint&d@ filename :Ελτΰρϊση αςψεόπυ\n"); printf(" filename=έξπνα αςψεόπυ\n"); printf("&dDdelete&d@ filename :Διαγςαφά (σβάσινπ) αςψεόπυ\n"); printf(" filename=έξπνα αςψεόπυ\n"); printf("&dDlogout&d@ :Εοπδπχ αρέ τπ σΰστηνα\n"); printf("***************************************************************************\n"); printf("\n EPILOGH : "); } int command_id(char *command) { if (strcmp(command,"print") ==0) return PRINT; else if (strcmp(command,"dir") ==0) return DIRE; else if (strcmp(command,"edit") ==0) return EDIT; else if (strcmp(command,"pascomp")==0) return PASCOMP; else if (strcmp(command,"forcomp")==0) return FORCOMP; else if (strcmp(command,"ccomp") ==0) return CCOMP; else if (strcmp(command,"delete") ==0) return DELETE; else if (strcmp(command,"run") ==0) return RUN; else if (strcmp(command,"logout") ==0) return EXIT; else return UNKNOWN; } int print() { if (fork()==0 ) execlp("/usr/bin/lp","lp",user_prn,argument,(char *) 0); else wait (0); } int unknown() { error_num=6; return -1; } static char compiler[15]; static char ansi[8]; int compile(char * argv[]) { pid_t pid; int pipefd[2]; if ((fork())==(pid_t) 0 ) { signal(2,SIG_IGN); pipe(pipefd); if ((pid=fork())==(pid_t) 0 ) { close(1); dup(pipefd[1]); close(pipefd[0]); execvp(*argv,argv); } else if (pid > (pid_t) 0) { close(0); dup(pipefd[0]); close(pipefd[1]); execlp("/usr/local/bin/less","less",(char*) 0); } } else wait((int *)0); return 0; } int comp() { int i,lastdot; static char option[3]="-o"; static char exec[5]="exec"; static char *CCOPTS[]={ "-Dsystem=SYSTEM_NOT_ALLOWED" ,"-Dexec=EXEC_NOT_ALLOWED__ADMINISTRATOR_NOTIFIED" ,"-Dexeclp=EXECLP_NOT_ALLOWED__ADMINISTRATOR_NOTIFIED" ,"-Dexecl=EXECL_NOT_ALLOWED__ADMINISTRATOR_NOTIFIED" ,"-Dexecvp=EXECVP_NOT_ALLOWED__ADMINISTRATOR_NOTIFIED" ,"-Dexecv=EXECV_NOT_ALLOWED__ADMINISTRATOR_NOTIFIED" }; char * argv[15]; char output[20]; cls(); printf("Compiling file:%s\n\n",argument); for (i=0; output[i]=argument[i]; i++) if (output[i]=='.') lastdot=i; for (i=0; output[lastdot+i+1]=exec[i]; i++); argv[0]=compiler; argv[1]=option; argv[2]=output; argv[3]=ansi; argv[4]=argument; if ( arg_id == 1) { for(i=6;i<12;i++) argv[i]=CCOPTS[i-6]; argv[5]="-lm"; argv[12]=0; } else argv[5]=0; compile(argv); return 0; } int ccomp() { if (arg_id!=1) return error_num=7; strcpy(compiler,"/bin/cc"); strcpy(ansi,"-Aa"); comp(); return 0; } int pascomp() { if (arg_id!=2) return error_num=7; strcpy(compiler,"/usr/bin/pc"); strcpy(ansi,"-A"); comp(); return 0; } int forcomp() { if (arg_id!=3) return error_num=7; strcpy(compiler,"/usr/bin/f77"); strcpy(ansi,"-a"); comp(); return 0; } int edit() { int res; if ( arg_id == 4) { error_num=4; return -1; } if (words==0) { error_num=5; return -1; } switch(fork()) { case -1: error_num=2; return -1; case 0 : execl("/usr/bin/vi","vi",argument,(char *)0); default: wait( &res ); } return (res==0) ? 0 : (error_num=0,-1) ; } int delete() { return (unlink(argument)==0) ? 0 : (error_num=1,-1); } int run() { int res; cls(); if (arg_id!=4) { error_num=3; return -1; } if (words == 0) { error_num=5; return -1; } switch(fork()) { case -1: error_num=2; printf("Fork:-1\n"); return -1; case 0: signal(2,SIG_DFL); execlp(argument,argument,(char *)0); default: wait( &res ); } printf("\n\n&dBΡΫτα Return για ξα εριστςϋωειχ στπ menu:&d@"); while (getchar()!='\n'); return (res==0) ? 0 : (error_num=0,-1); } int exit_now() { cls(); exit(0); } main() { char *tty_name; char command[10]; COM_FUN comm[]={ unknown,print,dir,edit,pascomp,ccomp,forcomp,delete, run,exit_now }; if (check_tty(&tty_name)==-1) { printf("\007 \007 \007"); printf("I wanna see you here\n"); printf("\007 \007 \007"); exit(-1); } set_tty(tty_name); /* Ignore Control C */ signal(2,SIG_IGN); signal(3,SIG_IGN); user_name=get_login("passwd"); while(getchar()!='\n'); strcpy(user_dir,user_name); strcat(user_dir,"/"); /*strcat(work,user_dir);*/ chdir(user_dir); error_num=-1; for(;;) { menu(); show_error(); printf("&a35c21R"); if ( (words=getcom(command,argument)) !=-1) { arg_id=file_id(argument,words); comm[command_id(command)](); } } }