Jelajahi Sumber

Call Lua using the official interface in main

bel 10 tahun lalu
induk
melakukan
094b2fde7c
1 mengubah file dengan 69 tambahan dan 18 penghapusan
  1. 69 18
      src/main.c

+ 69 - 18
src/main.c

@@ -160,22 +160,28 @@ static void die(const char *fmt, ...)
 static int MakeConsole();
 #endif
 
-static void show_usage_and_exit(const char *exeName)
+static void show_server_name(void)
 {
-    const struct mg_option *options;
-    int i;
-
 #ifdef WIN32
     MakeConsole();
 #endif
 
+    fprintf(stderr, "CivetWeb v%s, built on %s\n",
+            mg_version(), __DATE__);
+}
+
+static void show_usage_and_exit(const char *exeName)
+{
+    const struct mg_option *options;
+    int i;
+
     if (exeName==0 || *exeName==0) {
         exeName = "civetweb";
     }
 
-    fprintf(stderr, "Civetweb v%s, built on %s\n",
-            mg_version(), __DATE__);
-    fprintf(stderr, "Usage:\n");
+    show_server_name();
+
+    fprintf(stderr, "\nUsage:\n");
     fprintf(stderr, "  Start server with a set of options:\n");
     fprintf(stderr, "    %s [config_file]\n", exeName);
     fprintf(stderr, "    %s [-option value ...]\n", exeName);
@@ -583,12 +589,53 @@ static void set_absolute_path(char *options[], const char *option_name,
 
 
 #ifdef USE_LUA
-#define main luatest_main
-#define luaL_openlibs lua_civet_open_all_libs
-struct lua_State;
-extern void lua_civet_open_all_libs(struct lua_State *L);
-#include "../src/third_party/lua-5.2.4/src/lua.c"
-#undef main
+#include "lua.h"
+#include "lauxlib.h"
+extern void lua_civet_open_all_libs(lua_State *L);
+
+int run_lua(const char *file_name)
+{
+    struct lua_State * L;
+    int lua_ret;
+    int func_ret = EXIT_FAILURE;
+    const char * lua_err_txt;
+
+#ifdef WIN32
+    MakeConsole();
+#endif
+
+    L = luaL_newstate();
+    if (L == NULL) {
+        fprintf(stderr, "Error: Cannot create Lua state\n");
+        return EXIT_FAILURE;
+    }
+    lua_civet_open_all_libs(L);
+
+    lua_ret = luaL_loadfile(L, file_name);
+    if (lua_ret != LUA_OK) {
+        /* Error when loading the file (e.g. file not found, out of memory, ...) */
+        lua_err_txt = lua_tostring(L, -1);
+        fprintf(stderr, "Error loading file %s: %s\n", file_name, lua_err_txt);
+    } else {
+        /* The script file is loaded, now call it */
+        lua_ret = lua_pcall(L, /* no arguments */ 0, /* zero or one return value */ 1, /* errors as strint return value */ 0);
+        if (lua_ret != LUA_OK) {
+            /* Error when executing the script */
+            lua_err_txt = lua_tostring(L, -1);
+            fprintf(stderr, "Error running file %s: %s\n", file_name, lua_err_txt);
+        } else {
+            /* Script executed */
+            if (lua_type(L, -1) == LUA_TNUMBER) {
+                func_ret = (int)lua_tonumber(L, -1);
+            } else {
+                func_ret = EXIT_SUCCESS;
+            }
+        }
+    }
+    lua_close(L);
+
+    return func_ret;
+}
 #endif
 
 
@@ -618,13 +665,17 @@ static void start_civetweb(int argc, char *argv[])
 
     /* Call Lua with additional Civetweb specific Lua functions, if -L option is specified */
     if (argc > 1 && !strcmp(argv[1], "-L")) {
-#ifdef WIN32
-        MakeConsole();
-#endif
+
 #ifdef USE_LUA
-        exit(luatest_main(argc-1, &argv[1]));
-#endif
+        if (argc != 3) {
+            show_usage_and_exit(argv[0]);
+        }
+        exit(run_lua(argv[2]));
+#else
+        show_server_name();
+        fprintf(stderr, "\nError: Lua support not enabled\n");
         exit(EXIT_FAILURE);
+#endif
     }
 
     /* Show usage if -h or --help options are specified */