server0451

Форк
0
/
cmd.c 
127 строк · 3.8 Кб
1
/******************* ОПИСАНИЕ *******************/
2

3
/**
4
 * Имя файла: cmd.c
5
 * ----------------------------------------------------------------------------|---------------------------------------|
6
 * Назначение: обработка команд.
7
 * ----------------------------------------------------------------------------|---------------------------------------|
8
 * Примечания:
9
 */
10

11

12
/************ ДИРЕКТИВЫ ПРЕПРОЦЕССОРА ***********/
13

14
/*--- Включения ---*/
15

16
// Из стандартной библиотеки языка Си.
17
#include <stdio.h>
18
#include <inttypes.h>
19
#include <stdbool.h>
20
#include <string.h>
21

22
// Из библиотек POSIX.
23
#include <unistd.h>
24

25
// Настройки.
26
#include "config_general.h"
27

28
// Локальные модули.
29
#include "cmd.h"
30
#include "utilities.h"
31
#include "sockets.h"
32

33

34
/******************** ФУНКЦИИ *******************/
35

36
uint32_t cmd_extract(char *buf, char *buf_cmd, char *buf_topic, char delim)
37
{
38
    char *cmd_ptr = strrchr(buf, delim);
39
    if (cmd_ptr != NULL) {
40
        *cmd_ptr = '\0';
41
        strcpy(buf_cmd, cmd_ptr + 1);
42
    } else {
43
        return CMD_ERR_EXTRACT;
44
    }
45
    
46
    char *topic_ptr = strchr(buf, delim);
47
    if (topic_ptr != NULL) {
48
        strcpy(buf_topic, topic_ptr + 1);
49
    } else {
50
        return CMD_ERR_EXTRACT;
51
    }
52

53
    return CMD_OK;
54
}
55

56
uint32_t cmd_handle(int32_t connfd, char *buf, uint32_t verbosity_level)
57
{
58
    /* --- Извлечение имени топика и команды из сообщения ---*/
59

60
    char buf_cmd[STR_MAX_LEN + 1] = {0};
61
    char buf_topic[STR_MAX_LEN + 1] = {0};
62

63
    uint32_t cmd_extract_retval = cmd_extract(buf, buf_cmd, buf_topic, DELIM_CHAR);
64
    if (cmd_extract_retval != 0) {
65
    	return cmd_extract_retval;
66
    }
67

68
    utilities_to_lowercase_string(buf_topic);
69

70

71
    /*--- Определение пути к файлу топика ---*/
72

73
    char topic_file_path[STR_MAX_LEN * 2 + 1] = {0};
74
    readlink("/proc/self/exe", topic_file_path, sizeof(topic_file_path));
75
    char *ptr = strrchr(topic_file_path, '/') + 1;
76
    strcpy(ptr, "../.topics/");
77
    strcat(topic_file_path, buf_topic);
78

79

80
    /*--- Выполнение команды ---*/
81

82
    bool current_cmd_load_toggle = !strcmp(buf_cmd, CMD_LOAD_TOGGLE);
83
    if (current_cmd_load_toggle) {
84
        utilities_read_from_file_single_line(buf_cmd, sizeof(buf_cmd), topic_file_path);
85

86
        if (!strcmp(buf_cmd, CMD_LOAD_ON)) {
87
            strcpy(buf_cmd, CMD_LOAD_OFF);
88
        } else if (!strcmp(buf_cmd, CMD_LOAD_OFF)) {
89
            strcpy(buf_cmd, CMD_LOAD_ON);
90
        } else {
91
            return CMD_ERR_TOGGLE;
92
        }
93
    }
94

95
    bool current_cmd_load_on       = !strcmp(buf_cmd, CMD_LOAD_ON);
96
    bool current_cmd_load_off      = !strcmp(buf_cmd, CMD_LOAD_OFF);
97
    bool current_cmd_topic_request = !strcmp(buf_cmd, CMD_TOPIC_REQUEST);
98

99
    if (current_cmd_load_on || current_cmd_load_off) {
100
        utilities_write_to_file_single_line(buf_cmd, topic_file_path);
101

102
        if (verbosity_level > 0) {
103
            printf("\nNew command posted: %s\n", buf_cmd);
104
        }
105
    
106
        strcpy(buf, "New command posted: ");
107
        strcat(buf, buf_cmd);
108
        sockets_write_message(connfd, buf, 0);
109

110
        return CMD_OK;
111
    }
112

113
    if (current_cmd_topic_request) {
114
        utilities_read_from_file_single_line(buf_cmd, sizeof(buf_cmd), topic_file_path);
115

116
        printf("\nCurrent topic contents requested.\n");
117

118
        sockets_write_message(connfd, buf_cmd, verbosity_level);
119

120
        return CMD_OK;
121
    }
122

123
    /* Программа доходит до этой точки только в случае, если в сообщении
124
     * от клиента не было найдено ни одной валидной команды.
125
     */
126
    return CMD_ERR_NO_VALID_COMMAND;
127
}
128

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.