MOD_CONTROL.C #define CORE_PRIVATE //#include "apr_network_io.h" #include "httpd.h" #include "http_config.h" #include "http_core.h" #include "http_log.h" #include "http_protocol.h" #include "http_conf_globals.h" #include "http_main.h" #include "util_script.h" #include <time.h> #include "scoreboard.h" #include "http_log.h" #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <stdio.h> #include <unistd.h> #include "util_script.h" #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/wait.h> #include <fcntl.h> #include <sys/param.h> #include <sys/stat.h> #include <stdlib.h> #define MYPORT 3490 /*Numero de puerto donde se conectaran los clientes*/ #define BACKLOG 10 /* Tamaño de la cola de conexiones recibidas */ #define MAXDATASIZE 100 int sockfd; /* El servidor escuchara por sockfd */ int newfd; /* las transferencias de datos se realizar mediante newfd */ pid_t id_padre; pid_t id_hijo; int openServer() { id_padre = getpid(); if((id_hijo=fork()) == 0) { abrir_conexion(); } } void sigchld_handler(int s) { while(wait(NULL) > 0); } int abrir_conexion() { int sockfd, new_fd; // Escuchar sobre sock_fd, nuevas conexiones sobre new_fd struct sockaddr_in my_addr; // información sobre mi dirección struct sockaddr_in their_addr; // información sobre la dirección del cliente int sin_size; struct sigaction sa; int yes=1; char buffer[MAXDATASIZE]={""}; char *cad1,*cad2; int longitud; char * pos1; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) { perror("setsockopt"); exit(1); } my_addr.sin_family = AF_INET; my_addr.sin_port = htons(MYPORT); // Ordenación de bytes de la máquina // short, Ordenación de bytes de la red my_addr.sin_addr.s_addr = INADDR_ANY; // Rellenar con mi dirección IP memset(&(my_addr.sin_zero), '\0', 8); // Poner a cero el resto de la estructura if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) { perror("bind"); exit(1); } if (listen(sockfd, BACKLOG) == -1) { perror("listen"); exit(1); } sa.sa_handler = sigchld_handler; // Eliminar procesos muertos sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; if (sigaction(SIGCHLD, &sa, NULL) == -1) { perror("sigaction"); exit(1); } while(1) { // main accept() loop sin_size = sizeof(struct sockaddr_in); if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr,&sin_size)) == -1) { perror("accept"); continue; } printf("server: got connection from %s\n",inet_ntoa(their_addr.sin_addr)); if (!fork()) { // Este es el proceso hijo close(sockfd); // El hijo no necesita este descriptor if (recv(new_fd,buffer,MAXDATASIZE-1,0) == -1) perror("buffer"); printf("%s",buffer); cad1 = (char *)malloc(20 * sizeof(char)); pos1 = (char *)malloc(20 * sizeof(char)); cad2 = (char *)malloc(20 * sizeof(char)); pos1=strchr(buffer,';'); longitud=pos1-buffer; strncpy(cad1,buffer,longitud); cad1[longitud+1]='\0'; strcpy(cad2,pos1+1); printf("CADENA1: %d \n",atoi(cad1)); printf("CADENA2: %d \n",atoi(cad2)); if(atoi(cad1)!=*ap_daemons_limit) { printf("Cambiado Maxclients\n"); *ap_daemons_limit=atoi(cad1); } if(atoi(cad2)!=ap_get_keep_alive_timeout()) { printf("Cambiado KeepAlive\n"); ap_set_keep_alive_timeout(atoi(cad2)); } if (send(new_fd, "CAMBIADO!!\n", 8, 0) == -1) perror("send"); close(new_fd); exit(0); } close(new_fd); // El proceso padre no lo necesita } return 0; } static handler_rec mola_handlers[]= { {NULL} }; module MODULE_VAR_EXPORT mola_module= { STANDARD_MODULE_STUFF, openServer, /* module initializer */ NULL, /* per-directory config creator */ NULL, /* dir config merger */ NULL, /* server config creator */ NULL, /* server config merger */ NULL, /* command table */ NULL, /* [9] content handlers */ NULL, /* [2] URI-to-filename translation */ NULL, /* [5] check/validate user_id */ NULL, /* [6] check user_id is valid *here* */ NULL, /* [4] check access by host address */ NULL, /* [7] MIME type checker/setter */ NULL, /* [8] fixud */ NULL, /* [10] looger */ NULL, /* [3] header parser */ NULL, NULL, NULL, }; /* process initialization */ /* process exit/cleanup */ /* [1] post read_request handling */