Advertisement
Guest User

Untitled

a guest
Dec 9th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.54 KB | None | 0 0
  1. #include <unistd.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <sys/types.h>
  7. #include <sys/wait.h>
  8. #include <fcntl.h>
  9.  
  10.  
  11. #include "utils.h"
  12. #include "listen.h"
  13. #include "wortspeicher.h"
  14. #include "kommandos.h"
  15. #include "frontend.h"
  16. #include "parser.h"
  17. #include "variablen.h"
  18. #define DATA_SIZE 512
  19.  
  20. pid_t ids[100];
  21. pid_t gids[100];
  22. char *Codes[100];
  23. char *MaxBef[100];
  24. int counter=0;
  25. int interpretiere(Kommando k, int forkexec);
  26.  
  27. void do_execvp(int argc, char **args){
  28. execvp(*args, args);
  29. perror("exec-Fehler");
  30. fprintf(stderr, "bei Aufruf von \"%s\"\n", *args);
  31. exit(1);
  32. }
  33.  
  34. int interpretiere_pipeline(Kommando k){
  35. /* NOT IMPLEMENTED */
  36. fputs("NOT IMPLEMENTEDeeeeeed", stderr);
  37. return 0;
  38. }
  39.  
  40. int umlenkungen(Kommando k){
  41. Liste ul = k->u.einfach.umlenkungen;
  42. Umlenkung *u;
  43. char textA[500] = "";
  44. //fprintf(stderr, "\"%s\" ", *k->u.einfach.worte);
  45. for(int i=0; i < k->u.einfach.wortanzahl; i++){
  46. strcat(textA,(k->u.einfach.worte)[i]);
  47. strcat(textA, " ");
  48. }
  49. //fprintf(stderr, "\"%s\" ", textA);
  50. FILE *pf;
  51. char puffer[DATA_SIZE];
  52. while(ul){
  53. u = listeKopf(ul);
  54. //fprintf(stderr, "%d%s %s", u->filedeskriptor, u->modus==READ ? "< " : u->modus==WRITE ? "> " : ">> ", u->pfad);
  55. if(u->modus==WRITE){
  56. //fputs("Fehlerhaftes Kommando\n", stderr);
  57. pf=popen(textA,"r");
  58. FILE *datei = fopen (u->pfad,"w");
  59. while(fgets(puffer,DATA_SIZE,pf)){
  60. fprintf (datei, "%s",puffer);
  61. //fputs(puffer,stderr);
  62. }
  63. //fgets(puffer,DATA_SIZE,pf);
  64. pclose(pf);
  65. fclose (datei);
  66. return 1;
  67. }
  68. if(u->modus==READ){
  69. pf=popen(textA,"w");
  70. FILE *datei = fopen (u->pfad,"r");
  71. while(fgets(puffer,DATA_SIZE,datei)){
  72. fputs(puffer, pf);
  73. }
  74. pclose(pf);
  75. fclose (datei);
  76. return 1;
  77. }
  78.  
  79. if(u->modus==APPEND){
  80. pf=popen(textA,"r");
  81. FILE *datei = fopen (u->pfad,"a");
  82. while(fgets(puffer,DATA_SIZE,pf)){
  83. fprintf (datei, "%s",puffer);
  84. //fputs(puffer,stderr);
  85. }
  86. //fgets(puffer,DATA_SIZE,pf);
  87. pclose(pf);
  88. fclose (datei);
  89. return 1;
  90. }
  91. ul = listeRest(ul);
  92. }
  93. return 0;
  94. }
  95.  
  96. int aufruf(Kommando k, int forkexec){
  97. //printf("%i",forkexec);
  98. /* Programmaufruf im aktuellen Prozess (forkexec==0)
  99. oder Subprozess (forkexec==1)
  100. */
  101. //umlenkungen(k);
  102. int status;
  103. MaxBef[counter] = *k->u.einfach.worte;
  104. if(forkexec){
  105. int pid;
  106. if ((pid = fork()) == -1){
  107. perror("Fehler bei fork");
  108. return(-1);
  109. } else if (pid == 0) {
  110. if(umlenkungen(k))
  111. exit(1);
  112. do_execvp(k->u.einfach.wortanzahl, k->u.einfach.worte);
  113. abbruch("interner Fehler 001"); /* sollte nie ausgeführt werden */
  114.  
  115. } else {
  116. if(k->endeabwarten)waitpid(pid, &status, 0);
  117. /* So einfach geht das hier nicht! */
  118. //waitpid(pid, &status, WNOHANG);
  119. return 0;
  120. }
  121. }
  122.  
  123. /* nur exec, kein fork */
  124. if(umlenkungen(k))
  125. exit(1);
  126. do_execvp(k->u.einfach.wortanzahl, k->u.einfach.worte);
  127. abbruch("interner Fehler 001"); /* sollte nie ausgeführt werden */
  128. exit(1);
  129. }
  130.  
  131.  
  132. int interpretiere_einfach(Kommando k, int forkexec){
  133. char **worte = k->u.einfach.worte;
  134. int anzahl=k->u.einfach.wortanzahl;
  135. if (strcmp(worte[0], "exit")==0) {
  136. switch(anzahl){
  137. case 1:
  138. exit(0);
  139. case 2:
  140. exit(atoi(worte[1]));
  141. default:
  142. fputs( "Aufruf: exit [ ZAHL ]\n", stderr);
  143. return -1;
  144. }
  145. }
  146.  
  147. if (strcmp(worte[0], "cd")==0) {
  148. chdir(worte[1]);
  149. return 0;
  150. }
  151. return aufruf(k, forkexec);
  152. }
  153.  
  154. int interpretiere(Kommando k, int forkexec){
  155. int status;
  156. //kommandoZeigen(k);
  157. switch(k->typ){
  158. case K_LEER:
  159. return 0;
  160. case K_EINFACH:
  161. return interpretiere_einfach(k, forkexec);
  162. case K_SEQUENZ:
  163. {
  164. Liste l = k->u.sequenz.liste;
  165. while(!listeIstleer(l)){
  166. status=interpretiere ((Kommando)listeKopf(l), forkexec);
  167. l=listeRest(l);
  168. }
  169. }
  170. return status;
  171. default:
  172. fputs("unbekannter Kommandotyp, Bearbeitung nicht implementiert\n", stderr);
  173. break;
  174. }
  175. return 0;
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement