summaryrefslogtreecommitdiffstats
path: root/contrib/syslinux-4.02/com32/lua/src/pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/syslinux-4.02/com32/lua/src/pci.c')
-rw-r--r--contrib/syslinux-4.02/com32/lua/src/pci.c183
1 files changed, 183 insertions, 0 deletions
diff --git a/contrib/syslinux-4.02/com32/lua/src/pci.c b/contrib/syslinux-4.02/com32/lua/src/pci.c
new file mode 100644
index 0000000..b9c1605
--- /dev/null
+++ b/contrib/syslinux-4.02/com32/lua/src/pci.c
@@ -0,0 +1,183 @@
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define lpcilib_c /* Define the library */
+
+#include "lua.h"
+#include "lauxlib.h"
+#include "lualib.h"
+#include <sys/pci.h>
+
+
+static int pci_getinfo(lua_State *L)
+{
+ struct pci_domain *pci_domain;
+ struct pci_device *pci_device;
+ int pci_dev = 1;
+
+ pci_domain = pci_scan();
+
+ lua_newtable(L); /* list of busses */
+
+ for_each_pci_func(pci_device, pci_domain) {
+ lua_pushnumber(L, pci_dev++);
+
+ lua_newtable(L); /* device infos */
+
+ lua_pushstring(L, "bus");
+ lua_pushnumber(L, __pci_bus);
+ lua_settable(L,-3);
+
+ lua_pushstring(L, "slot");
+ lua_pushnumber(L, __pci_slot);
+ lua_settable(L,-3);
+
+ lua_pushstring(L, "func");
+ lua_pushnumber(L, __pci_func);
+ lua_settable(L,-3);
+
+ lua_pushstring(L, "vendor");
+ lua_pushnumber(L, pci_device->vendor);
+ lua_settable(L,-3);
+
+ lua_pushstring(L, "product");
+ lua_pushnumber(L, pci_device->product);
+ lua_settable(L,-3);
+
+ lua_pushstring(L, "sub_vendor");
+ lua_pushnumber(L, pci_device->sub_vendor);
+ lua_settable(L,-3);
+
+ lua_pushstring(L, "sub_product");
+ lua_pushnumber(L, pci_device->sub_product);
+ lua_settable(L,-3);
+
+ lua_settable(L,-3); /* end device infos */
+ }
+
+ return 1;
+}
+
+/* searching the next char that is not a space */
+static char *skipspace(char *p)
+{
+ while (*p && *p <= ' ')
+ p++;
+
+ return p;
+}
+
+/* removing any \n found in a string */
+static void remove_eol(char *string)
+{
+ int j = strlen(string);
+ int i = 0;
+ for(i = 0; i < j; i++) if(string[i] == '\n') string[i] = 0;
+}
+
+
+/* Try to match any pci device to the appropriate kernel module */
+/* it uses the modules.pcimap from the boot device*/
+static int pci_getidlist(lua_State *L)
+{
+ const char *pciidfile;
+ char line[1024];
+ char vendor[255];
+ char vendor_id[5];
+ char product[255];
+ char productvendor[9];
+ char productvendorsub[17];
+ FILE *f;
+
+ if (lua_gettop(L) == 1) {
+ pciidfile = luaL_checkstring(L, 1);
+ } else {
+ pciidfile = "pci.ids";
+ }
+
+ lua_newtable(L); /* list of vendors */
+
+ /* Opening the pci.ids from the boot device*/
+ f=fopen(pciidfile,"r");
+ if (!f)
+ return -1;
+
+ /* for each line we found in the pci.ids*/
+ while ( fgets(line, sizeof line, f) ) {
+ /* Skipping uncessary lines */
+ if ((line[0] == '#') || (line[0] == ' ') || (line[0] == 'C') ||
+ (line[0] == 10))
+ continue;
+
+ /* If the line doesn't start with a tab, it means that's a vendor id */
+ if (line[0] != '\t') {
+
+ /* the 4th first chars are the vendor_id */
+ strlcpy(vendor_id,line,4);
+
+ /* the vendor name is the next field*/
+ vendor_id[4]=0;
+ strlcpy(vendor,skipspace(strstr(line," ")),255);
+ remove_eol(vendor);
+
+ /* ffff is an invalid vendor id */
+ if (strstr(vendor_id,"ffff")) break;
+
+ lua_pushstring(L, vendor_id);
+ lua_pushstring(L, vendor);
+ lua_settable(L,-3);
+
+ /* if we have a tab + a char, it means this is a product id */
+ } else if ((line[0] == '\t') && (line[1] != '\t')) {
+
+ /* the product name the second field */
+ strlcpy(product,skipspace(strstr(line," ")),255);
+ remove_eol(product);
+
+ /* the 4th first chars are the vendor_id */
+ strlcpy(productvendor,vendor_id,4);
+ /* the product id is first field */
+ strlcpy(productvendor+4,&line[1],4);
+ productvendor[8]=0;
+
+ lua_pushstring(L, productvendor);
+ lua_pushstring(L, product);
+ lua_settable(L,-3);
+
+ /* if we have two tabs, it means this is a sub product */
+ } else if ((line[0] == '\t') && (line[1] == '\t')) {
+
+ /* the product name is last field */
+ strlcpy(product,skipspace(strstr(line," ")),255);
+ strlcpy(product,skipspace(strstr(product," ")),255);
+ remove_eol(product);
+
+ strlcpy(productvendorsub, productvendor,8);
+ strlcpy(productvendorsub+8, &line[2],4);
+ strlcpy(productvendorsub+12, &line[7],4);
+ productvendorsub[16]=0;
+
+ lua_pushstring(L, productvendorsub);
+ lua_pushstring(L, product);
+ lua_settable(L,-3);
+
+ }
+ }
+ fclose(f);
+ return(1);
+}
+
+static const luaL_reg pcilib[] = {
+ {"getinfo", pci_getinfo},
+ {"getidlist", pci_getidlist},
+ {NULL, NULL}
+};
+
+/* This defines a function that opens up your library. */
+
+LUALIB_API int luaopen_pci (lua_State *L) {
+ luaL_openlib(L, LUA_PCILIBNAME, pcilib, 0);
+ return 1;
+}
+