Advertisement
SirNickolas

OS 5 server.c

Oct 31st, 2014
588
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.88 KB | None | 0 0
  1. #include <errno.h>
  2. #include <stdbool.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <sys/iomsg.h>
  6. #include <sys/neutrino.h>
  7. #include <unistd.h>
  8. #include "httpd_pid.h"
  9.  
  10. const char HELP[ ] = "\
  11. OS Lab 5 Server v1.0\n\
  12. \n\
  13. Available commands:\n\
  14.  help\n\
  15.  ls\n\
  16.  cat\n\
  17.  cp\n\
  18.  rm\n\
  19. ";
  20.  
  21. const char ERROR[ ] = "Invalid command; use 'help' for more information\n"
  22.  
  23. char buffer[65535];
  24.  
  25. short CheckCommand(const char cmd[ ]) {
  26.     switch (cmd[0]) {
  27.         case 'h': {
  28.             return cmd[1] == 'e' && cmd[2] == 'l' && cmd[3] == 'p' && !cmd[4] ? 2 : 0;
  29.         }
  30.  
  31.         case 'l': {
  32.             return (short)(cmd[1] == 's' && (cmd[2] == ' ' || !cmd[2]));
  33.         }
  34.  
  35.         case 'c': {
  36.             if (cmd[1] == 'a')
  37.                 return (short)(cmd[2] == 't' && cmd[3] == ' ');
  38.             if (cmd[1] == 'p')
  39.                 return (short)(cmd[2] == ' ');
  40.             break;
  41.         }
  42.  
  43.         case 'r': {
  44.             return (short)(cmd[1] == 'm' && cmd[2] == ' ');
  45.         }
  46.     }
  47.     return 0;
  48. }
  49.  
  50. int main(void) {
  51.     int channelId = ChannelCreate(0);
  52.     FILE* f = fopen(HTTPD_PID, "w");
  53.     if (!f) {
  54.         fputs("Cannot open \"" HTTPD_PID "\"\n", stderr);
  55.         return 1;
  56.     }
  57.     //Node descriptor всегда равен нулю, поскольку и клиент, и сервер работают на одной машине.
  58.     //^ Запомнить: он тыкает пальцем в код клиента (функция ConnectAttach) и спрашивает!
  59.     fprintf(f, "0/%d/%d\n", getpid(), channelId);
  60.     fclose(f);
  61.     fputs(HELP, stdout);
  62.     while (true) {
  63.         int receivedId = MsgReceive(channelId, buffer, sizeof buffer, NULL);
  64.         const char* response = buffer;
  65.         int responseSize = 0;
  66.         switch (CheckCommand(buffer)) {
  67.             case 0: {
  68.                 response = ERROR;
  69.                 responseSize = sizeof ERROR;
  70.                 break;
  71.             }
  72.  
  73.             case 1: {
  74.                 //Даем клиенту полный доступ к командной строке сервера,
  75.                 //позволяя ему выполнять любой вредоносный код.
  76.                 //Если вдруг обратит на это внимание (что вряд ли), сказать,
  77.                 //что исправляется более подробным разбором строки.
  78.                 f = popen(buffer, "r");
  79.                 responseSize = fread(buffer, sizeof(char), sizeof buffer / sizeof(char) - 1, f);
  80.                 buffer[responseSize++] = '\0';
  81.                 pclose(f);
  82.                 break;
  83.             }
  84.  
  85.             case 2: {
  86.                 response = HELP;
  87.                 responseSize = sizeof HELP;
  88.             }
  89.         }
  90.         MsgReply(receivedId, EOK, response, responseSize);
  91.     }
  92.     return 0;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement