source: ogServer-Git/sources/ogAdmLib.c @ 96090fd

Last change on this file since 96090fd was 333abbe, checked in by OpenGnSys Support Team <soporte-og@…>, 4 years ago

#986 rename to ogserver

  • Property mode set to 100644
File size: 11.6 KB
RevLine 
[cf7bbda]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#include <stdio.h>
11#include <string.h>
12#include <stdlib.h>
13#include <ctype.h>
14#include <sys/types.h>
15#include <sys/socket.h>
16#include "ogAdmLib.h"
17
18//______________________________________________________________________________________________________
19// Función: ValidacionParametros
20//
21//       Descripción:
22//              Valida que los parametros de ejecución del programa sean correctos
23//      Parámetros:
24//              - argc: Número de argumentos
25//              - argv: Puntero a cada argumento
26//              - eje:  Tipo de ejecutable (1=Servicio,2=Repositorio o 3=Cliente)
27//      Devuelve:
28//              - TRUE si los argumentos pasados son correctos
29//              - FALSE en caso contrario
30//      Especificaciones:
31//              La sintaxis de los argumentos es la siguiente
32//                      -f      Archivo de configuración del servicio
33//                      -l      Archivo de logs
34//                      -d      Nivel de debuger (mensages que se escribirán en el archivo de logs)
35//      Devuelve:
36//              TRUE: Si el proceso es correcto
37//              FALSE: En caso de ocurrir algún error
38//______________________________________________________________________________________________________
39BOOLEAN validacionParametros(int argc, char*argv[],int eje) {
40        int i;
41
42        switch(eje){
43                case 1: // Administrador
[333abbe]44                        strcpy(szPathFileCfg, "ogserver.cfg"); // Valores por defecto de archivos
45                        strcpy(szPathFileLog, "ogserver.log"); // de configuración y de logs
[cf7bbda]46                        break;
47                case 2: // Repositorio
48                        strcpy(szPathFileCfg, "ogAdmRepo.cfg"); // Valores por defecto de archivos
49                        strcpy(szPathFileLog, "ogAdmRepo.log"); // de configuración y de logs
50                        break;
51                case 3: // Cliente OpenGnsys
52                        strcpy(szPathFileCfg, "ogAdmClient.cfg"); // Valores por defecto de archivos
53                        strcpy(szPathFileLog, "ogAdmClient.log"); // de configuración y de logs
54                        break;
55                case 4: // Servicios DHCP,BOOTP Y TFTP
56                        strcpy(szPathFileCfg, "ogAdmBoot.cfg"); // Valores por defecto de archivos
57                        strcpy(szPathFileLog, "ogAdmBoot.log"); // de configuración y de logs
58                        break;
59                case 5: // Agente
60                        strcpy(szPathFileCfg, "ogAdmAgent.cfg"); // Valores por defecto de archivos
61                        strcpy(szPathFileLog, "ogAdmAgent.log"); // de configuración y de logs
62                        break;
63                case 6: // Agente
64                        strcpy(szPathFileCfg, "ogAdmWinClient.cfg"); // Valores por defecto de archivos
65                        strcpy(szPathFileLog, "ogAdmWinClient.log"); // de configuración y de logs
66                        break;
67                case 7: // Agente
68                        strcpy(szPathFileCfg, "ogAdmnxClient.cfg"); // Valores por defecto de archivos
69                        strcpy(szPathFileLog, "ogAdmLnxClient.log"); // de configuración y de logs
70                        break;
71        }
72
73        ndebug = 1; // Nivel de debuger por defecto
74
75        for (i = 1; (i + 1) < argc; i += 2) {
76                if (argv[i][0] == '-') {
77                        switch (tolower(argv[i][1])) {
78                        case 'f':
79                                if (argv[i + 1] != NULL)
80                                        strcpy(szPathFileCfg, argv[i + 1]);
81                                else {
82                                        return (FALSE);
83                                }
84                                break;
85                        case 'l':
86                                if (argv[i + 1] != NULL)
87                                        strcpy(szPathFileLog, argv[i + 1]);
88                                else {
89                                        return (FALSE);
90                                }
91                                break;
92                        case 'd':
93                                if (argv[i + 1] != NULL) {
94                                        ndebug = atoi(argv[i + 1]);
95                                        if (ndebug < 1)
96                                                ndebug = 1; // Por defecto el nivel de debug es 1
97                                } else
98                                        ndebug = 1; // Por defecto el nivel de debug es 1
99                                break;
100                        default:
101                                exit(EXIT_FAILURE);
102                                break;
103                        }
104                }
105        }
106        return (TRUE);
107}
108// ________________________________________________________________________________________________________
109// Función: splitCadena
110//
111//      Descripción:
112//                      Trocea una cadena según un carácter delimitador
113//      Parámetros:
114//                      - trozos: Array de punteros a cadenas
115//                      - cadena: Cadena a trocear
116//                      - chd: Carácter delimitador
117//      Devuelve:
118//              Número de trozos en que se divide la cadena
119// ________________________________________________________________________________________________________
120int splitCadena(char **trozos,char *cadena, char chd)
121{
122        int w=0;
123        if(cadena==NULL) return(w);
124
125        trozos[w++]=cadena;
126        while(*cadena!='\0'){
127                if(*cadena==chd){
128                        *cadena='\0';
129                        if(*(cadena+1)!='\0')
130                                trozos[w++]=cadena+1;
131                }
132                cadena++;
133        }
134        return(w); // Devuelve el número de trozos
135}
136// ________________________________________________________________________________________________________
137// Función: escaparCadena
138//
139//      Descripción:
140//                      Sustituye las apariciones de un caracter comila simple ' por \'
141//      Parámetros:
142//                      - cadena: Cadena a escapar
143// Devuelve:
144//              La cadena con las comillas simples sustituidas por \'
145// ________________________________________________________________________________________________________
146char* escaparCadena(char *cadena)
147{
148        int b,c;
149        char *buffer;
150
151        buffer = (char*) reservaMemoria(strlen(cadena)*2); // Toma memoria para el buffer de conversión
152        if (buffer == NULL) { // No hay memoria suficiente para el buffer
153                return (FALSE);
154        }
155
156        c=b=0;
157        while(cadena[c]!=0) {
158                if (cadena[c]=='\''){
159                        buffer[b++]='\\';
160                        buffer[b++]='\'';
161                }
162                else{
163                        buffer[b++]=cadena[c];
164                }
165                c++;
166        }
167        return(buffer);
168}
169
170// ________________________________________________________________________________________________________
171// Función: igualIP
172//
173//      Descripción:
174//              Comprueba si una cadena con una dirección IP está incluida en otra que  contienen varias direcciones ipes
175//              separadas por punto y coma
176//      Parámetros:
177//              - cadenaiph: Cadena de direcciones IPES
178//              - ipcliente: Cadena de la IP a buscar
179//      Devuelve:
180//              TRUE: Si el proceso es correcto
181//              FALSE: En caso de ocurrir algún error
182// ________________________________________________________________________________________________________
183BOOLEAN contieneIP(char *cadenaiph,char *ipcliente)
184{
185        char *posa,*posb;
186        int lon, i;
187
188        posa=strstr(cadenaiph,ipcliente);
189        if(posa==NULL) return(FALSE); // No existe la IP en la cadena
190        posb=posa; // Iguala direcciones
191        for (i = 0; i < LONIP; i++) {
192                if(*posb==';') break;
193                if(*posb=='\0') break;
194                if(*posb=='\r') break;
195                posb++;
196        }
197        lon=strlen(ipcliente);
198        if((posb-posa)==lon) return(TRUE); // IP encontrada
199        return(FALSE);
200}
201// ________________________________________________________________________________________________________
202// Función: rTrim
203//
204//               Descripción:
205//                      Elimina caracteres de espacios y de asci menor al espacio al final de la cadena
206//              Parámetros:
207//                      - cadena: Cadena a procesar
208// ________________________________________________________________________________________________________
209char* rTrim(char *cadena)
210{
211        int i,lon;
212
213        lon=strlen(cadena);
214        for (i=lon-1;i>=0;i--){
215                if(cadena[i]<32)
216                        cadena[i]='\0';
217                else
218                        return(cadena);
219        }
220        return(cadena);
221}
222//______________________________________________________________________________________________________
223// Función: reservaMemoria
224//
225//      Descripción:
226//              Reserva memoria para una variable
227//      Parámetros:
228//              - lon:  Longitud en bytes de la reserva
229//      Devuelve:
230//              Un puntero a la zona de memoria reservada que ha sido previamente rellena con zeros o nulos
231//______________________________________________________________________________________________________
232char* reservaMemoria(int lon)
233{
234        char *mem;
235
236        mem=(char*)malloc(lon);
237        if(mem!=NULL)
238                memset(mem,0,lon);
239        return(mem);
240}
241//______________________________________________________________________________________________________
242// Función: ampliaMemoria
243//
244//      Descripción:
245//              Amplia memoria para una variable
246//      Parámetros:
247//              - ptr:  Puntero al buffer de memoria que se quiere ampliar
248//              - lon:  Longitud en bytes de la amplicación
249//      Devuelve:
250//              Un puntero a la zona de memoria reservada que ha sido previamente rellena con zeros o nulos
251//______________________________________________________________________________________________________
252char* ampliaMemoria(char* ptr,int lon)
253{
254        char *mem;
255
256        mem=(char*)realloc(ptr,lon*sizeof(char*));
257        if(mem!=NULL)
258                return(mem);
259        return(NULL);
260}
261//______________________________________________________________________________________________________
262// Función: liberaMemoria
263//
264//      Descripción:
265//              Libera memoria para una variable
266//      Parámetros:
267//              - ptr:  Puntero al buffer de memoria que se quiere liberar
268//      Devuelve:
269//              Nada
270//______________________________________________________________________________________________________
271void liberaMemoria(void* ptr)
272{
273        if(ptr){
274                free (ptr);
275        }
276}
277// ________________________________________________________________________________________________________
278// Función: sendData
279//
280//      Descripción:
281//              Envía datos por la red a través de un socket
282//      Parametros:
283//                      - sock : El socket por donde se envía
284//                      - datos: El contenido a enviar
285//                      - lon: Cantidad de bites a enviar
286//      Devuelve:
287//              TRUE: Si el proceso es correcto
288//              FALSE: En caso de ocurrir algún error
289// ________________________________________________________________________________________________________
290BOOLEAN sendData(SOCKET *sock, char* datos,int lon)
291{
292        int idx,ret;
293        idx = 0;
294        while (lon > 0) {
295                ret = send(*sock,&datos[idx],lon, 0);
296                if (ret == 0) { // Conexión cerrada por parte del cliente (Graceful close)
297                        break;
298                }
299                else{
300                        if (ret == -1)
301                                return (FALSE);
302                }
303                lon -= ret;
304                idx += ret;
305        }
306        return (TRUE);
307}
308// ________________________________________________________________________________________________________
309// Función: mandaTrama
310//
311//      Descripción:
312//              Envía una trama por la red
313//      Parametros:
314//                      - sock : El socket del host al que se dirige la trama
315//                      - trama: El contenido de la trama
316//                      - lon: Longitud de la parte de parametros de la trama que se va a mandar
317//      Devuelve:
318//              TRUE: Si el proceso es correcto
319//              FALSE: En caso de ocurrir algún error
320// ________________________________________________________________________________________________________
321BOOLEAN mandaTrama(SOCKET *sock, TRAMA* ptrTrama)
322{
323        int lonprm;
324        char *buffer,hlonprm[LONHEXPRM+1];
325        BOOLEAN res;
326
327        lonprm=strlen(ptrTrama->parametros);
328        sprintf(hlonprm,"%05X",LONGITUD_CABECERATRAMA+LONHEXPRM+lonprm); // Convierte en hexadecimal la longitud
329
330        buffer=reservaMemoria(LONGITUD_CABECERATRAMA+LONHEXPRM+lonprm); // Longitud total de la trama
331        if(buffer==NULL)
332                return(FALSE);
333        memcpy(buffer,ptrTrama,LONGITUD_CABECERATRAMA); // Copia cabecera de trama
334        memcpy(&buffer[LONGITUD_CABECERATRAMA],hlonprm,LONHEXPRM); // Copia longitud de la trama
335        memcpy(&buffer[LONGITUD_CABECERATRAMA+LONHEXPRM],ptrTrama->parametros,lonprm);
336        res=sendData(sock,buffer,LONGITUD_CABECERATRAMA+LONHEXPRM+lonprm);
337        liberaMemoria(buffer);
338        return (res);
339}
340
341//______________________________________________________________________________________________________
342// Función: initParammetros
343//
344//       Descripción:
345//              Libera memoria del buffer de los parametros de la trama y vuelve a reservar espacio
346//      Parámetros:
347//              - parametros : Puntero a la zona donde están los parametros de una trama
348//              - lon : Tamaño de la nueva reserva de espacio para los parametros
349//      Devuelve:
350//              Un puntero a la nueva zona de memoria o NULL si ha habido algún error
351// Especificaciones:
352//              En caso de que el parámetro lon valga cero el tamaño a reservar será el estandar
353//______________________________________________________________________________________________________
354BOOLEAN initParametros(TRAMA* ptrTrama,int lon)
355{
356        if(lon==0) lon=LONGITUD_PARAMETROS;
357        ptrTrama->parametros=(char*)ampliaMemoria(ptrTrama->parametros,lon);
358        if(!ptrTrama->parametros)
359                return(FALSE);
360        else
361                return(TRUE);
362}
Note: See TracBrowser for help on using the repository browser.