⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 glua.c

📁 wifi 无线网络路由协议OLSR linux下C代码
💻 C
字号:
/* * The olsr.org Optimized Link-State Routing daemon (olsrd) * * Copyright (c) 2004, Thomas Lopatic (thomas@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met: * * * Redistributions of source code must retain the above copyright  *   notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright  *   notice, this list of conditions and the following disclaimer in  *   the documentation and/or other materials provided with the  *   distribution. * * Neither the name of olsr.org, olsrd nor the names of its  *   contributors may be used to endorse or promote products derived  *   from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE  * POSSIBILITY OF SUCH DAMAGE. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * * $Id: glua.c,v 1.4 2007/04/20 13:46:03 bernd67 Exp $ */#include "lua/lua.h"#include "lua/lauxlib.h"#include "lua/lualib.h"#include "link.h"#include "plugin.h"#include "lib.h"#include "os_unix.h"#include "http.h"#include "glua.h"#include "glua_ext.h"#include <stdio.h>#include <string.h>static const char infoKey;static const char keepFlagKey;static const char argListKey;    int lspToLua(const char *rootDir, const char *lspFileName,             const char *workDir, const char *luaFileName){  FILE *file;  int lspLen;  unsigned char *buff;  int start, code, i, k;  char *lspPath = fullPath(rootDir, lspFileName);  char *luaPath = fullPath(workDir, luaFileName);  if (fileIsNewer(lspPath, luaPath) == 0)  {    freeMem(lspPath);    freeMem(luaPath);    return 0;  }  file = fopen(lspPath, "r");  if (file == NULL)  {    error("cannot open %s\n", lspPath);    freeMem(lspPath);    freeMem(luaPath);    return -1;  }  if (fseek(file, 0, SEEK_END) < 0)  {    error("cannot seek to end of %s\n", lspPath);    fclose(file);    freeMem(lspPath);    freeMem(luaPath);    return -1;  }  lspLen = ftell(file);  if (lspLen < 0)  {    error("cannot determine length of %s\n", lspPath);    fclose(file);    freeMem(lspPath);    freeMem(luaPath);    return -1;  }  if (fseek(file, 0, SEEK_SET) < 0)  {    error("cannot seek to beginning of %s\n", lspPath);    fclose(file);    freeMem(lspPath);    freeMem(luaPath);    return -1;  }  buff = allocMem(lspLen);  if (fread(buff, lspLen, 1, file) != 1)  {    error("cannot read %s\n", lspPath);    fclose(file);    freeMem(lspPath);    freeMem(luaPath);    freeMem(buff);    return -1;  }  fclose(file);  if (createAllDirs(luaPath) < 0)  {    error("cannot create required directories for %s\n",          luaPath);    freeMem(lspPath);    freeMem(luaPath);    freeMem(buff);    return -1;  }  file = fopen(luaPath, "w");  if (file == NULL)  {    error("cannot open %s\n", luaPath);    freeMem(lspPath);    freeMem(luaPath);    freeMem(buff);    return -1;  }  start = 0;  code = 0;  i = 0;  for (;;)  {    if (code == 0 && (i == lspLen || strncmp((char *)(buff + i), "<?lua", 5) == 0))    {      fprintf(file, "tas.write(\"");      for (k = start; k < i; k++)      {        if (buff[k] == 13)          continue;        if (buff[k] == '\\' || buff[k] == '"' || buff[k] == 10)          fputc('\\', file);        fputc(buff[k], file);      }      fprintf(file, "\")\n");      if (i == lspLen)        break;      if (buff[i + 5] == '=')      {        i += 6;        code = 2;      }      else      {        i += 5;        code = 1;      }      start = i;      continue;    }    if (code > 0 && (i == lspLen || strncmp((char *)(buff + i), "?>", 2) == 0))    {      if (code > 1)        fprintf(file, "tas.write(");      for (k = start; k < i; k++)        if (buff[k] != 13)          fputc(buff[k], file);      if (code > 1)        fputc(')', file);      fputc('\n', file);      if (i == lspLen)        break;      i += 2;      start = i;      code = 0;      continue;    }    i++;  }  fclose(file);  freeMem(lspPath);  freeMem(luaPath);  freeMem(buff);  return 0;}static int luaWriter(lua_State *lua __attribute__((unused)), const void *buff, int len, FILE *file){  return fwrite(buff, len, 1, file) == 1;}int luaToLex(char **errMsg, const char *workDir, const char *luaFileName,             const char *lexFileName){  lua_State *lua;  int res;  FILE *file;  char *luaPath = fullPath(workDir, luaFileName);  char *lexPath = fullPath(workDir, lexFileName);  *errMsg = NULL;  if (fileIsNewer(luaPath, lexPath) == 0)  {    freeMem(luaPath);    freeMem(lexPath);    return 0;  }  lua = lua_open();  res = luaL_loadfile(lua, luaPath);  if (res != 0)  {    *errMsg = myStrdup(lua_tostring(lua, -1));    error("cannot load %s: %s\n", luaPath, *errMsg);    lua_close(lua);    freeMem(luaPath);    freeMem(lexPath);    return -1;  }  file = fopen(lexPath, "wb");  if (file == NULL)  {    error("cannot open %s\n", lexPath);    lua_close(lua);    freeMem(luaPath);    freeMem(lexPath);    return -1;  }  lua_dump(lua, (lua_Chunkwriter)luaWriter, file);  fclose(file);  lua_close(lua);  freeMem(luaPath);  freeMem(lexPath);  return 0;}static int tasWrite(lua_State *lua){  int numArg = lua_gettop(lua);  const char *strConv;  int i;  struct connInfo *info;  lua_pushlightuserdata(lua, (void *)&infoKey);  lua_gettable(lua, LUA_REGISTRYINDEX);  info = lua_touserdata(lua, -1);  lua_getglobal(lua, "tostring");  for (i = 1; i <= numArg; i++)  {    lua_pushvalue(lua, -1);    lua_pushvalue(lua, i);    lua_call(lua, 1, 1);    strConv = lua_tostring(lua, -1);    if (strConv == NULL)      return luaL_error(lua, "cannot convert value to string");    writeBuff(&info->write[2], (unsigned char *)strConv, strlen(strConv));    lua_pop(lua, 1);  }  return 0;}static int tasAddHeaderLine(lua_State *lua){  struct connInfo *info;  char *line;  lua_pushlightuserdata(lua, (void *)&infoKey);  lua_gettable(lua, LUA_REGISTRYINDEX);  info = lua_touserdata(lua, -1);  line = myStrdup(luaL_checkstring(lua, 1));  chomp(line, strlen(line));  writeBuff(&info->write[1], (unsigned char *)line, strlen(line));  writeBuff(&info->write[1], (unsigned char *)"\r\n", 2);  freeMem(line);  return 0;}static int tasSetContentType(lua_State *lua){  struct connInfo *info;  const char *contType;  lua_pushlightuserdata(lua, (void *)&infoKey);  lua_gettable(lua, LUA_REGISTRYINDEX);  info = lua_touserdata(lua, -1);  contType = luaL_checkstring(lua, 1);  info->contType = allocBuff(info, strlen(contType) + 1);  strcpy(info->contType, contType);  return 0;}static int tasKeepState(lua_State *lua){  int *keepFlag;  lua_pushlightuserdata(lua, (void *)&keepFlagKey);  lua_gettable(lua, LUA_REGISTRYINDEX);  keepFlag = lua_touserdata(lua, -1);  *keepFlag = 1;  return 0;}static int tasGetParameters(lua_State *lua){  int i;  char **argList;  lua_pushlightuserdata(lua, (void *)&argListKey);  lua_gettable(lua, LUA_REGISTRYINDEX);  argList = lua_touserdata(lua, -1);  lua_newtable(lua);  if (argList == NULL)    return 1;    for (i = 0; argList[i] != NULL; i += 2)  {    lua_pushstring(lua, argList[i]);    lua_pushstring(lua, argList[i + 1]);    lua_settable(lua, -3);  }  return 1;}static const struct luaL_reg tasLib[] ={  { "write", tasWrite },  { "set_content_type", tasSetContentType },  { "add_header_line", tasAddHeaderLine },  { "keep_state", tasKeepState },  { "get_parameters", tasGetParameters },#ifdef TAS_EXTRA_FUNCTIONS  TAS_EXTRA_FUNCTIONS#endif  { NULL, NULL }};static int luaopen_tas(lua_State *lua){  luaL_openlib(lua, "tas", tasLib, 0);  return 1;}int runLua(char **errMsg, struct connInfo *info, const char *workDir,           const char *lexFileName, char **argList, void **session){  lua_State *lua;  int res;  char *lexPath = fullPath(workDir, lexFileName);  int keepFlag = 0;  *errMsg = NULL;  if (*session == NULL)  {    lua = lua_open();    luaopen_base(lua);    luaopen_table(lua);    luaopen_io(lua);    luaopen_string(lua);    luaopen_math(lua);    luaopen_debug(lua);    luaopen_loadlib(lua);    luaopen_tas(lua);  }  else    lua = *session;  lua_pushlightuserdata(lua, (void *)&infoKey);  lua_pushlightuserdata(lua, (void *)info);  lua_settable(lua, LUA_REGISTRYINDEX);      lua_pushlightuserdata(lua, (void *)&argListKey);  lua_pushlightuserdata(lua, (void *)argList);  lua_settable(lua, LUA_REGISTRYINDEX);      lua_pushlightuserdata(lua, (void *)&keepFlagKey);  lua_pushlightuserdata(lua, (void *)&keepFlag);  lua_settable(lua, LUA_REGISTRYINDEX);  res = luaL_loadfile(lua, lexPath);  if (res != 0)  {    *errMsg = myStrdup(lua_tostring(lua, -1));    error("cannot load %s: %s\n", lexPath, *errMsg);    lua_close(lua);    freeMem(lexPath);    return -1;  }  res = lua_pcall(lua, 0, 0, 0);  if (res != 0)  {    *errMsg = myStrdup(lua_tostring(lua, -1));    error("cannot run %s: %s\n", lexPath, *errMsg);    lua_close(lua);    freeMem(lexPath);    return -1;  }  if (keepFlag == 0)  {    lua_close(lua);    *session = NULL;  }  else    *session = lua;  freeMem(lexPath);  return 0;}void freeLuaSession(void *session){  lua_close(session);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -