Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <errno.h>
- #include <stdbool.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/iomsg.h>
- #include <sys/neutrino.h>
- #include <unistd.h>
- #include "httpd_pid.h"
- const char HELP[ ] = "\
- OS Lab 5 Server v1.0\n\
- \n\
- Available commands:\n\
- help\n\
- ls\n\
- cat\n\
- cp\n\
- rm\n\
- ";
- const char ERROR[ ] = "Invalid command; use 'help' for more information\n"
- char buffer[65535];
- short CheckCommand(const char cmd[ ]) {
- switch (cmd[0]) {
- case 'h': {
- return cmd[1] == 'e' && cmd[2] == 'l' && cmd[3] == 'p' && !cmd[4] ? 2 : 0;
- }
- case 'l': {
- return (short)(cmd[1] == 's' && (cmd[2] == ' ' || !cmd[2]));
- }
- case 'c': {
- if (cmd[1] == 'a')
- return (short)(cmd[2] == 't' && cmd[3] == ' ');
- if (cmd[1] == 'p')
- return (short)(cmd[2] == ' ');
- break;
- }
- case 'r': {
- return (short)(cmd[1] == 'm' && cmd[2] == ' ');
- }
- }
- return 0;
- }
- int main(void) {
- int channelId = ChannelCreate(0);
- FILE* f = fopen(HTTPD_PID, "w");
- if (!f) {
- fputs("Cannot open \"" HTTPD_PID "\"\n", stderr);
- return 1;
- }
- //Node descriptor всегда равен нулю, поскольку и клиент, и сервер работают на одной машине.
- //^ Запомнить: он тыкает пальцем в код клиента (функция ConnectAttach) и спрашивает!
- fprintf(f, "0/%d/%d\n", getpid(), channelId);
- fclose(f);
- fputs(HELP, stdout);
- while (true) {
- int receivedId = MsgReceive(channelId, buffer, sizeof buffer, NULL);
- const char* response = buffer;
- int responseSize = 0;
- switch (CheckCommand(buffer)) {
- case 0: {
- response = ERROR;
- responseSize = sizeof ERROR;
- break;
- }
- case 1: {
- //Даем клиенту полный доступ к командной строке сервера,
- //позволяя ему выполнять любой вредоносный код.
- //Если вдруг обратит на это внимание (что вряд ли), сказать,
- //что исправляется более подробным разбором строки.
- f = popen(buffer, "r");
- responseSize = fread(buffer, sizeof(char), sizeof buffer / sizeof(char) - 1, f);
- buffer[responseSize++] = '\0';
- pclose(f);
- break;
- }
- case 2: {
- response = HELP;
- responseSize = sizeof HELP;
- }
- }
- MsgReply(receivedId, EOK, response, responseSize);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement