Ext
 All Files Functions
handlers.c
1 
3 #include "handlers.h"
4 #include "net_utils.h"
5 #include <stdlib.h>
6 #include <unistd.h>
7 #include <fcntl.h>
8 #include <sys/socket.h>
9 #include <string.h>
10 #include <stdio.h>
11 
12 bool receive_result(int sockd, int output_fd) {
13  size_t size = 0;
14  char* data = NULL;
15  if (!receive_data(sockd, &data, &size)) {
16  if (data != NULL) {
17  free(data);
18  }
19 
20  return false;
21  }
22 
23  if (data == NULL) {
24  return false;
25  }
26 
27  if (write_while(output_fd, data, size) == -1) {
28  free(data);
29  return false;
30  }
31 
32  free(data);
33  return true;
34 }
35 
36 bool receive_read_result(int sockd, char** readed_data, size_t* readed) {
37  size_t size = 0;
38  char* data = NULL;
39  if (!receive_data(sockd, &data, &size)) {
40  if (data != NULL) {
41  free(data);
42  }
43 
44  return false;
45  }
46 
47  char* data_position = NULL;
48  *readed = strtol(data, &data_position, 10);
49  data_position += 1;
50  *readed_data = calloc(*readed + 1, sizeof(char));
51  (*readed_data)[*readed] = '\0';
52  memcpy(*readed_data, data_position, *readed);
53 
54  free(data);
55  return true;
56 }
57 
58 bool send_help_command(int sockd) {
59  if (!send_command(sockd, Help)) {
60  return false;
61  }
62  return receive_result(sockd, STDOUT_FILENO);
63 }
64 
65 bool send_quit_command(int sockd) {
66  return send_command(sockd, Quit);
67 }
68 
69 bool send_init_command(int sockd) {
70  return send_command(sockd, Init);
71 }
72 
73 bool send_read_fs_command(int sockd) {
74  return send_command(sockd, ReadFs);
75 }
76 
77 bool send_ls_command(int sockd, const char* path) {
78  if (!send_command(sockd, Ls)) {
79  return false;
80  }
81  if (!send_data(sockd, path, strlen(path))) {
82  return false;
83  }
84  return receive_result(sockd, STDOUT_FILENO);
85 }
86 
87 bool send_mkdir_command(int sockd, const char* path) {
88  if (!send_command(sockd, Mkdir)) {
89  return false;
90  }
91 
92  if (!send_data(sockd, path, strlen(path))) {
93  return false;
94  }
95 
96  return receive_result(sockd, STDOUT_FILENO);
97 }
98 
99 bool send_touch_command(int sockd, const char* path) {
100  if (!send_command(sockd, Touch)) {
101  return false;
102  }
103 
104  if (!send_data(sockd, path, strlen(path))) {
105  return false;
106  }
107 
108  return receive_result(sockd, STDOUT_FILENO);
109 }
110 
111 bool send_open_command(int sockd, const char* path) {
112  if (!send_command(sockd, Open)) {
113  return false;
114  }
115 
116  if (!send_data(sockd, path, strlen(path))) {
117  return false;
118  }
119 
120  return receive_result(sockd, STDOUT_FILENO);
121 }
122 
123 bool send_close_command(int sockd, int fd) {
124  if (!send_command(sockd, Close)) {
125  return false;
126  }
127 
128  char string_buffer[1024];
129  size_t string_size = sprintf(string_buffer, "\t%d", fd);
130 
131  if (!send_data(sockd, string_buffer, strlen(string_buffer))) {
132  return false;
133  }
134 
135  return receive_result(sockd, STDOUT_FILENO);
136 }
137 
138 bool send_lseek_command(int sockd, int opened_fd, int size) {
139  if (!send_command(sockd, Lseek)) {
140  return false;
141  }
142 
143  char string_buffer[1024];
144  size_t string_size = sprintf(string_buffer, "\t%d\t%d", opened_fd, size);
145 
146  if (!send_data(sockd, string_buffer, strlen(string_buffer))) {
147  return false;
148  }
149 
150  return receive_result(sockd, STDOUT_FILENO);
151 }
152 
153 bool send_write_command(int sockd, int fd, char* data, size_t size) {
154  if (!send_command(sockd, Write)) {
155  return false;
156  }
157 
158  char string_buffer[size + 128];
159  size_t string_size = sprintf(string_buffer, "\t%d\t%zu\t%s", fd, size, data);
160  if (!send_data(sockd, string_buffer, strlen(string_buffer))) {
161  return false;
162  }
163 
164  return receive_result(sockd, STDOUT_FILENO);
165 }
166 
167 bool send_read_command(int sockd, int fd, size_t size) {
168  if (!send_command(sockd, Read)) {
169  return false;
170  }
171 
172  char string_buffer[1024];
173  size_t string_size = sprintf(string_buffer, "\t%d\t%zu", fd, size);
174 
175  if (!send_data(sockd, string_buffer, strlen(string_buffer))) {
176  return false;
177  }
178 
179  char* data = NULL;
180  size_t readed = 0;
181 
182  bool result = receive_read_result(sockd, &data, &readed);
183 
184  if (result == false) {
185  return false;
186  }
187 
188  printf("Total read:%zu\n%s\n", readed, data);
189 
190  free(data);
191  return result;
192 }
193 
194 bool send_write_from_command(int sockd, int fd, const char* path) {
195  ssize_t size = get_file_size(path);
196  if (size == -1) {
197  return false;
198  }
199 
200  int descriptor = open(path, O_RDONLY);
201  if (descriptor == -1) {
202  fprintf(stderr, "Can't read file with data. Abort!\n");
203  return false;
204  }
205 
206  char* buffer = (char*) calloc(size, sizeof(char));
207  size = read_while(descriptor, buffer, size);
208 
209  close(descriptor);
210 
211  if (size == -1) {
212  fprintf(stderr, "Can't read file with data. Abort!\n");
213  return false;
214  }
215 
216  return send_write_command(sockd, fd, buffer, size);
217 }
218 
219 bool send_read_to_command(int sockd, int fd, const char* path, size_t size) {
220  if (!send_command(sockd, Read)) {
221  return false;
222  }
223 
224  char string_buffer[1024];
225  size_t string_size = sprintf(string_buffer, "\t%d\t%zu", fd, size);
226 
227  if (!send_data(sockd, string_buffer, strlen(string_buffer))) {
228  return false;
229  }
230 
231  char* data = NULL;
232  size_t readed = 0;
233 
234  bool result = receive_read_result(sockd, &data, &readed);
235 
236  if (result == false) {
237  return false;
238  }
239 
240  int fd_to_write = open(path, O_RDWR | O_CREAT);
241  if (fd_to_write == -1) {
242  fprintf(stderr, "Can't open file to write. Abort!\n");
243  return false;
244  }
245 
246  if (write_while(fd_to_write, data, readed) == -1) {
247  fprintf(stderr, "Can't write to file to write. Abort!\n");
248  free(data);
249  return false;
250  }
251 
252  free(data);
253 
254  return true;
255 }
Contains handlers for commands from server.
bool send_close_command(int sockd, int fd)
Definition: handlers.c:123
bool send_mkdir_command(int sockd, const char *path)
Definition: handlers.c:87
bool send_read_command(int sockd, int fd, size_t size)
Definition: handlers.c:167
bool send_lseek_command(int sockd, int fd, int size)
Definition: handlers.c:138
bool send_command(int sockd, enum Command command)
Definition: net_utils.c:64
int read_while(int fd, char *buffer, size_t to_read)
Properly reading from memory.
Definition: utils.c:23
bool send_quit_command(int sockd)
Definition: handlers.c:65
bool send_read_fs_command(int sockd)
Definition: handlers.c:73
bool send_open_command(int sockd, const char *path)
Definition: handlers.c:111
int write_while(int fd, const char *buffer, size_t to_write)
Properly writing to memory.
Definition: utils.c:38
bool send_data(int sockd, char *data, size_t size)
Definition: net_utils.c:75
bool send_write_command(int sockd, int fd, char *data, size_t size)
Definition: handlers.c:153
bool send_write_from_command(int sockd, int fd, const char *path)
Definition: handlers.c:194
ssize_t get_file_size(const char *path_to_file)
Get size of file.
Definition: utils.c:145
bool receive_result(int sockd, int output_fd)
Definition: handlers.c:12
bool receive_data(int sockd, char **data, size_t *size)
Definition: net_utils.c:94
bool send_init_command(int sockd)
Definition: handlers.c:69
bool send_ls_command(int sockd, const char *path)
Definition: handlers.c:77
bool send_help_command(int sockd)
Definition: handlers.c:58
bool send_read_to_command(int sockd, int fd, const char *path, size_t size)
Definition: handlers.c:219
bool send_touch_command(int sockd, const char *path)
Definition: handlers.c:99