diff --git a/ediv/src/ediv/modulos.c b/ediv/src/ediv/modulos.c index e41bafc..5895dcc 100644 --- a/ediv/src/ediv/modulos.c +++ b/ediv/src/ediv/modulos.c @@ -38,6 +38,100 @@ int imem_temp; int iloc_temp; +#ifdef MODULOS2 +_listamodulos *Buscar (char *nombre) +{ + if (ListaModulos) { + _listamodulos *tmp = ListaModulos; + while (tmp->anterior) + tmp = tmp->anterior; + while (tmp) { + if (tmp->modulo) + if (!_strcmpi(tmp->modulo->NombreModulo, nombre)) + return tmp; + if (tmp->siguiente) + tmp = tmp->siguiente; + else + return NULL; + } + } + return NULL; +} + +int Cargar (char *NombreArchivo) +{ + dlHandler Manejador; + char *NombreModulo; + Log.Log ("Cargando %s:", NombreArchivo); + Manejador = dlopen (NombreArchivo, RTLD_GLOBAL | RTLD_NOW); + if (!Manejador) + { + Log.Log ("%s", UltimoErrorDL = dlerror ()); + return CMOD_ERROR_DLOPEN; + } + else if (!(NombreModulo = (char *) dlsym (Manejador, "NombreModulo"))) + { + Log.Log ("No se pudo encontrar el símbolo \"NombreModulo\""); + UltimoErrorDL = dlerror (); + dlclose (Manejador); + return CMOD_NO_NOMBRE_MODULO; + } + else + Log.Log ("NombreModulo para %s es [%s]", NombreArchivo, NombreModulo); + if (Buscar (NombreModulo)) + { + Log.Log ("El módulo %s[%s] ya está cargado", NombreArchivo, + NombreModulo); + dlclose (Manejador); + return CMOD_YA_CARGADO; + } + if (ListaModulos) + { + while (ListaModulos->Siguiente) + ListaModulos = ListaModulos->Siguiente; + ListaModulos->Siguiente = + (_ListaModulos *) gnew (sizeof (_ListaModulos)); + bzero (ListaModulos->Siguiente, sizeof (_ListaModulos)); + ListaModulos->Siguiente->Anterior = ListaModulos; + ListaModulos = ListaModulos->Siguiente; + } + else + { + ListaModulos = (_ListaModulos *) gnew (sizeof (_ListaModulos)); + bzero (ListaModulos, sizeof (_ListaModulos)); + } + + ListaModulos->Modulo = (c_Modulo *) gnew (sizeof (c_Modulo)); + bzero (ListaModulos->Modulo, sizeof (c_Modulo)); + ListaModulos->Modulo->Manejador = Manejador; + ListaModulos->Modulo->NombreArchivo = + (char *) gnew (strlen (NombreArchivo) + 1); + strcpy (ListaModulos->Modulo->NombreArchivo, NombreArchivo); + ListaModulos->Modulo->NombreModulo = NombreModulo; + + ListaModulos->Modulo->Autor = (char *) dlsym (Manejador, "Autor"); + ListaModulos->Modulo->Version = (char *) dlsym (Manejador, "Version"); + ListaModulos->Modulo->Descripcion = + (char *) dlsym (Manejador, "Descripcion"); + + if (!(dlCast_1 ListaModulos->Modulo->Iniciar = + dlCast_2 dlsym (Manejador, "Iniciar"))) + Log.Log ("No se puede resolver el símbolo Iniciar"); + + if (!(dlCast_1 ListaModulos->Modulo->Detener = + dlCast_2 dlsym (Manejador, "Detener"))) + Log.Log ("No se puede resolver el símbolo Detener"); + + if (ListaModulos->Modulo->Iniciar) + if (ListaModulos->Modulo->Iniciar () == INICIAR_FALLADO) + { + Descargar (NombreModulo, DMOD_DESCARGAR_DEP, DMOD_IGNORAR_DETENER); + return CMOD_ERROR_INICIAR; + } + return CMOD_OK; +} + +#endif /* MODULOS2 */ // obtiene el nombre esencial de la libreria (sin extension ni path) void get_rawname(char* completo, char* rawname) diff --git a/ediv/src/ediv/modulos.h b/ediv/src/ediv/modulos.h index b79317a..ead0d57 100644 --- a/ediv/src/ediv/modulos.h +++ b/ediv/src/ediv/modulos.h @@ -18,6 +18,77 @@ #ifndef __MODULOS_H #define __MODULOS_H +#include + +#define MODULOS2 + +#ifdef MODULOS2 + +#define dlHandler void* +#define dlCast_1 (void*) +#define dlCast_2 + +struct Modulo { + dlHandler Manejador; /* Manejador del módulo */ + char *NombreArchivo; /* Nombre del Archivo */ + char *NombreModulo; /* Nombre del Módulo */ + char *Descripcion; /* Descripcion del Módulo */ + char *Version; /* Versión del Módulo */ + char *Autor; /* Autor del Módulo */ + time_t FechaCarga; /* Fecha de Carga del Módulo */ + time_t UltimoUso; /* Fecha del último uso del Módulo */ + int (*Iniciar) (void); /* Función llamada al inicio del Módulo */ + int (*Detener) (void); /* Función llamada en la descarga del Módulo */ +}; + +typedef struct _listamodulos +{ + /* Puntero al siguiente elemento de la lista. + * Si no hay siguiente elemento, este es NULL. + */ + struct _listamodulos *siguiente; + + /*! \brief Puntero al elemento anterior de la + * lista. + * \note Si no hay elemento anterior, este es NULL. + */ + struct _listamodulos *anterior; + + /*! \brief Puntero a la información del Módulo */ + struct Modulo *modulo; + + /*! \brief Lista de Dependencias del módulo + * \note Si no hay ninguna dependencia, este es NULL + */ + struct _listadependencias + { + /*! \brief Puntero al siguiente elemento de la + * lista. + * \note Si no hay siguiente elemento, este es NULL. + */ + struct _listadependencias *siguiente; + /*! \brief Puntero al elemento anterior de la + * lista. + * \note Si no hay elemento anterior, este es NULL. + */ + struct _listadependencias *anterior; + /*! \brief Puntero a la dependencia */ + struct _listamodulos *dependencia; + } *listadependencias; + +} _listamodulos; + +char *UltimoErrorDL; +struct _listamodulos *ListaModulos; +int Cargar (char *); +int Descargar (char *, unsigned short, unsigned short); +int NuevaDependencia (char *, char *); +int BorrarDependencia (char *, char *); +struct _listamodulos *Buscar (char *); +char *ObtenerUltimoErrorDL (void); + +#endif /* MODULOS2 */ + int* nuevo_orden; int leedll();