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

Last change on this file since 276 was 219, checked in by ansari, 26 years ago

Creation module DPC/SysTools Reza 09/04/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
79return(new PDynLinkMgr(fnameso, false));
80
81}
82
83/* --Methode-- */
84PDynLinkMgr::PDynLinkMgr(string& soname, bool cp)
85{
86dlhandle = NULL;
87soName = "";
88
89if (soname.find_last_of(".") > soname.length())
90#ifdef HPUX
91 soname += sofext_HPUX;
92#else
93 soname += sofext;
94#endif
95
96string fnameso;
97if (cp) {
98 numSO++;
99 char buff[32];
100#ifndef HPUX
101 sprintf(buff,"pdlmgr%d%s", numSO,sofext);
102#else
103 sprintf(buff,"pdlmgr%d%s", numSO,sofext_HPUX);
104#endif
105 fnameso = GetTmpDir()+buff;
106 string cmd = "cp " + soname + " " + fnameso;
107 int rc = system(cmd.c_str());
108 if (rc != 0) {
109 cerr << "PDynLinkMgr::PDynLinkMgr() Error Rc(" << cmd <<")= "<< rc << endl;
110 return;
111 }
112 }
113else fnameso = soname;
114copy = cp;
115soName = fnameso;
116
117#if defined(OSF1) || defined(Linux)
118dlhandle = dlopen(fnameso.c_str(), RTLD_NOW);
119if (dlhandle == NULL) {
120 cerr << "PDynLinkMgr::PDynLinkMgr(): Error opening SO " << fnameso
121 << " (" << soname << ")" << endl;
122 string sn = dlerror();
123 cerr << "Loader Error (dlerror()) :" << sn << endl;
124 return;
125 }
126#endif
127}
128
129/* --Methode-- */
130PDynLinkMgr::~PDynLinkMgr()
131{
132#if defined(OSF1) || defined(Linux)
133if (dlhandle) dlclose(dlhandle); dlhandle = NULL;
134#endif
135if (copy) {
136 string cmd = "rm " + soName;
137 system(cmd.c_str());
138 }
139}
140
141/* --Methode-- */
142DlFunction PDynLinkMgr::GetFunction(string const & funcname)
143{
144DlFunction f = NULL;
145#if defined(OSF1) || defined(Linux)
146if (dlhandle != NULL)
147 f = (DlFunction)dlsym(dlhandle, funcname.c_str());
148#endif
149if (f == NULL) cerr << "PDynLinkMgr::PDynLinkMgr(): Error linking " << funcname << endl;
150return(f);
151}
152
Note: See TracBrowser for help on using the repository browser.