m2.hang-detector/src/libdetect.c
2006-03-17 17:04:59 +00:00

132 lines
3.1 KiB
C

/* vim: set sw=4 ts=4 si et: */
#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);
}
}