Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libpz/pzlib.c
1808 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1998-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* *
19
***********************************************************************/
20
#pragma prototyped
21
22
/*
23
* find and load a pzip dll
24
*/
25
26
#include "pzlib.h"
27
28
#include <dlldefs.h>
29
30
int
31
pzlib(register Pz_t* pz, register const char* name, int ignore)
32
{
33
register Pzdll_t* dll;
34
register Pzdllpz_t* pzs;
35
char* id;
36
char buf[64];
37
char path[PATH_MAX];
38
39
if (id = strrchr(state.id, ':'))
40
id++;
41
else
42
id = (char*)state.id;
43
44
/*
45
* see if the dll is already loaded
46
*/
47
48
for (dll = state.dll; dll && !streq(dll->name, name); dll = dll->next);
49
if (!dll)
50
{
51
/*
52
* add to the list and open
53
*/
54
55
if (!(dll = newof(0, Pzdll_t, 1, strlen(name) + 1)))
56
return -1;
57
dll->name = strcpy((char*)(dll + 1), name);
58
dll->next = state.dll;
59
state.dll = dll;
60
if (ignore)
61
return 0;
62
if (!(dll->dll = dllplugin(id, dll->name, NiL, PZ_PLUGIN_VERSION, NiL, RTLD_LAZY, path, sizeof(path))))
63
{
64
if (pz->disc && pz->disc->errorf)
65
(*pz->disc->errorf)(pz, pz->disc, ERROR_SYSTEM|2, "%s: %s", dll->name, dlerror());
66
return -1;
67
}
68
69
/*
70
* get the initialization function
71
*/
72
73
sfsprintf(buf, sizeof(buf), "%s_init", id);
74
if (!(dll->initf = (Pzinit_f)dlllook(dll->dll, buf)))
75
{
76
if (pz->disc && pz->disc->errorf)
77
(*pz->disc->errorf)(pz, pz->disc, 2, "%s: %s: initialization function not found in library", path, buf);
78
return -1;
79
}
80
}
81
82
/*
83
* see if pz already initialized
84
*/
85
86
if (dll->initf)
87
{
88
for (pzs = dll->pzs; pzs && pzs->pz != pz; pzs = pzs->next);
89
if (!pzs)
90
{
91
if (!(pzs = newof(0, Pzdllpz_t, 1, 0)))
92
return -1;
93
pzs->pz = pz;
94
pzs->next = dll->pzs;
95
dll->pzs = pzs;
96
if (!(dll->usage = pzinit(pz, dll->name, dll->initf)))
97
return -1;
98
}
99
}
100
return 0;
101
}
102
103