source: Sophya/trunk/SophyaLib/SysTools/pdlmgr.cc@ 416

Last change on this file since 416 was 296, checked in by ansari, 26 years ago

PDynLinkMgr:Bug suppression copie .so Reza 15/5/99

File size: 3.4 KB
Line 
1// This may look like C code, but it is really -*- C++ -*-
2// Gestionnaire de lien dynamique - R. Ansari 12/98
3// LAL (Orsay) / IN2P3-CNRS DAPNIA/SPP (Saclay) / CEA
4
5#include <stdio.h>
6#include <stdlib.h>
7
8#include <iostream.h>
9
10#include "pdlmgr.h"
11
12// Extension de noms de fichiers Shared libs
13static const char* sofext = ".so";
14static const char* sofext_HPUX = ".sl";
15
16// Variables et methodes static
17int PDynLinkMgr::numSO = 0;
18string* PDynLinkMgr::tmpDir = NULL;
19
20/* --Methode-Static-- */
21void PDynLinkMgr::SetTmpDir(string const & path)
22{
23if ( (path.length() > 0) && (path[path.length()] != '/') ) GetTmpDir() = path + '/';
24else GetTmpDir() = path;
25return;
26}
27
28/* --Methode-Static-- */
29string& PDynLinkMgr::GetTmpDir()
30{
31if (tmpDir == NULL) {
32 tmpDir = new string("");
33 char* varenv;
34 if ( (varenv=getenv("PEIDA_TMP")) != NULL ) *tmpDir = varenv;
35 else if ( (varenv=getenv("TMPDIR")) != NULL ) *tmpDir = varenv;
36 }
37return(*tmpDir);
38}
39
40/* --Methode-Static-- */
41PDynLinkMgr* PDynLinkMgr::BuildFromCFile(string const & fname)
42{
43size_t l = fname.length();
44if (l < 1) return(NULL);
45string fnameobj = GetTmpDir()+"tmp_pdl.o";
46
47string cmd;
48int rc;
49
50// Compilation du fichier
51#if defined(OSF1) || defined(Linux)
52cmd = "cc -c -o " + fnameobj + " " + fname;
53#endif
54rc = system(cmd.c_str());
55if (rc != 0) {
56 cerr << "PDynLinkMgr::BuildFromCFile() Error Rc(" << cmd <<")= "<< rc << endl;
57 return(NULL);
58 }
59
60char buff[32];
61numSO++;
62#ifndef HPUX
63sprintf(buff,"pdlmgr%d%s", numSO,sofext);
64#endif
65string fnameso = GetTmpDir()+buff;
66
67// Creation du shared-lib
68#if defined(OSF1)
69 cmd = "ld -shared -o " + fnameso + " -all " + fnameobj + " -none -lm -lc";
70#else
71 cmd = "ld -shared -o " + fnameso + " " + fnameobj + " -lm -lc";
72#endif
73rc = system(cmd.c_str());
74if (rc != 0) {
75 cerr << "PDynLinkMgr::BuildFromCFile() Error Rc(" << cmd <<")= "<< rc << endl;
76 return(NULL);
77 }
78
79PDynLinkMgr* rdyn = new PDynLinkMgr(fnameso, false);
80rdyn->copy = true;
81return(rdyn);
82
83}
84
85/* --Methode-- */
86PDynLinkMgr::PDynLinkMgr(string& soname, bool cp)
87{
88dlhandle = NULL;
89soName = "";
90
91if (soname.find_last_of(".") > soname.length())
92#ifdef HPUX
93 soname += sofext_HPUX;
94#else
95 soname += sofext;
96#endif
97
98string fnameso;
99if (cp) {
100 numSO++;
101 char buff[32];
102#ifndef HPUX
103 sprintf(buff,"pdlmgr%d%s", numSO,sofext);
104#else
105 sprintf(buff,"pdlmgr%d%s", numSO,sofext_HPUX);
106#endif
107 fnameso = GetTmpDir()+buff;
108 string cmd = "cp " + soname + " " + fnameso;
109 int rc = system(cmd.c_str());
110 if (rc != 0) {
111 cerr << "PDynLinkMgr::PDynLinkMgr() Error Rc(" << cmd <<")= "<< rc << endl;
112 return;
113 }
114 }
115else fnameso = soname;
116copy = cp;
117soName = fnameso;
118
119#if defined(OSF1) || defined(Linux)
120dlhandle = dlopen(fnameso.c_str(), RTLD_NOW);
121if (dlhandle == NULL) {
122 cerr << "PDynLinkMgr::PDynLinkMgr(): Error opening SO " << fnameso
123 << " (" << soname << ")" << endl;
124 string sn = dlerror();
125 cerr << "Loader Error (dlerror()) :" << sn << endl;
126 return;
127 }
128#endif
129}
130
131/* --Methode-- */
132PDynLinkMgr::~PDynLinkMgr()
133{
134#if defined(OSF1) || defined(Linux)
135if (dlhandle) dlclose(dlhandle); dlhandle = NULL;
136#endif
137if (copy) {
138 string cmd = "rm -f " + soName;
139 system(cmd.c_str());
140 }
141}
142
143/* --Methode-- */
144DlFunction PDynLinkMgr::GetFunction(string const & funcname)
145{
146DlFunction f = NULL;
147#if defined(OSF1) || defined(Linux)
148if (dlhandle != NULL)
149 f = (DlFunction)dlsym(dlhandle, funcname.c_str());
150#endif
151if (f == NULL) cerr << "PDynLinkMgr::PDynLinkMgr(): Error linking " << funcname << endl;
152return(f);
153}
154
Note: See TracBrowser for help on using the repository browser.