[asterisk-commits] mnicholson: branch mnicholson/asttest r183687 - /team/mnicholson/asttest/astt...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Sun Mar 22 22:04:26 CDT 2009


Author: mnicholson
Date: Sun Mar 22 22:04:22 2009
New Revision: 183687

URL: http://svn.digium.com/svn-view/asterisk?view=rev&rev=183687
Log:
partially implemented asterisk:spawn()

Modified:
    team/mnicholson/asttest/asttest/lua/astlib.c

Modified: team/mnicholson/asttest/asttest/lua/astlib.c
URL: http://svn.digium.com/svn-view/asterisk/team/mnicholson/asttest/asttest/lua/astlib.c?view=diff&rev=183687&r1=183686&r2=183687
==============================================================================
--- team/mnicholson/asttest/asttest/lua/astlib.c (original)
+++ team/mnicholson/asttest/asttest/lua/astlib.c Sun Mar 22 22:04:22 2009
@@ -22,8 +22,150 @@
 
 #include "astlib_lua.h"
 
+#include <dirent.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+/*!
+ * \brief Recursively symlink and copy a directory.
+ * \param src the source directory
+ * \param dst the destination directory
+ *
+ * This function recursively creates symlinks to files in src in the dst
+ * directory.  It does not symlink directories and instead makes new
+ * directories in dst matching the corisponding dir in src.
+ *
+ * \note On error an error message is pushed onto the given lua stack.
+ *
+ * \retval 0 success
+ * \retval -1 error
+ */
+static int symlink_copy_dir(lua_State *L, const char *src, const char *dst) {
+	DIR *src_dir;
+	struct dirent *d;
+	char src_path[PATH_MAX], dst_path[PATH_MAX];
+	struct stat st;
+
+	if (!(src_dir = opendir(src))) {
+		lua_pushstring(L, "error opening dir '");
+		lua_pushstring(L, src);
+		lua_pushstring(L, "': ");
+		lua_pushstring(L, strerror(errno));
+		lua_concat(L, 4);
+		goto e_return;
+	}
+
+	while ((d = readdir(src_dir))) {
+		snprintf(src_path, sizeof(src_path), "%s/%s", src, d->d_name);
+		snprintf(dst_path, sizeof(dst_path), "%s/%s", dst, d->d_name);
+
+		if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, "..")) {
+			continue;
+		}
+
+		if (stat(src_path, &st)) {
+			lua_pushstring(L, "error with stat for '");
+			lua_pushstring(L, src_path);
+			lua_pushstring(L, "': ");
+			lua_pushstring(L, strerror(errno));
+			lua_concat(L, 4);
+			goto e_closedir;
+		}
+
+		if (S_ISDIR(st.st_mode)) {
+			if (mkdir(dst_path, st.st_mode)) {
+				lua_pushstring(L, "error creating dir '");
+				lua_pushstring(L, dst_path);
+				lua_pushstring(L, "': ");
+				lua_pushstring(L, strerror(errno));
+				lua_concat(L, 4);
+				goto e_closedir;
+			}
+
+			if (symlink_copy_dir(L, src_path, dst_path)) {
+				goto e_closedir;
+			}
+		} else if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
+			if (symlink(src_path, dst_path)) {
+				lua_pushstring(L, "error symlink '");
+				lua_pushstring(L, dst_path);
+				lua_pushstring(L, "': ");
+				lua_pushstring(L, strerror(errno));
+				lua_concat(L, 4);
+				goto e_closedir;
+			}
+		} else {
+			/* unsupported file type */
+			lua_pushstring(L, "unsupported file type");
+			return lua_error(L);
+			lua_pushstring(L, "don't know how to symlink '");
+			lua_pushstring(L, src_path);
+			lua_pushstring(L, "'");
+			lua_concat(L, 3);
+			goto e_closedir;
+		}
+	}
+
+	closedir(src_dir);
+	return 0;
+
+e_closedir:
+	closedir(src_dir);
+e_return:
+	return -1;
+}
+
 static int spawn_asterisk(lua_State *L) {
-	return 1;
+	int asterisk_count;
+	const char *asterisk_path;
+	char dir_path[PATH_MAX];
+	mode_t dir_mode = S_IRWXU | S_IRGRP| S_IXGRP| S_IROTH | S_IXOTH;
+
+	/* get the index for this instance */
+	lua_getfield(L, LUA_REGISTRYINDEX, "astlib_count");
+	asterisk_count = lua_tointeger(L, -1);
+
+	/* increment the count */
+	lua_pushinteger(L, asterisk_count + 1);
+	lua_setfield(L, LUA_REGISTRYINDEX, "astlib_count");
+	lua_pop(L, 1);
+
+	lua_getfield(L, LUA_REGISTRYINDEX, "astlib_path");
+	asterisk_path = lua_tostring(L, -1);
+
+	snprintf(dir_path, sizeof(dir_path), "tmp/ast%d", asterisk_count);
+	if (mkdir("tmp", dir_mode) && errno != EEXIST) {
+		lua_pop(L, 1); /* remove the astlib_path */
+		lua_pushstring(L, "error creating tmp directory while spawning asterisk: ");
+		lua_pushstring(L, strerror(errno));
+		lua_concat(L, 2);
+		return lua_error(L);
+	}
+
+	if (mkdir(dir_path, dir_mode)) {
+		lua_pop(L, 1); /* remove the astlib_path */
+		lua_pushstring(L, "error spawning asterisk, unable to create working dir (");
+		lua_pushstring(L, dir_path);
+		lua_pushstring(L, "): ");
+		lua_pushstring(L, strerror(errno));
+		lua_concat(L, 4);
+		return lua_error(L);
+	}
+
+	if (symlink_copy_dir(L, asterisk_path, dir_path)) {
+		lua_remove(L, -2); /* remove the astlib_path */
+		lua_pushstring(L, "\nerror initilizing working environment");
+		lua_concat(L, 2);
+		return lua_error(L);
+	}
+
+	lua_pop(L, 1); /* remove the astlib_path */
+
+	/* XXX now start asterisk */
+	return 0;
 }
 
 static luaL_Reg astlib[] = {
@@ -41,6 +183,9 @@
 	/* set up some registry values */
 	lua_pushstring(L, asterisk_path);
 	lua_setfield(L, LUA_REGISTRYINDEX, "astlib_path");
+
+	lua_pushinteger(L, 1);
+	lua_setfield(L, LUA_REGISTRYINDEX, "astlib_count");
 
 	/* register our functions */
 	luaL_register(L, "ast", astlib);




More information about the asterisk-commits mailing list