1f08c3bdfSopenharmony_ci#include "locktests.h"
2f08c3bdfSopenharmony_ci
3f08c3bdfSopenharmony_ci#include <netdb.h>
4f08c3bdfSopenharmony_ci#include <string.h>
5f08c3bdfSopenharmony_ci#define PORT 12346
6f08c3bdfSopenharmony_ci#define MAX_CONNECTION 16
7f08c3bdfSopenharmony_ci
8f08c3bdfSopenharmony_ciint maxClients;
9f08c3bdfSopenharmony_ciint *fdClient;
10f08c3bdfSopenharmony_cichar *server_name;
11f08c3bdfSopenharmony_ciint fdServer;
12f08c3bdfSopenharmony_ciextern char message[M_SIZE];
13f08c3bdfSopenharmony_ci
14f08c3bdfSopenharmony_ciint serverReceiveClient(int c)
15f08c3bdfSopenharmony_ci{
16f08c3bdfSopenharmony_ci	char tmp[M_SIZE];
17f08c3bdfSopenharmony_ci	int r, s;
18f08c3bdfSopenharmony_ci	/* Ensure we read _exactly_ M_SIZE characters in the message */
19f08c3bdfSopenharmony_ci	memset(message, 0, M_SIZE);
20f08c3bdfSopenharmony_ci	memset(tmp, 0, M_SIZE);
21f08c3bdfSopenharmony_ci	r = 0;
22f08c3bdfSopenharmony_ci	s = 0;
23f08c3bdfSopenharmony_ci
24f08c3bdfSopenharmony_ci	while (s < M_SIZE) {
25f08c3bdfSopenharmony_ci		r = read(fdClient[c], tmp, M_SIZE - s);
26f08c3bdfSopenharmony_ci		/* Loop until we have a complete message */
27f08c3bdfSopenharmony_ci		strncpy(message + s, tmp, r);
28f08c3bdfSopenharmony_ci		s += r;
29f08c3bdfSopenharmony_ci	}
30f08c3bdfSopenharmony_ci	return s;
31f08c3bdfSopenharmony_ci}
32f08c3bdfSopenharmony_ci
33f08c3bdfSopenharmony_ciint serverSendClient(int n)
34f08c3bdfSopenharmony_ci{
35f08c3bdfSopenharmony_ci	return write(fdClient[n], message, M_SIZE);
36f08c3bdfSopenharmony_ci}
37f08c3bdfSopenharmony_ci
38f08c3bdfSopenharmony_ciint clientReceiveNet(void)
39f08c3bdfSopenharmony_ci{
40f08c3bdfSopenharmony_ci	readFromServer(message);
41f08c3bdfSopenharmony_ci	return 0;
42f08c3bdfSopenharmony_ci}
43f08c3bdfSopenharmony_ci
44f08c3bdfSopenharmony_ciint setupConnectionServer(void)
45f08c3bdfSopenharmony_ci{
46f08c3bdfSopenharmony_ci	struct sockaddr_in local;
47f08c3bdfSopenharmony_ci	int c;
48f08c3bdfSopenharmony_ci	socklen_t size;
49f08c3bdfSopenharmony_ci	int sock;
50f08c3bdfSopenharmony_ci	struct sockaddr_in remote;
51f08c3bdfSopenharmony_ci
52f08c3bdfSopenharmony_ci	if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
53f08c3bdfSopenharmony_ci		perror("socket");
54f08c3bdfSopenharmony_ci		exit(1);
55f08c3bdfSopenharmony_ci	}
56f08c3bdfSopenharmony_ci	memset(&local, 0x00, sizeof(local));
57f08c3bdfSopenharmony_ci	local.sin_family = AF_INET;
58f08c3bdfSopenharmony_ci	local.sin_port = htons(PORT);
59f08c3bdfSopenharmony_ci	local.sin_addr.s_addr = INADDR_ANY;
60f08c3bdfSopenharmony_ci	memset(&(local.sin_zero), 0x00, 8);
61f08c3bdfSopenharmony_ci
62f08c3bdfSopenharmony_ci	if (bind(sock, (struct sockaddr *)&local, sizeof(struct sockaddr)) ==
63f08c3bdfSopenharmony_ci	    -1) {
64f08c3bdfSopenharmony_ci		perror("bind");
65f08c3bdfSopenharmony_ci		exit(1);
66f08c3bdfSopenharmony_ci	}
67f08c3bdfSopenharmony_ci
68f08c3bdfSopenharmony_ci	if (listen(sock, MAX_CONNECTION) == -1) {
69f08c3bdfSopenharmony_ci		perror("listen");
70f08c3bdfSopenharmony_ci		return 1;
71f08c3bdfSopenharmony_ci	}
72f08c3bdfSopenharmony_ci	size = sizeof(struct sockaddr_in);
73f08c3bdfSopenharmony_ci	for (c = 0; c < maxClients; c++) {
74f08c3bdfSopenharmony_ci		if ((fdClient[c] =
75f08c3bdfSopenharmony_ci		     accept(sock, (struct sockaddr *)&remote, &size)) == -1) {
76f08c3bdfSopenharmony_ci			perror("accept");
77f08c3bdfSopenharmony_ci			return 1;
78f08c3bdfSopenharmony_ci		}
79f08c3bdfSopenharmony_ci
80f08c3bdfSopenharmony_ci	}
81f08c3bdfSopenharmony_ci	return 0;
82f08c3bdfSopenharmony_ci}
83f08c3bdfSopenharmony_ci
84f08c3bdfSopenharmony_ciint writeToClient(int c, char *message)
85f08c3bdfSopenharmony_ci{
86f08c3bdfSopenharmony_ci	return write(fdClient[c], message, 512);
87f08c3bdfSopenharmony_ci}
88f08c3bdfSopenharmony_ci
89f08c3bdfSopenharmony_ciint serverCloseConnection(void)
90f08c3bdfSopenharmony_ci{
91f08c3bdfSopenharmony_ci	int c;
92f08c3bdfSopenharmony_ci	for (c = 0; c < maxClients; c++)
93f08c3bdfSopenharmony_ci		close(fdClient[c]);
94f08c3bdfSopenharmony_ci	return 0;
95f08c3bdfSopenharmony_ci
96f08c3bdfSopenharmony_ci}
97f08c3bdfSopenharmony_ci
98f08c3bdfSopenharmony_ciint writeToAllClients(char *foo)
99f08c3bdfSopenharmony_ci{
100f08c3bdfSopenharmony_ci	int c;
101f08c3bdfSopenharmony_ci	for (c = 0; c < maxClients; c++)
102f08c3bdfSopenharmony_ci		writeToClient(c, foo);
103f08c3bdfSopenharmony_ci	return 0;
104f08c3bdfSopenharmony_ci}
105f08c3bdfSopenharmony_ci
106f08c3bdfSopenharmony_ciint setupClients(int type, char *fname, int nThread)
107f08c3bdfSopenharmony_ci{
108f08c3bdfSopenharmony_ci	/*
109f08c3bdfSopenharmony_ci	 * Send parameters to all slaves :
110f08c3bdfSopenharmony_ci	 *
111f08c3bdfSopenharmony_ci	 * We must send :
112f08c3bdfSopenharmony_ci	 * - the position of the test file
113f08c3bdfSopenharmony_ci	 * - the number of slaves for each client
114f08c3bdfSopenharmony_ci	 * - The kind of slaves : process or thread
115f08c3bdfSopenharmony_ci	 */
116f08c3bdfSopenharmony_ci	char message[512];
117f08c3bdfSopenharmony_ci	sprintf(message, "%d:%s:%d::", type, fname, nThread);
118f08c3bdfSopenharmony_ci	writeToAllClients(message);
119f08c3bdfSopenharmony_ci	return 0;
120f08c3bdfSopenharmony_ci}
121f08c3bdfSopenharmony_ci
122f08c3bdfSopenharmony_ciint configureServer(int max)
123f08c3bdfSopenharmony_ci{
124f08c3bdfSopenharmony_ci	maxClients = max;
125f08c3bdfSopenharmony_ci	fdClient = malloc(sizeof(int) * max);
126f08c3bdfSopenharmony_ci
127f08c3bdfSopenharmony_ci	setupConnectionServer();
128f08c3bdfSopenharmony_ci
129f08c3bdfSopenharmony_ci	return 0;
130f08c3bdfSopenharmony_ci}
131f08c3bdfSopenharmony_ci
132f08c3bdfSopenharmony_ciint setupConnectionClient(void)
133f08c3bdfSopenharmony_ci{
134f08c3bdfSopenharmony_ci
135f08c3bdfSopenharmony_ci	struct hostent *server;
136f08c3bdfSopenharmony_ci	struct sockaddr_in serv_addr;
137f08c3bdfSopenharmony_ci
138f08c3bdfSopenharmony_ci	if (!(server = gethostbyname(server_name))) {
139f08c3bdfSopenharmony_ci		printf("erreur DNS\n");
140f08c3bdfSopenharmony_ci		return 1;
141f08c3bdfSopenharmony_ci	}
142f08c3bdfSopenharmony_ci
143f08c3bdfSopenharmony_ci	fdServer = socket(AF_INET, SOCK_STREAM, 0);
144f08c3bdfSopenharmony_ci	if (fdServer < 0) {
145f08c3bdfSopenharmony_ci		perror("socket");
146f08c3bdfSopenharmony_ci		return 1;
147f08c3bdfSopenharmony_ci	}
148f08c3bdfSopenharmony_ci
149f08c3bdfSopenharmony_ci	serv_addr.sin_addr = *(struct in_addr *)server->h_addr;
150f08c3bdfSopenharmony_ci	serv_addr.sin_port = htons(PORT);
151f08c3bdfSopenharmony_ci	serv_addr.sin_family = AF_INET;
152f08c3bdfSopenharmony_ci	if (connect(fdServer, (struct sockaddr *)&serv_addr, sizeof(serv_addr))
153f08c3bdfSopenharmony_ci	    < 0) {
154f08c3bdfSopenharmony_ci		perror("connect");
155f08c3bdfSopenharmony_ci		return 1;
156f08c3bdfSopenharmony_ci	}
157f08c3bdfSopenharmony_ci	return 0;
158f08c3bdfSopenharmony_ci}
159f08c3bdfSopenharmony_ci
160f08c3bdfSopenharmony_ciint readFromServer(char *message)
161f08c3bdfSopenharmony_ci{
162f08c3bdfSopenharmony_ci	char tmp[M_SIZE];
163f08c3bdfSopenharmony_ci	int r, s;
164f08c3bdfSopenharmony_ci	/* Ensure we read exactly M_SIZE characters */
165f08c3bdfSopenharmony_ci	memset(message, 0, M_SIZE);
166f08c3bdfSopenharmony_ci	memset(tmp, 0, M_SIZE);
167f08c3bdfSopenharmony_ci	r = 0;
168f08c3bdfSopenharmony_ci	s = 0;
169f08c3bdfSopenharmony_ci	while (s < M_SIZE) {
170f08c3bdfSopenharmony_ci		r = read(fdServer, tmp, M_SIZE - s);
171f08c3bdfSopenharmony_ci		/* Loop until we have a complete message */
172f08c3bdfSopenharmony_ci		strncpy(message + s, tmp, r);
173f08c3bdfSopenharmony_ci		s += r;
174f08c3bdfSopenharmony_ci	}
175f08c3bdfSopenharmony_ci	return s;
176f08c3bdfSopenharmony_ci}
177f08c3bdfSopenharmony_ci
178f08c3bdfSopenharmony_ciint getConfiguration(int *type, char *fname, int *nThread)
179f08c3bdfSopenharmony_ci{
180f08c3bdfSopenharmony_ci	char conf[M_SIZE];
181f08c3bdfSopenharmony_ci	char *p;
182f08c3bdfSopenharmony_ci	int i;
183f08c3bdfSopenharmony_ci	readFromServer(conf);
184f08c3bdfSopenharmony_ci	p = strtok(conf, ":");
185f08c3bdfSopenharmony_ci	printf("%s\n", p);
186f08c3bdfSopenharmony_ci	*type = atoi(p);
187f08c3bdfSopenharmony_ci	p = strtok(NULL, ":");
188f08c3bdfSopenharmony_ci	i = strlen(p);
189f08c3bdfSopenharmony_ci	strncpy(fname, p, i);
190f08c3bdfSopenharmony_ci	p = strtok(NULL, ":");
191f08c3bdfSopenharmony_ci	*nThread = atoi(p);
192f08c3bdfSopenharmony_ci
193f08c3bdfSopenharmony_ci	return 0;
194f08c3bdfSopenharmony_ci}
195f08c3bdfSopenharmony_ci
196f08c3bdfSopenharmony_ciint configureClient(char *s)
197f08c3bdfSopenharmony_ci{
198f08c3bdfSopenharmony_ci	server_name = s;
199f08c3bdfSopenharmony_ci	setupConnectionClient();
200f08c3bdfSopenharmony_ci	return 0;
201f08c3bdfSopenharmony_ci}
202