source: admin/Sources/Includes/ogAdmLib.c @ acf04d3

918-git-images-111dconfigfileconfigure-oglivegit-imageslgromero-new-oglivemainmaint-cronmount-efivarfsmultivmmultivm-ogboot-installerogClonningEngineogboot-installer-jenkinsoglive-ipv6test-python-scriptsticket-301ticket-50ticket-50-oldticket-577ticket-585ticket-611ticket-612ticket-693ticket-700ubu24tplunification2use-local-agent-oglivevarios-instalacionwebconsole3
Last change on this file since acf04d3 was d1c5ae0, checked in by ramon <ramongomez@…>, 13 years ago

Versión 1.0.4, #513: Se revierten los cambios y se deja el ticket como opcional fuera de la rama principal.

git-svn-id: https://opengnsys.es/svn/branches/version1.0@3118 a21b9725-9963-47de-94b9-378ad31fedc9

  • Property mode set to 100644
File size: 35.7 KB
Line 
1// **************************************************************************************************************************************************
2// Libreria: ogAdmLib
3// Autor: José Manuel Alonso (E.T.S.I.I.) Universidad de Sevilla
4// Fecha Creación: Marzo-2010
5// Fecha Última modificación: Marzo-2010
6// Nombre del fichero: ogAdmLib.c
7// Descripción: Este fichero implementa una libreria de funciones para uso común de los servicios
8// **************************************************************************************************************************************************
9// ________________________________________________________________________________________________________
10// Función: encriptar
11//
12//      Descripción:
13//              Encripta una cadena
14//      Parametros:
15//              - cadena : Cadena a encriptar
16//              - ret : Longitud de la caden cadena encriptada
17// ________________________________________________________________________________________________________
18char * encriptar(char *cadena,int*ret)
19{
20        /*
21        int i,lon;
22        char clave;
23       
24        clave = 12 & 0xFFU; // La clave elegida entre 0-255, en este caso 12
25        lon=strlen(cadena);
26        for(i=0;i<lon;i++)
27      cadena[i]=((char)cadena[i] ^ clave) & 0xFF;
28        *ret=lon;
29        */
30        return(cadena);
31}
32// ________________________________________________________________________________________________________
33// Función: desencriptar
34//
35//      Descripción:
36//              Desencripta una cadena
37//      Parametros:
38//              - cadena : Cadena a desencriptar
39//              - ret : Longitud de la caden cadena encriptada
40// ________________________________________________________________________________________________________
41char * desencriptar(char *cadena,int* ret)
42{
43        /*
44        int i,lon;
45        char clave;
46       
47        clave = 12 & 0xFFU; // La clave elegida entre 0-255, en este caso 12
48        lon=strlen(cadena);
49        for(i=0;i<lon;i++)
50                cadena[i]=((char)cadena[i] ^ clave) & 0xFF;
51        *ret=lon;
52        */
53        return(cadena);
54
55}
56// ________________________________________________________________________________________________________
57// Función: tomaHora
58//
59//      Descripción:
60//              Devuelve la hora del sistema
61//      Parametros:
62//              Ninguno
63// ________________________________________________________________________________________________________
64struct tm * tomaHora()
65{
66        time_t rawtime;
67        time ( &rawtime );
68        return(localtime(&rawtime));
69}
70// ________________________________________________________________________________________________________
71// Función: registraLog
72//
73//      Descripción:
74//              Registra los eventos en un fichero log ya sean errores o información
75//      Parametros:
76//              - fileLog : Ruta completa del archivo de log
77//              - msg : Descripción del error
78//              - swe: Switch que indica si se debe recuperar además el literal de error del propio sistema operativo
79// ________________________________________________________________________________________________________
80void registraLog(const char* filelog,const char *msg,int swe)
81{
82        FILE *flog;
83        struct tm * t;
84
85        t = tomaHora();
86        flog=fopen(filelog,"at");
87        if(swe)
88                fprintf (flog,"%02d/%02d/%d %02d:%02d %s: %s\n",t->tm_mday,t->tm_mon+1,t->tm_year+1900,t->tm_hour,t->tm_min,msg,strerror(errno));
89        else
90                fprintf (flog,"%02d/%02d/%d %02d:%02d %s\n",t->tm_mday,t->tm_mon+1,t->tm_year+1900,t->tm_hour,t->tm_min,msg);
91        fclose(flog);
92}
93// ________________________________________________________________________________________________________
94// Función: errorLog
95//
96//      Descripción:
97//              Registra los sucesos de errores preestablecidos en el fichero de log
98//      Parametros:
99//              - coderr : Código del mensaje de error
100//              - swe: Switch que indica si se debe recuperar además el literal de error del propio sistema operativo
101// ________________________________________________________________________________________________________
102void errorLog(const char *modulo, int coderr, int swe) {
103        char msglog[LONSUC];
104
105        sprintf(msglog, "*** Error: %s. Módulo %s", tbErrores[coderr], modulo);
106        registraLog(szPathFileLog, msglog, swe);
107}
108// ________________________________________________________________________________________________________
109// Función: errorInfo
110//
111//      Descripción:
112//              Registra los sucesos de errores dinámicos en el fichero de log
113//      Parametros:
114//              - msgerr : Descripción del error
115//              - swe: Switch que indica si se debe recuperar además el literal de error del propio sistema operativo
116// ________________________________________________________________________________________________________
117void errorInfo(const char *modulo, char *msgerr) {
118        char msglog[LONSUC];
119
120        sprintf(msglog, "*** Error: %s. Módulo %s", msgerr, modulo);
121        registraLog(szPathFileLog, msglog, FALSE);
122}
123// ________________________________________________________________________________________________________
124// Función: infoLog
125//
126//      Descripción:
127//              Registra los sucesos de información en el fichero de log
128//      Parametros:
129//              - coderr : Código del mensaje de información
130// ________________________________________________________________________________________________________
131void infoLog(int codinf) {
132        char msglog[LONSUC];
133
134        sprintf(msglog, "*** Info: %s", tbMensajes[codinf]);
135        registraLog(szPathFileLog, msglog, FALSE);
136}
137// ________________________________________________________________________________________________________
138// Función: infoDebug
139//
140//      Descripción:
141//              Registra los mensajes de debugs en el fichero de log
142//      Parametros:
143//              - msgdeb : Descripción del mensaje de información
144// ________________________________________________________________________________________________________
145void infoDebug(char* msgdeb) {
146        char msglog[LONSUC];
147
148        sprintf(msglog, "*** Debug: %d-%s", ndebug, msgdeb);
149        registraLog(szPathFileLog, msglog, FALSE);
150}
151//______________________________________________________________________________________________________
152// Función: ValidacionParametros
153//
154//       Descripción:
155//              Valida que los parametros de ejecución del programa sean correctos
156//      Parámetros:
157//              - argc: Número de argumentos
158//              - argv: Puntero a cada argumento
159//              - eje:  Tipo de ejecutable (1=Servicio,2=Repositorio o 3=Cliente)
160//      Devuelve:
161//              - TRUE si los argumentos pasados son correctos
162//              - FALSE en caso contrario
163//      Especificaciones:
164//              La sintaxis de los argumentos es la siguiente
165//                      -f      Archivo de configuración del servicio
166//                      -l      Archivo de logs
167//                      -d      Nivel de debuger (mensages que se escribirán en el archivo de logs)
168//      Devuelve:
169//              TRUE: Si el proceso es correcto
170//              FALSE: En caso de ocurrir algún error
171//______________________________________________________________________________________________________
172BOOLEAN validacionParametros(int argc, char*argv[],int eje) {
173        int i;
174        char modulo[] = "validacionParametros()";
175
176        switch(eje){
177                case 1: // Administrador
178                        strcpy(szPathFileCfg, "ogAdmServer.cfg"); // Valores por defecto de archivos
179                        strcpy(szPathFileLog, "ogAdmServer.log"); // de configuración y de logs
180                        break;
181                case 2: // Repositorio
182                        strcpy(szPathFileCfg, "ogAdmRepo.cfg"); // Valores por defecto de archivos
183                        strcpy(szPathFileLog, "ogAdmRepo.log"); // de configuración y de logs
184                        break;
185                case 3: // Cliente OpenGnsys
186                        strcpy(szPathFileCfg, "ogAdmClient.cfg"); // Valores por defecto de archivos
187                        strcpy(szPathFileLog, "ogAdmClient.log"); // de configuración y de logs
188                        break;
189                case 4: // Servicios DHCP,BOOTP Y TFTP
190                        strcpy(szPathFileCfg, "ogAdmBoot.cfg"); // Valores por defecto de archivos
191                        strcpy(szPathFileLog, "ogAdmBoot.log"); // de configuración y de logs
192                        break;
193                case 5: // Agente
194                        strcpy(szPathFileCfg, "ogAdmAgent.cfg"); // Valores por defecto de archivos
195                        strcpy(szPathFileLog, "ogAdmAgent.log"); // de configuración y de logs
196                        break;
197                case 6: // Agente
198                        strcpy(szPathFileCfg, "ogAdmWinClient.cfg"); // Valores por defecto de archivos
199                        strcpy(szPathFileLog, "ogAdmWinClient.log"); // de configuración y de logs
200                        break;                 
201        }
202
203        ndebug = 1; // Nivel de debuger por defecto
204
205        for (i = 1; (i + 1) < argc; i += 2) {
206                if (argv[i][0] == '-') {
207                        switch (tolower(argv[i][1])) {
208                        case 'f':
209                                if (argv[i + 1] != NULL)
210                                        strcpy(szPathFileCfg, argv[i + 1]);
211                                else {
212                                        errorLog(modulo, 10, FALSE);
213                                        return (FALSE);
214                                }
215                                break;
216                        case 'l':
217                                if (argv[i + 1] != NULL)
218                                        strcpy(szPathFileLog, argv[i + 1]);
219                                else {
220                                        errorLog(modulo, 11, FALSE);
221                                        return (FALSE);
222                                }
223                                break;
224                        case 'd':
225                                if (argv[i + 1] != NULL) {
226                                        ndebug = atoi(argv[i + 1]);
227                                        if (ndebug < 1)
228                                                ndebug = 1; // Por defecto el nivel de debug es 1
229                                } else
230                                        ndebug = 1; // Por defecto el nivel de debug es 1
231                                break;
232                        default:
233                                errorLog(modulo, 12, FALSE);
234                                exit(EXIT_FAILURE);
235                                break;
236                        }
237                }
238        }
239        return (TRUE);
240}
241//______________________________________________________________________________________________________
242// Función: reservaMemoria
243//
244//      Descripción:
245//              Reserva memoria para una variable
246//      Parámetros:
247//              - lon:  Longitud en bytes de la reserva
248//      Devuelve:
249//              Un puntero a la zona de memoria reservada que ha sido previamente rellena con zeros o nulos
250//______________________________________________________________________________________________________
251char* reservaMemoria(int lon)
252{
253        char *mem;
254
255        mem=(char*)malloc(lon);
256        if(mem!=NULL)
257                memset(mem,0,lon);
258        return(mem);
259}
260//______________________________________________________________________________________________________
261// Función: ampliaMemoria
262//
263//      Descripción:
264//              Amplia memoria para una variable
265//      Parámetros:
266//              - ptr:  Puntero al buffer de memoria que se quiere ampliar
267//              - lon:  Longitud en bytes de la amplicación
268//      Devuelve:
269//              Un puntero a la zona de memoria reservada que ha sido previamente rellena con zeros o nulos
270//______________________________________________________________________________________________________
271char* ampliaMemoria(char* ptr,int lon)
272{
273        char *mem;
274
275        mem=(char*)realloc(ptr,lon*sizeof(char*));
276        if(mem!=NULL)
277                return(mem);
278        return(NULL);
279}
280//______________________________________________________________________________________________________
281// Función: liberaMemoria
282//
283//      Descripción:
284//              Libera memoria para una variable
285//      Parámetros:
286//              - ptr:  Puntero al buffer de memoria que se quiere liberar
287//      Devuelve:
288//              Nada
289//______________________________________________________________________________________________________
290void liberaMemoria(char* ptr)
291{
292        if(ptr)
293                free (ptr);
294}
295// ________________________________________________________________________________________________________
296// Función: splitCadena
297//
298//      Descripción:
299//                      Trocea una cadena según un carácter delimitador
300//      Parámetros:
301//                      - trozos: Array de punteros a cadenas
302//                      - cadena: Cadena a trocear
303//                      - chd: Carácter delimitador
304//      Devuelve:
305//              Número de trozos en que se divide la cadena
306// ________________________________________________________________________________________________________
307int splitCadena(char **trozos,char *cadena, char chd)
308{
309        int w=0;
310        if(cadena==NULL) return(w);
311
312        trozos[w++]=cadena;
313        while(*cadena!='\0'){
314                if(*cadena==chd){
315                        *cadena='\0';
316                        if(*(cadena+1)!='\0')
317                                trozos[w++]=cadena+1;
318                }
319                cadena++;
320        }
321        return(w); // Devuelve el número de trozos
322}
323// ________________________________________________________________________________________________________
324// Función: sustituir
325//
326//      Descripción:
327//                      Sustituye las apariciones de un caracter por otro en una cadena
328//      Parámetros:
329//                      - cadena: Cadena a convertir
330//                      - cho: Caracter a sustituir
331//                      - chs: Caracter sustituto
332// ________________________________________________________________________________________________________
333void sustituir(char *cadena,char cho,char chs)
334{
335        int x=0;
336
337        while(cadena[x]!=0) {
338                if (cadena[x]==cho)
339                        cadena[x]=chs;
340                x++;
341        }
342}
343// ________________________________________________________________________________________________________
344// Función: escaparCadena
345//
346//      Descripción:
347//                      Sustituye las apariciones de un caracter comila simple ' por \'
348//      Parámetros:
349//                      - cadena: Cadena a escapar
350// Devuelve:
351//              La cadena con las comillas simples sustituidas por \'
352// ________________________________________________________________________________________________________
353char* escaparCadena(char *cadena)
354{
355        int b,c;
356        char *buffer;
357
358        buffer = (char*) reservaMemoria(strlen(cadena)*2); // Toma memoria para el buffer de conversión
359        if (buffer == NULL) { // No hay memoria suficiente para el buffer
360                return (FALSE);
361        }
362
363        c=b=0;
364        while(cadena[c]!=0) {
365                if (cadena[c]=='\''){
366                        buffer[b++]='\\';
367                        buffer[b++]='\'';
368                }
369                else{
370                        buffer[b++]=cadena[c];
371                }
372                c++;
373        }
374        return(buffer);
375}
376// ________________________________________________________________________________________________________
377// Función: StrToUpper
378//
379//      Descripción:
380//                      Convierta una cadena en mayúsculas
381//      Parámetros:
382//                      - cadena: Cadena a convertir
383// ________________________________________________________________________________________________________
384char* StrToUpper(char *cadena)
385{
386        int x=0;
387
388        while(cadena[x]!=0) {
389                if (cadena[x] >= 'a' && cadena[x] <= 'z') {
390                        cadena[x] -= 32;
391                }
392                x++;
393        }
394        return(cadena);
395}
396// ________________________________________________________________________________________________________
397// Función: StrToUpper
398//
399//      Descripción:
400//                      Convierta una cadena en mayúsculas
401//      Parámetros:
402//                      - cadena: Cadena a convertir
403// ________________________________________________________________________________________________________
404char* StrToLower(char *cadena)
405{
406        int x=0;
407
408        while(cadena[x]!=0) {
409                if (cadena[x] >= 'A' && cadena[x] <= 'Z') {
410                        cadena[x] += 32;
411                }
412                x++;
413        }
414        return(cadena);
415}
416// ________________________________________________________________________________________________________
417// Función: INTROaFINCAD
418//
419//              Descripción:
420//                      Cambia caracteres INTROS por fin de cadena ('\0')  en una trama
421//              Parametros:
422//                      - parametros: Puntero a los parametros de la trama
423//                      - lon: Longitud de la cadena de parametros
424// ________________________________________________________________________________________________________
425void INTROaFINCAD(TRAMA* ptrTrama)
426{
427        char *i,*a,*b;
428
429        a=ptrTrama->parametros;
430        b=a+ptrTrama->lonprm;
431        for(i=a;i<b;i++){ // Cambia los NULOS por INTROS
432                if(*i=='\r') *i='\0';
433        }
434}
435// ________________________________________________________________________________________________________
436// Función: FINCADaINTRO
437//
438//              Descripción:
439//                      Cambia caracteres fin de cadena ('\0') por INTROS en una trama
440//              Parametros:
441//                      - parametros: Puntero a los parametros de la trama
442//                      - lon: Longitud de la cadena de parametros
443// ________________________________________________________________________________________________________
444void FINCADaINTRO(TRAMA* ptrTrama)
445{
446        char *i,*a,*b;
447
448        a=ptrTrama->parametros;
449        b=a+ptrTrama->lonprm;
450        for(i=a;i<b;i++){ // Cambia los NULOS por INTROS
451                if(*i=='\0') *i='\r';
452        }
453}
454// ________________________________________________________________________________________________________
455// Función: cuentaIPES
456//
457//              Descripción:
458//                      Cuenta los caracteres "." de las IPES dentro del parámetros iph de una trama
459//                      con lo cual dividiendo por 3 se puede saber la cantdad de direcciones IPES en la cadena
460//              Parametros:
461//                      - ipes: Cadena con las IPES separadas por ";"
462// ________________________________________________________________________________________________________
463int cuentaIPES(char* ipes)
464{
465        int i,a,b,c=0;
466
467        a=0;
468        b=strlen(ipes);
469        for(i=a;i<b;i++){ // Cambia los NULOS por INTROS
470                if(ipes[i]=='.') c++;
471        }
472        return(c/3);
473}
474// ________________________________________________________________________________________________________
475// Función: tomaParametro
476//
477//              Descripción:
478//                      Devuelve el valor de un parametro incluido en una cadena con formatos: "nombre=valor"
479//              Parámetros:
480//                      - nombre: Nombre del parámetro a recuperar
481//                      - paramestros: Cadena que contiene todos los parámetros
482// ________________________________________________________________________________________________________
483char* tomaParametro(const char* nombre,TRAMA* ptrTrama)
484{
485        char *a,*b,*pos;
486
487        a=ptrTrama->parametros;
488        b=a+ptrTrama->lonprm;
489        for(pos=a;pos<b;pos++){ // Busca valor del parámetro
490                if(pos[0]==nombre[0]){
491                        if(pos[1]==nombre[1]){
492                                if(pos[2]==nombre[2]){
493                                        if(pos[3]=='='){
494                                                pos+=4;
495                                                return(pos);
496                                        }
497                                }
498                        }
499                }
500        }
501        return(NULL);
502}
503//______________________________________________________________________________________________________
504// Función: copiaParametro
505//
506//      Descripción:
507//              Devuelve una copia del valor de un parámetro
508//      Parámetros:
509//              - ptrTrama: contenido del mensaje
510//              - parametro: Nombre del parámetro
511//              - lon: Nombre del parámetro
512//      Devuelve:
513//              Un puntero a la cadena que contiene el valor del parámetro
514// ________________________________________________________________________________________________________
515char* copiaParametro(const char*nombre,TRAMA* ptrTrama)
516{
517        char *prm,*buffer;
518        char modulo[] = "copiaParametro()";
519
520
521        prm=tomaParametro(nombre,ptrTrama); // Toma identificador de acción
522        if(!prm)
523                return(NULL);
524        buffer = (char*) reservaMemoria(strlen(prm)+1); // Toma memoria para el buffer de lectura.
525        if (buffer == NULL) { // No hay memoria suficiente para el buffer
526                errorLog(modulo, 3, FALSE);
527                return (FALSE);
528        }
529        strcpy(buffer,prm);
530        return(buffer);
531}
532// ________________________________________________________________________________________________________
533// Función: igualIP
534//
535//      Descripción:
536//              Comprueba si una cadena con una dirección IP está incluida en otra que  contienen varias direcciones ipes
537//              separadas por punto y coma
538//      Parámetros:
539//              - cadenaiph: Cadena de direcciones IPES
540//              - ipcliente: Cadena de la IP a buscar
541//      Devuelve:
542//              TRUE: Si el proceso es correcto
543//              FALSE: En caso de ocurrir algún error
544// ________________________________________________________________________________________________________
545BOOLEAN contieneIP(char *cadenaiph,char *ipcliente)
546{
547        char *posa,*posb;
548        int lon;
549
550        posa=strstr(cadenaiph,ipcliente);
551        if(posa==NULL) return(FALSE); // No existe la IP en la cadena
552        posb=posa; // Iguala direcciones
553        while(TRUE){
554                posb++;
555                if(*posb==';') break;
556                if(*posb=='\0') break;
557                if(*posb=='\r') break;
558        }
559        lon=strlen(ipcliente);
560        if((posb-posa)==lon) return(TRUE); // IP encontrada
561        return(FALSE);
562}
563// ________________________________________________________________________________________________________
564// Función: rTrim
565//
566//               Descripción:
567//                      Elimina caracteres de espacios y de asci menor al espacio al final de la cadena
568//              Parámetros:
569//                      - cadena: Cadena a procesar
570// ________________________________________________________________________________________________________
571char* rTrim(char *cadena)
572{
573        int i,lon;
574       
575        lon=strlen(cadena);
576        for (i=lon-1;i>=0;i--){
577                if(cadena[i]<32)
578                        cadena[i]='\0';
579                else
580                        return(cadena);
581        }
582        return(cadena);
583}
584// ________________________________________________________________________________________________________
585// Función: mandaTrama
586//
587//      Descripción:
588//              Envía una trama por la red
589//      Parametros:
590//                      - sock : El socket del host al que se dirige la trama
591//                      - trama: El contenido de la trama
592//                      - lon: Longitud de la parte de parametros de la trama que se va a mandar
593//      Devuelve:
594//              TRUE: Si el proceso es correcto
595//              FALSE: En caso de ocurrir algún error
596// ________________________________________________________________________________________________________
597BOOLEAN mandaTrama(SOCKET *sock, TRAMA* ptrTrama)
598{
599        int lonprm;
600        char *buffer,hlonprm[LONHEXPRM+1];
601
602        lonprm=strlen(ptrTrama->parametros);
603        ptrTrama->parametros=encriptar(ptrTrama->parametros,&lonprm); // Encripta los parámetros
604        sprintf(hlonprm,"%05X",LONGITUD_CABECERATRAMA+LONHEXPRM+lonprm); // Convierte en hexadecimal la longitud
605
606        buffer=reservaMemoria(LONGITUD_CABECERATRAMA+LONHEXPRM+lonprm); // Longitud total de la trama
607        if(buffer==NULL)
608                return(FALSE);
609        memcpy(buffer,ptrTrama,LONGITUD_CABECERATRAMA); // Copia cabecera de trama
610        memcpy(&buffer[LONGITUD_CABECERATRAMA],hlonprm,LONHEXPRM); // Copia longitud de la trama
611        memcpy(&buffer[LONGITUD_CABECERATRAMA+LONHEXPRM],ptrTrama->parametros,lonprm); // Copia parametros encriptados
612        if(!sendData(sock,buffer,LONGITUD_CABECERATRAMA+LONHEXPRM+lonprm))
613                return (FALSE);
614        return(TRUE);
615}
616// ________________________________________________________________________________________________________
617// Función: sendData
618//
619//      Descripción:
620//              Envía datos por la red a través de un socket
621//      Parametros:
622//                      - sock : El socket por donde se envía
623//                      - datos: El contenido a enviar
624//                      - lon: Cantidad de bites a enviar
625//      Devuelve:
626//              TRUE: Si el proceso es correcto
627//              FALSE: En caso de ocurrir algún error
628// ________________________________________________________________________________________________________
629BOOLEAN sendData(SOCKET *sock, char* datos,int lon)
630{
631        int idx,ret;
632        idx = 0;
633        while (lon > 0) {
634                ret = send(*sock,&datos[idx],lon, 0);
635                if (ret == 0) { // Conexión cerrada por parte del cliente (Graceful close)
636                        break;
637                }
638                else{
639                        if (ret == SOCKET_ERROR)
640                                return (FALSE);
641                }
642                lon -= ret;
643                idx += ret;
644        }
645        return (TRUE);
646}
647// ________________________________________________________________________________________________________
648// Función: recibeTrama
649//
650//      Descripción:
651//              Recibe una trama por la red
652//      Parametros:
653//              - sock : El socket del cliente
654//              - trama: El buffer para recibir la trama
655//      Devuelve:
656//              Un puntero a una estrucutra TRAMA o NULL si ha habido algún error
657//              FALSE: En caso de ocurrir algún error
658// ________________________________________________________________________________________________________
659TRAMA* recibeTrama(SOCKET *sock)
660{
661        int ret,lon,lSize;
662        char *buffer,bloque[LONBLK],*hlonprm;
663        TRAMA * ptrTrama;
664
665        lon=lSize=0;
666        do{
667                if(!recData(sock,bloque,LONBLK,&ret)) // Lee bloque
668                        return(NULL);
669
670                if(lSize==0){ // Comprueba tipo de trama y longitud total de los parámetros
671                        if (strncmp(bloque, "@JMMLCAMDJ_MCDJ",15)!=0)
672                                return(NULL); // No se reconoce la trama
673                        hlonprm=reservaMemoria(LONHEXPRM+1);
674                        if(!hlonprm)
675                                return(NULL);
676                        memcpy(hlonprm,&bloque[LONGITUD_CABECERATRAMA],LONHEXPRM);
677                        lSize=strtol(hlonprm,NULL,16); // Longitud total de la trama con los parametros encriptados
678                        buffer=(char*)reservaMemoria(lSize); // Toma memoria para la trama completa
679                        if(!buffer)
680                                return(NULL);
681                }
682
683                if(ret>0){ // Datos recibidos
684                        memcpy(&buffer[lon],bloque,ret); // Añade bloque
685                        lon+=ret;
686                }
687        }while(lon<lSize);
688
689        ptrTrama=(TRAMA *)reservaMemoria(sizeof(TRAMA));
690        if (!ptrTrama)
691                return(NULL);
692        memcpy(ptrTrama,buffer,LONGITUD_CABECERATRAMA); // Copia cabecera de trama
693        lon=lSize-(LONGITUD_CABECERATRAMA+LONHEXPRM); // Longitud de los parametros aún encriptados
694        buffer=desencriptar(&buffer[LONGITUD_CABECERATRAMA+LONHEXPRM],&lon);
695        initParametros(ptrTrama,lon); // Desencripta la trama
696        memcpy(ptrTrama->parametros,buffer,lon);
697        ptrTrama->lonprm=lon; // Almacena longitud de los parámetros ya desencriptados
698        return(ptrTrama);
699}
700// ________________________________________________________________________________________________________
701// Función: recData
702//
703//      Descripción:
704//              Recibe datos por la red a través de un socket
705//      Parametros:
706//              - sock : El socket por el que se reciben los datos
707//              - datos: El buffer donde se almacenan
708//              - lon: Cantidad máxima de bites a recibir
709//              - ret: Cantidad de bites recibidos (Parámetro de salida)
710//      Devuelve:
711//              TRUE: Si el proceso es correcto
712//              FALSE: En caso de ocurrir algún error
713// ________________________________________________________________________________________________________
714BOOLEAN recData(SOCKET *sock, char* buffer,int lon,int* ret)
715{
716        *ret = 0;
717
718        while (TRUE) { // Bucle para recibir datos del cliente
719                *ret = recv(*sock,buffer, lon, 0);
720                if (*ret == 0) // Conexión cerrada por parte del cliente (Graceful close)
721                        break;
722                else {
723                        if (*ret == SOCKET_ERROR) {
724                                return (FALSE);
725                        } else
726                                // Datos recibidos
727                                break;
728                }
729        }
730        return(TRUE);
731}
732//______________________________________________________________________________________________________
733// Función: enviaFlag
734//
735//      Descripción:
736//              Envia una señal de sincronización
737//      Parámetros:
738//              - socket_c: (Salida) Socket utilizado para el envío (operativo)
739//              - ptrTrama: contenido del mensaje
740//      Devuelve:
741//              TRUE: Si el proceso es correcto
742//              FALSE: En caso de ocurrir algún error
743// ________________________________________________________________________________________________________
744BOOLEAN enviaFlag(SOCKET *socket_c,TRAMA *ptrTrama)
745{
746        char modulo[] = "enviaFlag()";
747        if (!mandaTrama(socket_c,ptrTrama)) {
748                errorLog(modulo,26,FALSE);
749                return (FALSE);
750        }
751        return(TRUE);
752}
753//______________________________________________________________________________________________________
754// Función: recibeFlag
755//
756//      Descripción:
757//              Recibe una señal de sincronización
758//      Parámetros:
759//              - socket_c: Socket utilizadopara la recepción (operativo)
760//              - ptrTrama: (Salida) Contenido del mensaje
761//      Devuelve:
762//              TRUE: Si el proceso es correcto
763//              FALSE: En caso de ocurrir algún error
764// ________________________________________________________________________________________________________
765BOOLEAN recibeFlag(SOCKET *socket_c,TRAMA *ptrTrama)
766{
767        ptrTrama=recibeTrama(socket_c);
768        if(!ptrTrama){
769                return(FALSE);
770        }
771        return(TRUE);
772}
773//______________________________________________________________________________________________________
774// Función: URLEncode
775//
776//      Descripción:
777//              Codifica una cadena en UrlEncode
778//      Parámetros:
779//              - src: La cadena a decodificar
780//      Devuelve:
781//              La cadena decodificada
782// ________________________________________________________________________________________________________
783char* URLEncode(char *src)
784{
785        char *dest;
786        int i,j=0,lon;
787
788        lon=strlen(src);
789        dest=(char*)reservaMemoria(lon*2);      // Reserva buffer  para la cadena
790        for(i=0;i<lon;i++){
791                if(src[i]==0x20){ // Espacio
792                        dest[j++] = '%';
793                        dest[j++] = '2';
794                        dest[j++] = '0';
795                }
796                else
797                        dest[j++] = src[i];
798        }
799        return(dest);
800}
801//______________________________________________________________________________________________________
802// Función: URLDecode
803//
804//      Descripción:
805//              Decodifica una cadena codificada con UrlEncode
806//      Parámetros:
807//              - src: La cadena a decodificar
808//      Devuelve:
809//              La cadena decodificada
810// ________________________________________________________________________________________________________
811char* URLDecode(char *src)
812{
813        const char *p = src;
814        char code[3] = {0};
815        unsigned long ascii = 0;
816        char *end = NULL;
817        char *dest,*cad;
818
819        dest=(char*)reservaMemoria(strlen(src));        // Reserva buffer  para la cadena
820        cad=dest;
821        while(*p){
822                if(*p == '%'){
823                        memcpy(code, ++p, 2);
824                        ascii = strtoul(code, &end, 16);
825                        *dest++ = (char)ascii;
826                        p += 2;
827                }
828                else
829                        *dest++ = *p++;
830        }
831        return(cad);
832}
833// ________________________________________________________________________________________________________
834// Función: leeArchivo
835//
836//      Descripción:
837//              Lee un archivo
838//      Parámetros:
839//              fil: Nombre completo del archivo
840//      Devuelve:
841//              Un puntero al buffer con el contenido leido
842
843//______________________________________________________________________________________________________
844char * leeArchivo(char *fil)
845{
846        FILE *f;
847        long lSize;
848        char* buffer;
849
850        f=fopen(fil,"rb");
851        if (!f)
852                return(NULL);
853        fseek (f,0,SEEK_END); // Obtiene tamaño del fichero.
854        lSize = ftell (f);
855        rewind (f);
856        buffer = (char*) reservaMemoria(lSize+1); // Toma memoria para el buffer de lectura.
857        if (!buffer) // No hay memoria suficiente para el buffer
858                return (NULL);
859        lSize=fread (buffer,1,lSize,f); // Lee contenido del fichero
860        fclose(f);
861        return (buffer);
862}
863// ________________________________________________________________________________________________________
864// Función: leeArchivo
865//
866//      Descripción:
867//              Calcula la longitud de un archivo
868//      Parámetros:
869//              fil: Nombre completo del archivo
870//      Devuelve:
871//              Un puntero al buffer con el contenido leido
872
873//______________________________________________________________________________________________________
874int lonArchivo(char *fil)
875{
876        FILE *f;
877        long lSize;
878
879        f=fopen(fil,"rb");
880        if (!f)
881                return(0);
882        fseek (f,0,SEEK_END); // Obtiene tamaño del fichero.
883        lSize = ftell (f);
884        fclose(f);
885        return (lSize);
886}
887// ________________________________________________________________________________________________________
888// Función: escribeArchivo
889//
890//      Descripción:
891//              Escribe un archivo
892//      Parámetros:
893//              fil: Nombre completo del archivo
894//              buffer: Un puntero al buffer con el contenido a escribir
895//      Devuelve:
896//______________________________________________________________________________________________________
897BOOLEAN escribeArchivo(char *fil,char*buffer)
898{
899        FILE *f;
900        long lSize;
901
902        f=fopen(fil,"wb");
903        if (!f){
904                return(FALSE);
905        }
906        lSize=strlen(buffer);
907        fwrite(buffer,1,lSize,f); // Escribe el contenido en el fichero
908        fclose(f);
909        return (TRUE);
910}
911// ________________________________________________________________________________________________________
912// Función: sendArchivo
913//
914//      Descripción:
915//              Envía un archivo por la red
916//      Parámetros:
917//              sock: Socket para el envío
918//              fil: Nombre local completo del archivo
919//      Devuelve:
920//              TRUE: Si el proceso es correcto
921//              FALSE: En caso de ocurrir algún error
922//______________________________________________________________________________________________________
923BOOLEAN sendArchivo(SOCKET *sock,char *fil)
924{
925        long lSize;
926        FILE *f;
927        char buffer[LONBLK];
928
929        f = fopen(fil,"rb");
930        if(!f) // El fichero no existe
931                return(FALSE);
932
933        while(!feof(f)){
934                lSize=fread (buffer,1,LONBLK,f); // Lee el contenido del fichero
935                if(!sendData(sock,buffer,lSize))
936                        return (FALSE);
937        }
938        fclose(f);
939        return(TRUE);
940}
941// ________________________________________________________________________________________________________
942// Función: recArchivo
943//
944//      Descripción:
945//              Recibe un archivo por la red
946//      Parámetros:
947//              sock: Socket para la recepción
948//              fil: Nombre local completo del archivo que se creará
949//      Devuelve:
950//              TRUE: Si el proceso es correcto
951//              FALSE: En caso de ocurrir algún error
952//______________________________________________________________________________________________________
953BOOLEAN recArchivo(SOCKET *sock,char *fil)
954{
955        int lon;
956        FILE *f;
957        char buffer[LONBLK];
958
959        f = fopen(fil,"wb");
960        if(!f) // No se ha podido crear el archivo
961                return(FALSE);
962        do{
963                if(!recData(sock,buffer,LONBLK,&lon))
964                        return(FALSE);
965                // Datos recibidos
966                if(lon>0)
967                        fwrite(buffer,1,lon,f); // Lee el contenido del fichero
968        }while(lon>0); // Bucle para recibir datos del cliente
969        fclose(f);
970        return(TRUE);
971}
972//______________________________________________________________________________________________________
973// Función: initParammetros
974//
975//       Descripción:
976//              Libera memoria del buffer de los parametros de la trama y vuelve a reservar espacio
977//      Parámetros:
978//              - parametros : Puntero a la zona donde están los parametros de una trama
979//              - lon : Tamaño de la nueva reserva de espacio para los parametros
980//      Devuelve:
981//              Un puntero a la nueva zona de memoria o NULL si ha habido algún error
982// Especificaciones:
983//              En caso de que el parámetro lon valga cero el tamaño a reservar será el estandar
984//______________________________________________________________________________________________________
985BOOLEAN initParametros(TRAMA* ptrTrama,int lon)
986{
987        if(lon==0) lon=LONGITUD_PARAMETROS;
988        ptrTrama->parametros=(char*)ampliaMemoria(ptrTrama->parametros,lon);
989        if(!ptrTrama->parametros)
990                return(FALSE);
991        else
992                return(TRUE);
993}
994//______________________________________________________________________________________________________
995// Función: TCPConnect
996//
997//       Descripción:
998//              Crea un socket y lo conecta a un servidor
999//      Parámetros:
1000//              - ips : La Dirección IP del servidor
1001//              - port : Puerto para la comunicación
1002//      Devuelve:
1003//              Un socket para comunicaciones por protocolo TCP
1004//______________________________________________________________________________________________________
1005SOCKET TCPConnect(char *ips,char* port)
1006{
1007        SOCKET s;
1008    struct sockaddr_in server;
1009        char modulo[] = "TCPConnect()";
1010
1011        s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
1012        if (s == INVALID_SOCKET){
1013                return (INVALID_SOCKET);
1014        }
1015        server.sin_family = AF_INET;
1016        server.sin_port = htons((short)atoi(port));
1017        server.sin_addr.s_addr = inet_addr(ips);
1018
1019        if (connect(s, (struct sockaddr *)&server, sizeof(server)) == INVALID_SOCKET){
1020                errorLog(modulo,38,TRUE);
1021                return (INVALID_SOCKET);
1022        }
1023
1024        return(s);
1025}
1026//______________________________________________________________________________________________________
1027// Función: AbreConexion
1028//
1029//       Descripción:
1030//              Abre la conexión entre el cliente y el servidor de administración
1031//      Parámetros:
1032//              - Ninguno
1033//      Devuelve:
1034//              Un socket de cliente para comunicaciones
1035//______________________________________________________________________________________________________
1036SOCKET abreConexion(void)
1037{
1038        int swloop=0;
1039        SOCKET s;
1040
1041        while(swloop<MAXCNX){
1042                s=TCPConnect(servidoradm,puerto);
1043                if(s!= INVALID_SOCKET){
1044                        return(s);
1045                }
1046                swloop++;
1047                #ifdef  __WINDOWS__
1048                        Sleep(5*1000);
1049                #else
1050                        sleep(5); // Espera cinco segundos antes de intentar una nueva conexión
1051                #endif
1052        }
1053        return(INVALID_SOCKET);
1054}
1055//______________________________________________________________________________________________________
1056// Función: enviaMensaje
1057//
1058//      Descripción:
1059//              Envia un mensaje al servidor de Administración
1060//      Parámetros:
1061//              - socket_c: (Salida) Socket utilizado para el envío
1062//              - ptrTrama: contenido del mensaje
1063//              - tipo: Tipo de mensaje
1064//                              C=Comando, N=Respuesta a un comando, P=Peticion,R=Respuesta a una petición, I=Informacion
1065//      Devuelve:
1066//              TRUE: Si el proceso es correcto
1067//              FALSE: En caso de ocurrir algún error
1068// ________________________________________________________________________________________________________
1069BOOLEAN enviaMensaje(SOCKET *socket_c,TRAMA *ptrTrama,char tipo)
1070{
1071        char modulo[] = "enviaMensaje()";
1072
1073        *socket_c=abreConexion();
1074        if(*socket_c==INVALID_SOCKET){
1075                errorLog(modulo,38,FALSE); // Error de conexión con el servidor
1076                return(FALSE);
1077        }
1078        ptrTrama->arroba='@'; // Cabecera de la trama
1079        strncpy(ptrTrama->identificador,"JMMLCAMDJ_MCDJ",14);   // identificador de la trama
1080        ptrTrama->tipo=tipo; // Tipo de mensaje
1081
1082        if (!mandaTrama(socket_c,ptrTrama)) {
1083                errorLog(modulo,26,FALSE);
1084                return (FALSE);
1085        }
1086        return(TRUE);
1087}
1088//______________________________________________________________________________________________________
1089// Función: recibeMensaje
1090//
1091//      Descripción:
1092//              Recibe un mensaje del servidor de Administración
1093//      Parámetros:
1094//              - socket_c: Socket utilizadopara la recepción
1095//              - ptrTrama: (Salida) Contenido del mensaje
1096//      Devuelve:
1097//              TRUE: Si el proceso es correcto
1098//              FALSE: En caso de ocurrir algún error
1099// ________________________________________________________________________________________________________
1100TRAMA* recibeMensaje(SOCKET *socket_c)
1101{
1102        TRAMA* ptrTrama;
1103        char modulo[] = "recibeMensaje()";
1104
1105        ptrTrama=recibeTrama(socket_c);
1106        if(!ptrTrama){
1107                errorLog(modulo,17,FALSE);
1108                return(NULL);
1109        }
1110        return(ptrTrama);
1111}
Note: See TracBrowser for help on using the repository browser.