Advertisement
SirNickolas

OS 6 server.c

Nov 27th, 2014
539
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.47 KB | None | 0 0
  1. #include <errno.h>
  2. #include <stdbool.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <unistd.h>
  7. #include <sys/iomsg.h>
  8. #include <sys/neutrino.h>
  9. #include "httpd_pid.h"
  10.  
  11. const char HELP[ ] = "\
  12. OS Lab 5 Server v1.1\n\
  13. \n\
  14. Available commands:\n\
  15.  help\n\
  16.  ls\n\
  17.  cat\n\
  18.  cp\n\
  19.  rm\n\
  20.  echo\n\
  21. ";
  22.  
  23. const char ERROR[ ] = "Invalid command; use 'help' for more information\n"
  24.  
  25. char buffer[65535];
  26.  
  27. short CheckCommand(const char cmd[ ]) {
  28.     switch (cmd[0]) {
  29.         case 'e': {
  30.             return cmd[1] == 'c' && cmd[2] == 'h' && cmd[3] == 'o' && cmd[4] == ' ' ? 3 : 0;
  31.         }
  32.  
  33.         case 'h': {
  34.             return cmd[1] == 'e' && cmd[2] == 'l' && cmd[3] == 'p' && !cmd[4] ? 2 : 0;
  35.         }
  36.  
  37.         case 'l': {
  38.             return (short)(cmd[1] == 's' && (cmd[2] == ' ' || !cmd[2]));
  39.         }
  40.  
  41.         case 'c': {
  42.             if (cmd[1] == 'a')
  43.                 return (short)(cmd[2] == 't' && cmd[3] == ' ');
  44.             if (cmd[1] == 'p')
  45.                 return (short)(cmd[2] == ' ');
  46.             break;
  47.         }
  48.  
  49.         case 'r': {
  50.             return (short)(cmd[1] == 'm' && cmd[2] == ' ');
  51.         }
  52.     }
  53.     return 0;
  54. }
  55.  
  56. int main(void) {
  57.     int channelId = ChannelCreate(0);
  58.     FILE* f = fopen(HTTPD_PID, "w");
  59.     if (!f) {
  60.         fputs("Cannot open \"" HTTPD_PID "\"\n", stderr);
  61.         return 1;
  62.     }
  63.     fprintf(f, "0/%d/%d\n", getpid(), channelId);
  64.     fclose(f);
  65.     fputs(HELP, stdout);
  66.     while (true) {
  67.         int receivedId = MsgReceive(channelId, buffer, sizeof buffer, NULL);
  68.         const char* response = buffer;
  69.         int responseSize = 0;
  70.         switch (CheckCommand(buffer)) {
  71.             case 0: {
  72.                 response = ERROR;
  73.                 responseSize = sizeof ERROR;
  74.                 break;
  75.             }
  76.  
  77.             case 1: {
  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.                 break;
  89.             }
  90.  
  91.             case 3: {
  92.                 puts(buffer + 5);
  93.                 *response = '\0';
  94.                 responseSize = sizeof(char);
  95.             }
  96.         }
  97.         MsgReply(receivedId, EOK, response, responseSize);
  98.     }
  99.     return 0;
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement