-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlog.cpp
More file actions
199 lines (180 loc) · 5.67 KB
/
Copy pathlog.cpp
File metadata and controls
199 lines (180 loc) · 5.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
#include "main.h"
char* username; // Переменная под имя пользователя
char log_buff[128]; //Переменная под сборку пути к логу
bool Overflow; // Переменная показывающая не переполнен ли лог
int Errornum; // Переменная под хранение номера ошибки
int isLogExist() // Функция проверки наличия и переполнения лога
{
struct stat logStat; // Создание структуры информации о файле
username = getenv("USER"); // Получение имени пользователя
sprintf(log_buff, "%s%s%s", "/home/",username, "/Desktop/Ping/Ping_log.txt" ); // Сборка пути
if ( stat((char *)log_buff, &logStat) == -1 ) // Заполнение структуры информации о файле
{
return 1;// Возвращаем 1 говоря что файла не существует
}
else if (logStat.st_size > MaxSize)
{
std::cout << "Файл лога переполнился и будет перезаписан";
Overflow = true;
return 1;
}
return 0;// Возвращаем 0 говоря что файла существует // Возвращаем 0 говоря что файла существует
}
int createLog() // Функция создания папки и лога
{
char path_buff[128];//Переменная под сборку команды
int result;// Переменная под результат создания папки
sprintf(path_buff, "%s%s%s","mkdir -p /home/", username, "/Desktop/Ping" );// Сборка команды создания директории
result = system(path_buff);// Создание директории
if (result == -1) // Обработка ошибки
{
ErrorOutput(10);
return 1;
}
if (Overflow)
{
result = open((char*)log_buff, O_RDWR | O_TRUNC); // Перезапись файла лога
}
else
{
result = open((char*)log_buff, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);// Создание файла
}
if (result == -1) // Обработка ошибки
{
Errornum = errno;
LogfileDiag(Errornum);
ErrorOutput(11);
return 1;
}
close(result);
return 0;
}
int ErrorOutput(int TypeError) // Функция записи ошибки в лог
{
switch(TypeError)
{
case 10:
{
std::cout <<"Ошибка создания директории для лога"<<std::endl;
break;
}
case 11:
{
std::cout <<"Ошибка создания файла лога"<<std::endl;
break;
}
case 12:
{
std::cout <<"Ошибка записи в лог"<<std::endl;
break;
}
case 20:
{
AddMessageToLog("ERROR Неверное количество входных аргументов");
break;
}
case 30:
{
AddMessageToLog("ERROR Доменное имя не соответствует никакому IP");
break;
}
case 40:
{
AddMessageToLog("ERROR Пакет не собран");
break;
}
case 41:
{
AddMessageToLog("ERROR malloc");
break;
}
case 42:
{
AddMessageToLog("ERROR Недостаточно прав");
break;
}
case 50:
{
AddMessageToLog("ERROR При отправке возникла ошибка");
break;
}
case 60:
{
AddMessageToLog("ERROR Пакет не получен");
break;
}
case 61:
{
AddMessageToLog("ERROR select()");
break;
}
case 62:
{
AddMessageToLog("ERROR Не соответсвие разменра пакета ");
break;
}
case 63:
{
AddMessageToLog("ERROR Нет данных о ноде");
break;
}
}
return 0;
}
void LogfileDiag(int TypeError)
{
switch(TypeError)// Вывод сообщения в зависимости от значения errno
{
case 1:
{
std::cout <<"Операция не разрешена";
break;
}
case 12:
{
std::cout <<"Не достаточно памяти";
break;
}
case 13:
{
std::cout <<"Доступ запрещен";
break;
}
case 26:
{
std::cout <<"Текстовый файл занят";
break;
}
default:
{
std::cout <<"Неопознанная ошибка код errno = " << TypeError;
break;
}
}
}
int AddMessageToLog(std::string Message) // Функция добавления записи в лог
{
char buff[512];// Буфер для формирования записи в лог
char *date;// Переменная для получения текущей даты
time_t now;// Структура для получения времени
date = NULL;
char *Mess = new char[Message.length() + 1];// Создание массива под содержимое сообщения
strcpy(Mess, Message.c_str());// Копирование сообщения в массив
time(&now);// Заполняем структуру
date = ctime(&now);
date[strlen(date)-1] = '\0';
sprintf(buff, "[%s] %s", date, Mess);// Формирование записи в лог
std::fstream fs;
fs.open(log_buff, std::fstream::app);// Открытие файла
if (!fs.is_open())
{
Errornum = errno;
LogfileDiag(Errornum);
ErrorOutput(12);
return 1;
}
fs << buff << std::endl;
fs.close();
delete [] Mess;// Удаление массива
return 0;
}