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