Empezamos la dependencia de modulos :)

This commit is contained in:
Víctor Román Archidona 2002-10-06 19:24:08 +00:00
parent e03fd5f3d5
commit f987780672
2 changed files with 165 additions and 0 deletions

View file

@ -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)

View file

@ -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();