author | Rich Burridge <rich.burridge@oracle.com> |
Mon, 22 Sep 2014 08:30:56 -0700 | |
changeset 2104 | 72ce614559ff |
permissions | -rw-r--r-- |
2104
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
1 |
When looking for lua shared objects, dynamically adjust the pathnames to |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
2 |
include "64/", when running a 64-bit lua executable. |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
3 |
|
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
4 |
For example: |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
5 |
/usr/lib/lua/5.2/gv.so |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
6 |
becomes: |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
7 |
/usr/lib/lua/5.2/64/gv.so |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
8 |
|
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
9 |
The lua maintainers are not interested in this patch. |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
10 |
|
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
11 |
--- src/loadlib.c.orig 2014-09-19 06:57:40.032464104 -0700 |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
12 |
+++ src/loadlib.c 2014-09-19 16:39:01.502592411 -0700 |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
13 |
@@ -346,29 +346,94 @@ |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
14 |
} |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
15 |
|
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
16 |
|
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
17 |
+/* |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
18 |
+** Return 1 if template is a shared object (has an extension of ".so"), |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
19 |
+** otherwise 0. |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
20 |
+*/ |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
21 |
+static int |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
22 |
+issharedobj(const char *template) { |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
23 |
+ const char *ext; |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
24 |
+ if (strlen(template) < 3) |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
25 |
+ return 0; |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
26 |
+ ext = template + strlen(template) - 3; |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
27 |
+ return strcmp(ext, ".so") == 0; |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
28 |
+} |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
29 |
+ |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
30 |
+/* |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
31 |
+** Return 1 if this is a 64-bit executable, otherwise 0. |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
32 |
+*/ |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
33 |
+static int is64bit() { |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
34 |
+ return sizeof(void *) == 8; |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
35 |
+} |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
36 |
+ |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
37 |
static const char *searchpath (lua_State *L, const char *name, |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
38 |
const char *path, |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
39 |
const char *sep, |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
40 |
const char *dirsep) { |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
41 |
luaL_Buffer msg; /* to build error message */ |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
42 |
+ char *name64; |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
43 |
luaL_buffinit(L, &msg); |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
44 |
if (*sep != '\0') /* non-empty separator? */ |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
45 |
name = luaL_gsub(L, name, sep, dirsep); /* replace it by 'dirsep' */ |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
46 |
+ if (is64bit()) { |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
47 |
+ name64 = calloc(strlen(name) + 4, 1); |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
48 |
+ strcpy(name64, "64/"); |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
49 |
+ strcat(name64, name); |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
50 |
+ } else |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
51 |
+ name64 = strdup(name); |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
52 |
while ((path = pushnexttemplate(L, path)) != NULL) { |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
53 |
- const char *filename = luaL_gsub(L, lua_tostring(L, -1), |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
54 |
- LUA_PATH_MARK, name); |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
55 |
+ char *filename; |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
56 |
+ const char *item = lua_tostring(L, -1); |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
57 |
+ |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
58 |
+ if (is64bit() && issharedobj(item)) { |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
59 |
+ name = name64; |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
60 |
+ if (strstr(item, LUA_PATH_MARK)) |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
61 |
+ filename = (char *)luaL_gsub(L, item, LUA_PATH_MARK, name); |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
62 |
+ else { |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
63 |
+ /* |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
64 |
+ * There's nothing to substitute, so we have to go digging through the |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
65 |
+ * path to find where to put the 64-bit directory. Search for "/" in |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
66 |
+ * the template element until we can't find any more, replace that with |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
67 |
+ * "?", and replace that with "/64/". |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
68 |
+ */ |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
69 |
+ char *p1, *p2; |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
70 |
+ char *s = strdup(item); |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
71 |
+ for (p1 = s; p1; p1 = strstr(p1 + 1, "/")) |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
72 |
+ p2 = p1; |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
73 |
+ if (p2 != s) |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
74 |
+ *p2 = '?'; |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
75 |
+ else { |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
76 |
+ /* |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
77 |
+ * We didn't find any slashes; that either means there aren't any, or |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
78 |
+ * item is in the root directory. |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
79 |
+ */ |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
80 |
+ free(s); |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
81 |
+ s = calloc(strlen(item) + 3, 1); |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
82 |
+ if (item[0] == '/') |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
83 |
+ strcpy(s, "/64"); |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
84 |
+ else |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
85 |
+ strcpy(s, "64/"); |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
86 |
+ strcat(s, item); |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
87 |
+ } |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
88 |
+ filename = (char *)luaL_gsub(L, s, LUA_PATH_MARK, "/64/"); |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
89 |
+ free(s); |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
90 |
+ } |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
91 |
+ } else |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
92 |
+ filename = (char *)luaL_gsub(L, item, LUA_PATH_MARK, name); |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
93 |
lua_remove(L, -2); /* remove path template */ |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
94 |
- if (readable(filename)) /* does file exist and is readable? */ |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
95 |
+ if (readable(filename)) { /* does file exist and is readable? */ |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
96 |
+ free(name64); |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
97 |
return filename; /* return that file name */ |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
98 |
+ } |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
99 |
lua_pushfstring(L, "\n\tno file " LUA_QS, filename); |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
100 |
lua_remove(L, -2); /* remove file name */ |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
101 |
luaL_addvalue(&msg); /* concatenate error msg. entry */ |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
102 |
} |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
103 |
luaL_pushresult(&msg); /* create error message */ |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
104 |
+ free(name64); |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
105 |
return NULL; /* not found */ |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
106 |
} |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
107 |
|
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
108 |
- |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
109 |
static int ll_searchpath (lua_State *L) { |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
110 |
const char *f = searchpath(L, luaL_checkstring(L, 1), |
72ce614559ff
19065730 64-bit lua doesn't have a separate path to find native modules
Rich Burridge <rich.burridge@oracle.com>
parents:
diff
changeset
|
111 |
luaL_checkstring(L, 2), |