Ask Question

Name:
Title:
Your Question:

Answer Question

Name:
Your Answer:
User Submitted Source Code!


Description:
  123
Language: C/C++
Code:
#include <sys/neutrino.h>
#include <sys/iomsg.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <process.h>
#include <stdbool.h>


int ChannelCreateOrExit() {
    int chid = ChannelCreate(0);
    if(chid == -1) {
        perror("Failed to create channel");
        exit(EXIT_FAILURE);
    }
    return chid;
}

void SaveServerInfo(int chid) {
     int pid = getpid();
     FILE *file_ID = fopen("ID.txt", "w");
    if(file_ID == NULL) {
        fprintf(stderr, "Can't save server info");
        return;
    }
     fprintf(file_ID, "%d %d", pid, chid);
     fclose(file_ID);
}

void PrintServerInfo(int chid) {
    printf("Server create. pid: %d, channel: %dn", getpid(), chid);
}

#define SIZE_BUFFER 1024

typedef enum Command {
    help, list, get, unknown
} Command;

Command ParseCommand(const char* cmd) {
    if( strncmp(cmd, "list", 4) == 0 ) {
        return list;
    }
    else if( strncmp(cmd, "get", 3) == 0 ) {
        return get;
    }
    else if( strncmp(cmd, "help", 4) == 0 ) {
        return help;
    }
    else {
        return unknown;
    }
}

// пишет в buffer help txt
void ProcessHelp(char* buffer, int size) {
    FILE *fHelp = fopen("help.txt", "rb");
    
    if(fHelp != NULL) {
        fread(buffer, 1, size, fHelp);
        fclose(fHelp);
    }
    else {
        strcpy(buffer, "No help =(");
    }
}

void ProcessList(char *buffer, int size) {
    strncpy(buffer, "  ls", 4); // 'list some_dir' -> '  ls some_dir'

    FILE *prLs = popen(buffer, "r");
    if( prLs == NULL) {
        strcpy(buffer, "Can't exec list =(");
        perror("Error in ProcessList");
        return;
    }

    fread(buffer, 1, size, prLs);
//    printf("ProcessList: %sn", buffer);
    pclose(prLs);
}

void ProcessGet(char *buffer, int size) {
    strncpy(buffer, "cat", 3); // 'get some_file' -> 'cat some_file'

    FILE *prGet = popen(buffer, "r");
    if( prGet == NULL) {
        strcpy(buffer, "Can't exec get =(");
        perror("Error in ProcessGet");
        return;
    }

    fread(buffer, 1, size, prGet);
 //   printf("ProcessList: %sn", buffer);
    pclose(prGet);
}

void ProcessUnknown(char *buffer, int size) {
    const char *header = "Unknown command!n";
    int sHeader = strlen(header);
    strcpy(buffer, header);

    ProcessHelp(buffer + sHeader, size - sHeader /*- 1*/);
}

bool ServerWork(int channelId) {
    char clientBuffer[SIZE_BUFFER] = {};
     /*
      int MsgReceive(int chid, void *rmsg, int rbytes, struct _msg_info *info);
      chid - the ID of a channel that you established by calling ChannelCreate()
      *rmsg - a pointer to a buffer where the function can store the received data.
      rbytes - the size of the buffer
      info - NULL, or pointer to a _msg_info structure where the function can store additional information about the message
     */
    int rcvid = MsgReceive(channelId, clientBuffer, SIZE_BUFFER, NULL);

    printf("%05d | Received: %sn", rcvid, clientBuffer);

    switch( ParseCommand(clientBuffer) ) {
        case help:
            ProcessHelp(clientBuffer, SIZE_BUFFER);
            break;
        case list:
            ProcessList(clientBuffer, SIZE_BUFFER);
            break;
        case get:
            ProcessGet(clientBuffer, SIZE_BUFFER);
            break;
        default:
            ProcessUnknown(clientBuffer, SIZE_BUFFER);
            break;
    }
    
    printf("%05d | Sending... data len's = %dn", rcvid, strlen(clientBuffer));
     
     
     /*
      int MsgReply( int rcvid, int status, const void* msg, int size);
      int status - The status to use when unblocking the client's MsgSend*() call in the rcvid thread. 
     */
    if( MsgReply (rcvid, EOK, clientBuffer, SIZE_BUFFER) == -1) {
        perror("Sending error");
    }

    return true;
}

int main(void) {
     
     int channelId = ChannelCreateOrExit();

    PrintServerInfo(channelId);
    SaveServerInfo(channelId);

    puts("Starting server...");
    puts("Enter Ctrl+C for stop");

    while(ServerWork(channelId));
     
    
    return 0;
}

          
Comments: