MOD_CONTROL.C #define CORE_PRIVATE //#include

Anuncio
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 */
Descargar