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

Last change on this file since 635 was 480, checked in by ansari, 26 years ago

MAJ / PEIDA 3.8 , Reza 20/10/99

File size: 5.0 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;
25#if defined(OSF1) || defined(Linux) || defined(SunOS)
26 string cmd = "LD_LIBRARY_PATH=";
27 char* varenv=NULL;
28 varenv=getenv("LD_LIBRARY_PATH");
29#elif defined(IRIX64)
30 string cmd = "LD_LIBRARYN32_PATH=";
31 char* varenv=NULL;
32 varenv=getenv("LD_LIBRARYN32_PATH");
33
34 if (varenv == NULL) {
35 cmd += '.';
36 if (path.length() > 0) cmd += ':' + path;
37 }
38 else {
39 if (varenv[0] != '.') cmd += ".:";
40 if (path.length() > 0) cmd += path + ':';
41 cmd += varenv;
42 putenv(cmd.c_str());
43 }
44#elif defined(AIX)
45 string cmd = "LIBPATH=";
46 char* varenv=NULL;
47 varenv=getenv("LIBPATH");
48 if (varenv == NULL) {
49 cmd += '.';
50 if (path.length() > 0) cmd += ':' + path;
51 cmd += ":/usr/lib:/lib";
52 }
53 else {
54 if (varenv[0] != '.') cmd += ".:";
55 if (path.length() > 0) cmd += path + ':';
56 cmd += varenv;
57 putenv(const_cast<char *>(cmd.c_str()));
58 }
59
60#endif
61return;
62}
63
64/* --Methode-Static-- */
65string& PDynLinkMgr::GetTmpDir()
66{
67if (tmpDir == NULL) {
68 tmpDir = new string("");
69 char* varenv;
70 if ( (varenv=getenv("PEIDA_TMP")) != NULL ) *tmpDir = varenv;
71 else if ( (varenv=getenv("TMPDIR")) != NULL ) *tmpDir = varenv;
72 }
73return(*tmpDir);
74}
75
76/* --Methode-Static-- */
77PDynLinkMgr* PDynLinkMgr::BuildFromCFile(string const & fname)
78{
79size_t l = fname.length();
80if (l < 1) return(NULL);
81string fnameobj = GetTmpDir()+"tmp_pdl.o";
82
83string cmd;
84int rc;
85
86// Compilation du fichier
87#ifndef __mac__
88cmd = "cc -c -o " + fnameobj + " " + fname;
89#else
90cmd = "Il faut compiler !!!" + fnameobj + " " + fname;
91#endif
92rc = system(cmd.c_str());
93if (rc != 0) {
94 cerr << "PDynLinkMgr::BuildFromCFile() Error Rc(" << cmd <<")= "<< rc << endl;
95 return(NULL);
96 }
97
98char buff[32];
99numSO++;
100#ifndef HPUX
101sprintf(buff,"pdlmgr%d%s", numSO,sofext);
102#endif
103string fnameso = GetTmpDir()+buff;
104
105// Creation du shared-lib
106#if defined(OSF1)
107 cmd = "ld -shared -o " + fnameso + " -all " + fnameobj + " -none -lm -lc";
108#elif defined(Linux)
109 cmd = "ld -shared -o " + fnameso + " " + fnameobj + " -lm -lc";
110#elif defined(SunOS)
111 cmd = "ld -G -o " + fnameso + " " + fnameobj + " -lm -lc";
112#elif defined(IRIX64)
113 cmd = "ld -shared -o " + fnameso + " " + fnameobj + " -lm -lc";
114#elif defined(AIX)
115 cmd = "ld -G -bnogc -bexpall -bM:1L -o " + fnameso + " " + fnameobj;
116#elif defined(HPUX)
117 cmd = "ld -b -o " + fnameso + " " + fnameobj + " -lm -lc";
118#else
119 cmd = "ld -o " + fnameso + " " + fnameobj + " -lm -lc";
120#endif
121rc = system(cmd.c_str());
122if (rc != 0) {
123 cerr << "PDynLinkMgr::BuildFromCFile() Error Rc(" << cmd <<")= "<< rc << endl;
124 return(NULL);
125 }
126PDynLinkMgr* rdyn = new PDynLinkMgr(fnameso, false);
127rdyn->copy = true;
128return(rdyn);
129
130}
131
132/* --Methode-- */
133PDynLinkMgr::PDynLinkMgr(string& soname, bool cp)
134{
135dlhandle = NULL;
136soName = "";
137
138if (soname.find_last_of(".") > soname.length())
139#ifdef HPUX
140 soname += sofext_HPUX;
141#else
142 soname += sofext;
143#endif
144
145string fnameso;
146if (cp) {
147 numSO++;
148 char buff[32];
149#ifndef HPUX
150 sprintf(buff,"pdlmgr%d%s", numSO,sofext);
151#else
152 sprintf(buff,"pdlmgr%d%s", numSO,sofext_HPUX);
153#endif
154 fnameso = GetTmpDir()+buff;
155 string cmd = "cp " + soname + " " + fnameso;
156 int rc = system(cmd.c_str());
157 if (rc != 0) {
158 cerr << "PDynLinkMgr::PDynLinkMgr() Error Rc(" << cmd <<")= "<< rc << endl;
159 return;
160 }
161 }
162else fnameso = soname;
163copy = cp;
164soName = fnameso;
165
166#if defined(HPUX)
167dlhandle = NULL;
168cerr << "PDynLinkMgr::PDynLinkMgr() Not yet available on HP-UX " << endl;
169return;
170#else
171dlhandle = dlopen(fnameso.c_str(), RTLD_NOW);
172if (dlhandle == NULL) {
173 cerr << "PDynLinkMgr::PDynLinkMgr(): Error opening SO " << fnameso
174 << " (" << soname << ")" << endl;
175 string sn = dlerror();
176 cerr << "Loader Error (dlerror()) :" << sn << endl;
177 return;
178 }
179#endif
180}
181
182/* --Methode-- */
183PDynLinkMgr::~PDynLinkMgr()
184{
185#if defined(HPUX)
186cerr << "PDynLinkMgr::~PDynLinkMgr() Not yet available on HP-UX " << endl;
187return;
188#else
189if (dlhandle) dlclose(dlhandle); dlhandle = NULL;
190if (copy) {
191 string cmd = "rm -f " + soName;
192 system(cmd.c_str());
193 }
194#endif
195}
196
197/* --Methode-- */
198DlFunction PDynLinkMgr::GetFunction(string const & funcname)
199{
200DlFunction f = NULL;
201#if defined(HPUX)
202cerr << "PDynLinkMgr::GetFunction() Not yet available on HP-UX " << endl;
203return f;
204#else
205if (dlhandle != NULL)
206 f = (DlFunction)dlsym(dlhandle, funcname.c_str());
207if (f == NULL) cerr << "PDynLinkMgr::GetFunction(): Error linking " << funcname << endl;
208return(f);
209#endif
210}
211
Note: See TracBrowser for help on using the repository browser.