-
Notifications
You must be signed in to change notification settings - Fork 0
/
client.c
76 lines (57 loc) · 1.84 KB
/
client.c
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
/**
* @file client.c
* @brief Implementation of client.h
*
*/
#include <stdlib.h>
#include <stddef.h>
#include "client.h"
#include "config.h" // for PPS_DEFAULT_IP and PPS_DEFAULT_PORT
#include "system.h"
#include "util.h"
#include "args.h"
#include "node_list.h"
#include "ring.h"
error_code client_init(client_init_args_t init_args) {
client_t *client = init_args.client;
M_REQUIRE_NON_NULL(client);
M_REQUIRE_NON_NULL(init_args.argv);
M_REQUIRE_NON_NULL(*init_args.argv);
error_code error = ERR_NONE;
char *name = **init_args.argv;
// increment the pointer to next argument (first argument is the name)
++(*init_args.argv);
init_args.argc -= 1;
M_EXIT_IF(init_args.nb_args != SIZE_MAX && init_args.nb_args > init_args.argc, ERR_BAD_PARAMETER, "argc too short",
"%s", "not enough arguments");
char **index_before = *init_args.argv;
args_t *args = parse_opt_args(init_args.supported_args, init_args.argv);
M_REQUIRE_NON_NULL(args);
ptrdiff_t diff = *(init_args.argv) - index_before;
init_args.argc -= diff;
if (init_args.nb_args != SIZE_MAX && init_args.nb_args != init_args.argc) {
error = ERR_BAD_PARAMETER;
free(args);
}
M_EXIT_IF_ERR(error, "not enough arguments");
// Create the nodes from the file
ring_t *server = ring_alloc();
error = ring_init(server);
if (error != ERR_NONE) {
free(args);
}
M_EXIT_IF_ERR(error, "problem while initializing the nodes");
if (init_args.supported_args & TOTAL_SERVERS && args->N > server->size) {
free(args);
ring_free(server);
return ERR_BAD_PARAMETER;
}
client->args = args;
client->server = server;
client->name = name;
return ERR_NONE;
}
void client_end(client_t *client) {
ring_free(client->server);
free(client->args);
}