130 lines
3.1 KiB
C
130 lines
3.1 KiB
C
|
|
#include <pthread.h>
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/socket.h>
|
|
#include <netinet/in.h>
|
|
#include <netdb.h>
|
|
#include <errno.h>
|
|
#include <unistd.h>
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#ifdef _GYR_PRELOAD
|
|
void __attribute__ ((constructor)) detector_init(void);
|
|
#endif
|
|
|
|
typedef struct {
|
|
char * hostname;
|
|
int port;
|
|
} detector_serv_t;
|
|
|
|
void * detector_thread_fun(void * paramvoid){
|
|
detector_serv_t * param = paramvoid;
|
|
|
|
printf("Thread launched\n");
|
|
// se connecter
|
|
int socket_desc = socket(AF_INET, SOCK_STREAM, 0);
|
|
if (socket_desc < 0){
|
|
perror("Creation de la socket impossible");
|
|
fprintf(stderr,"BOUM at %s:%d\n",__FILE__,__LINE__);
|
|
exit(-1);
|
|
}
|
|
|
|
printf("Lookup for %s...\n", param->hostname);
|
|
struct hostent * server = gethostbyname(param->hostname);
|
|
if (server == NULL){
|
|
fprintf(stderr, "Error, no such host\n");
|
|
exit(-1);
|
|
}
|
|
|
|
printf("Host found\n");
|
|
|
|
struct sockaddr_in * myaddr =
|
|
(struct sockaddr_in *) malloc (sizeof(struct sockaddr_in));
|
|
bzero(myaddr, sizeof(struct sockaddr_in));
|
|
myaddr->sin_family = AF_INET;
|
|
myaddr->sin_port = htons(param->port);
|
|
|
|
memcpy (&(myaddr->sin_addr.s_addr), server->h_addr, sizeof(u_long));
|
|
// myaddr->sin_addr.s_addr = server->h_addr[0];
|
|
|
|
/*
|
|
bcopy((char *)(server->h_addr),
|
|
(char *)(myaddr->sin_addr.s_addr),
|
|
server->h_length);
|
|
*/
|
|
|
|
if (connect(socket_desc,
|
|
(struct sockaddr *)myaddr,
|
|
sizeof(struct sockaddr_in)) < 0){
|
|
perror("Attachement de la socket impossible");
|
|
fprintf(stderr,"No connect at %s:%d\n",__FILE__,__LINE__);
|
|
exit(-1);
|
|
}
|
|
printf("Thread connected\n");
|
|
|
|
char hostname[50];
|
|
gethostname(hostname, 50);
|
|
char ident[100];
|
|
sprintf(ident, "%d@%s", getpid(), hostname);
|
|
|
|
char * message = (char *) malloc (sizeof(char) * 1024);
|
|
memset(message, 0, 1024);
|
|
sprintf(message, "register:%s\n", ident);
|
|
|
|
write(socket_desc, message, strlen(message));
|
|
|
|
// indiquer au serveur qu'il faut qu'il vérifie ce prog
|
|
// identifant pid
|
|
while(1){
|
|
// on attend "status?", on répond "alive!"
|
|
int recv_len;
|
|
memset(message, 0, 1024);
|
|
recv_len = recv (socket_desc, message, 1024, 0);
|
|
|
|
if (!strncmp("status?", message, 7)){
|
|
send (socket_desc, "alive!", 6, 0);
|
|
}
|
|
|
|
}
|
|
// se déconnecter ?
|
|
|
|
}
|
|
|
|
void detector_init(){
|
|
// créer un thread "a part" qui répond au serveur
|
|
// et retourner dans le programme principal
|
|
pthread_t thr_detector;
|
|
pthread_attr_t thr_att;
|
|
|
|
pthread_attr_init(&thr_att);
|
|
|
|
detector_serv_t * param = (detector_serv_t *)
|
|
malloc (sizeof(detector_serv_t));
|
|
// FIXME: read environment variable
|
|
param->hostname = getenv("DETECTOR_HOSTNAME");
|
|
if (param->hostname == NULL){
|
|
fprintf(stderr,"Undefined envirnoment variable DETECTOR_HOSTNAME\n");
|
|
}
|
|
|
|
//FIXME: read env variable
|
|
char * portstr = getenv("DETECTOR_PORT");
|
|
if (portstr == NULL){
|
|
fprintf(stderr,"Undefined envirnoment variable DETECTOR_HOSTNAME\n");
|
|
}
|
|
sscanf(portstr, "%d", &(param->port));
|
|
printf("HOST (%s) PORT (%d)\n", param->hostname, param->port);
|
|
|
|
if (pthread_create (&thr_detector,
|
|
&thr_att,
|
|
detector_thread_fun,
|
|
param))
|
|
{
|
|
perror("Impossible de créer le thread\n");
|
|
exit(-1);
|
|
}
|
|
|
|
}
|