/*
Unix SMB/CIFS implementation.
- Standalone client for ESP scripting.
+ Standalone client for ejs scripting.
Copyright (C) Tim Potter <tpot@samba.org> 2005
+ Copyright (C) Andrew Tridgell 2005
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
*/
#include "includes.h"
-#include "web_server/ejs/ejs.h"
+#include "dynconfig.h"
+#include "lib/appweb/ejs/ejs.h"
+#include "lib/appweb/ejs/ejsInternal.h"
+#include "scripting/ejs/smbcalls.h"
-void http_exception(const char *reason)
+static EjsId eid;
+
+void ejs_exception(const char *reason)
{
- fprintf(stderr, "smbscript exception: %s", reason);
- exit(1);
+ Ejs *ep = ejsPtr(eid);
+ ejsSetErrorMsg(eid, "%s", reason);
+ fprintf(stderr, "%s", ep->error);
+ exit(127);
}
-static int writeProc(MprVarHandle userHandle, int argc, char **argv)
+ int main(int argc, const char **argv)
{
- int i;
+ EjsHandle handle = 0;
+ MprVar result;
+ char *emsg, *script;
+ size_t script_size;
+ TALLOC_CTX *mem_ctx = talloc_new(NULL);
+ const char **argv_list = NULL;
+ const char *fname;
+ struct MprVar *return_var;
+ int exit_status, i;
+
+ fault_setup(argv[0]);
+ smbscript_init_subsystems;
+ mprSetCtx(mem_ctx);
- mprAssert(argv);
- for (i = 0; i < argc; i++) {
- printf("%s", argv[i]);
+ lp_load();
+
+ if (argc < 2) {
+ fprintf(stderr, "You must supply a script name\n");
+ exit(1);
}
- return 0;
-}
- int main(int argc, const char *argv[])
-{
- EjsId eid;
- EjsHandle primary, alternate;
- MprVar result;
- char *emsg;
+ fname = argv[1];
- if (ejsOpen(0, 0, 0) != 0) {
+ if (ejsOpen(NULL, NULL, NULL) != 0) {
fprintf(stderr, "smbscript: ejsOpen(): unable to initialise "
"EJ subsystem\n");
- exit(1);
+ exit(127);
}
- ejsDefineStringCFunction(-1, "write", writeProc, NULL, 0);
+ smb_setup_ejs_functions();
- if ((eid = ejsOpenEngine(primary, alternate)) == (EjsId)-1) {
+ if ((eid = ejsOpenEngine(handle, 0)) == (EjsId)-1) {
fprintf(stderr, "smbscript: ejsOpenEngine(): unable to "
"initialise an EJS engine\n");
+ exit(127);
+ }
+
+ /* setup ARGV[] in the ejs environment */
+ for (i=1;argv[i];i++) {
+ argv_list = str_list_add(argv_list, argv[i]);
+ }
+ talloc_steal(mem_ctx, argv_list);
+ mprSetVar(ejsGetGlobalObject(eid), "ARGV", mprList("ARGV", argv_list));
+
+ /* load the script and advance past interpreter line*/
+ script = file_load(fname, &script_size, mem_ctx);
+
+ if (!script) {
+ fprintf(stderr, "Unable to load script from '%s'\n", fname);
exit(1);
}
- if (ejsEvalScript(0, "write(\"hello\n\");", &result, &emsg) == -1) {
+ /* allow scriptable js */
+ if (strncmp(script, "#!", 2) == 0) {
+ script += strcspn(script, "\r\n");
+ script += strspn(script, "\r\n");
+ }
+ /* and this copes with the ugly exec hack */
+ if (strncmp(script, "exec ", 5) == 0) {
+ script += strcspn(script, "\r\n");
+ script += strspn(script, "\r\n");
+ }
+
+ /* run the script */
+ if (ejsEvalScript(eid, script, &result, &emsg) == -1) {
fprintf(stderr, "smbscript: ejsEvalScript(): %s\n", emsg);
- exit(1);
+ exit(127);
}
+ return_var = ejsGetReturnValue(eid);
+ exit_status = mprVarToNumber(return_var);
+
ejsClose();
- return 0;
+ talloc_free(mem_ctx);
+
+ return exit_status;
}