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