server0451
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
36uint32_t cmd_extract(char *buf, char *buf_cmd, char *buf_topic, char delim)37{
38char *cmd_ptr = strrchr(buf, delim);39if (cmd_ptr != NULL) {40*cmd_ptr = '\0';41strcpy(buf_cmd, cmd_ptr + 1);42} else {43return CMD_ERR_EXTRACT;44}45
46char *topic_ptr = strchr(buf, delim);47if (topic_ptr != NULL) {48strcpy(buf_topic, topic_ptr + 1);49} else {50return CMD_ERR_EXTRACT;51}52
53return CMD_OK;54}
55
56uint32_t cmd_handle(int32_t connfd, char *buf, uint32_t verbosity_level)57{
58/* --- Извлечение имени топика и команды из сообщения ---*/59
60char buf_cmd[STR_MAX_LEN + 1] = {0};61char buf_topic[STR_MAX_LEN + 1] = {0};62
63uint32_t cmd_extract_retval = cmd_extract(buf, buf_cmd, buf_topic, DELIM_CHAR);64if (cmd_extract_retval != 0) {65return cmd_extract_retval;66}67
68utilities_to_lowercase_string(buf_topic);69
70
71/*--- Определение пути к файлу топика ---*/72
73char topic_file_path[STR_MAX_LEN * 2 + 1] = {0};74readlink("/proc/self/exe", topic_file_path, sizeof(topic_file_path));75char *ptr = strrchr(topic_file_path, '/') + 1;76strcpy(ptr, "../.topics/");77strcat(topic_file_path, buf_topic);78
79
80/*--- Выполнение команды ---*/81
82bool current_cmd_load_toggle = !strcmp(buf_cmd, CMD_LOAD_TOGGLE);83if (current_cmd_load_toggle) {84utilities_read_from_file_single_line(buf_cmd, sizeof(buf_cmd), topic_file_path);85
86if (!strcmp(buf_cmd, CMD_LOAD_ON)) {87strcpy(buf_cmd, CMD_LOAD_OFF);88} else if (!strcmp(buf_cmd, CMD_LOAD_OFF)) {89strcpy(buf_cmd, CMD_LOAD_ON);90} else {91return CMD_ERR_TOGGLE;92}93}94
95bool current_cmd_load_on = !strcmp(buf_cmd, CMD_LOAD_ON);96bool current_cmd_load_off = !strcmp(buf_cmd, CMD_LOAD_OFF);97bool current_cmd_topic_request = !strcmp(buf_cmd, CMD_TOPIC_REQUEST);98
99if (current_cmd_load_on || current_cmd_load_off) {100utilities_write_to_file_single_line(buf_cmd, topic_file_path);101
102if (verbosity_level > 0) {103printf("\nNew command posted: %s\n", buf_cmd);104}105
106strcpy(buf, "New command posted: ");107strcat(buf, buf_cmd);108sockets_write_message(connfd, buf, 0);109
110return CMD_OK;111}112
113if (current_cmd_topic_request) {114utilities_read_from_file_single_line(buf_cmd, sizeof(buf_cmd), topic_file_path);115
116printf("\nCurrent topic contents requested.\n");117
118sockets_write_message(connfd, buf_cmd, verbosity_level);119
120return CMD_OK;121}122
123/* Программа доходит до этой точки только в случае, если в сообщении124* от клиента не было найдено ни одной валидной команды.
125*/
126return CMD_ERR_NO_VALID_COMMAND;127}
128