~ubuntu-branches/ubuntu/karmic/grace/karmic

« back to all changes in this revision

Viewing changes to arch/os2/dlfcn.c

  • Committer: Bazaar Package Importer
  • Author(s): Torsten Werner
  • Date: 2002-03-19 14:19:58 UTC
  • Revision ID: james.westby@ubuntu.com-20020319141958-5gxna6vo1ek3zjml
Tags: upstream-5.1.7
ImportĀ upstreamĀ versionĀ 5.1.7

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* $Id: dlfcn.c,v 1.3 1999/12/30 22:08:15 fnevgeny Exp $    */
 
2
/* dlfcn.c */ 
 
3
/*    Implementation of dlopen() interface for OS/2             */
 
4
/*    This code is released into public domain                  */
 
5
 
 
6
 
 
7
#include <stdlib.h>
 
8
#include <stdio.h>
 
9
#include <string.h>
 
10
 
 
11
/* We only need parts of the whole OS/2-specific stuff */
 
12
#define INCL_DOSMODULEMGR     /* Module Manager values */
 
13
#define INCL_DOSERRORS        /* Error values */
 
14
#include <os2.h>
 
15
 
 
16
/* to get constants and check prototypes */
 
17
#include "dlfcn.h"
 
18
 
 
19
#define LM_LENGTH  256
 
20
#define MAXDLLOPEN 256
 
21
 
 
22
static int LoadErrorFlag    = FALSE;
 
23
UCHAR LoadError[LM_LENGTH]  = "";     /* this is being referenced from outside
 
24
                                         this module */
 
25
 
 
26
 
 
27
void *dlopen( const char *filename, int flag)
 
28
 
 
29
{
 
30
  HMODULE DLLHandle;
 
31
  APIRET rc;
 
32
 
 
33
  rc = DosLoadModule( LoadError,
 
34
                      LM_LENGTH-1,
 
35
                      filename,
 
36
                      &DLLHandle);
 
37
  if (rc != NO_ERROR)
 
38
   {
 
39
    sprintf(LoadError,
 
40
            "DosLoadModule(\"%s\") = %lu\n", filename, rc);
 
41
    LoadErrorFlag = TRUE;
 
42
    return NULL;
 
43
    } else {
 
44
    LoadErrorFlag = FALSE;
 
45
    return (void*)DLLHandle;
 
46
   }
 
47
}
 
48
 
 
49
 
 
50
char *dlerror(void)
 
51
{
 
52
 
 
53
  if (!LoadErrorFlag) {
 
54
    return (char *)NULL;
 
55
    }
 
56
  else {
 
57
    LoadErrorFlag = FALSE;
 
58
    return LoadError;
 
59
    }
 
60
}
 
61
 
 
62
 
 
63
void *dlsym(void *handle, char *symbol)
 
64
{
 
65
 
 
66
  APIRET rc;  
 
67
  PFN FuncAddress;
 
68
  
 
69
  rc = DosQueryProcAddr( (HMODULE) handle,
 
70
                             0L,
 
71
                             symbol,
 
72
                             &FuncAddress);
 
73
  if (rc != NO_ERROR)
 
74
   {
 
75
    switch (rc)
 
76
      {
 
77
       case ERROR_INVALID_HANDLE:
 
78
        {
 
79
         sprintf(LoadError,
 
80
                "DosQueryProcAddr(\"%s\")=ERROR_INVALID_HANDLE (%lu)\n",
 
81
                 symbol, rc);
 
82
          break;
 
83
         }
 
84
       case ERROR_ENTRY_IS_CALLGATE:
 
85
        {
 
86
         sprintf(LoadError,
 
87
                "DosQueryProcAddr(\"%s\")=ERROR_INVALID_HANDLE (%lu)\n",
 
88
                 symbol, rc);
 
89
          break;
 
90
         }
 
91
       default:
 
92
        {
 
93
         sprintf(LoadError,
 
94
                "DosQueryProcAddr(\"%s\")=%lu\n", symbol, rc);
 
95
          break;
 
96
         }
 
97
       } /* end switch(rc) */
 
98
 
 
99
    LoadErrorFlag = TRUE;
 
100
    return NULL;
 
101
   } else {
 
102
    LoadErrorFlag = FALSE;
 
103
    return (void*)FuncAddress;
 
104
   }
 
105
}
 
106
 
 
107
 
 
108
int dlclose( void *handle )
 
109
 
 
110
{
 
111
  APIRET rc;
 
112
 
 
113
  rc = DosFreeModule( (HMODULE)handle );
 
114
  if (rc != NO_ERROR)
 
115
    {
 
116
     sprintf(LoadError,
 
117
            "DosFreeModule()=%lu\n", rc);
 
118
     LoadErrorFlag = TRUE;
 
119
     return 2;
 
120
   } else {
 
121
    LoadErrorFlag = FALSE;
 
122
    return 0;
 
123
   }
 
124
}