source: admin/Sources/Includes/ogAdmLib.c @ 7caf5a7c

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 7caf5a7c was 3ec149c, checked in by alonso <alonso@…>, 15 years ago

git-svn-id: https://opengnsys.es/svn/trunk@1314 a21b9725-9963-47de-94b9-378ad31fedc9

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