Empezamos la dependencia de modulos :)
This commit is contained in:
parent
e03fd5f3d5
commit
f987780672
|
@ -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)
|
||||
|
|
|
@ -18,6 +18,77 @@
|
|||
#ifndef __MODULOS_H
|
||||
#define __MODULOS_H
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#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();
|
||||
|
|
Loading…
Reference in a new issue