r19339: Merge my 4.0-unittest branch. This adds an API for more fine-grained
[gd/samba-autobuild/.git] / source4 / scripting / ejs / smbscript.c
1 /* 
2    Unix SMB/CIFS implementation.
3
4    Standalone client for ejs scripting.
5
6    Copyright (C) Tim Potter <tpot@samba.org> 2005
7    Copyright (C) Andrew Tridgell 2005
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 2 of the License, or
12    (at your option) any later version.
13    
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18    
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 */
23
24 #include "includes.h"
25 #include "lib/appweb/ejs/ejs.h"
26 #include "lib/appweb/ejs/ejsInternal.h"
27 #include "scripting/ejs/smbcalls.h"
28 #include "auth/gensec/gensec.h"
29 #include "ldb/include/ldb.h"
30
31 static EjsId eid;
32
33 static void smbscript_ejs_exception(const char *reason)
34 {
35         Ejs *ep = ejsPtr(eid);
36         ejsSetErrorMsg(eid, "%s", reason);
37         fprintf(stderr, "%s", ep->error);
38         exit(127);
39 }
40
41 int main(int argc, const char **argv)
42 {
43         EjsHandle handle = 0;
44         MprVar result;
45         char *emsg, *script;
46         size_t script_size;
47         TALLOC_CTX *mem_ctx = talloc_new(NULL);
48         const char **argv_list = NULL;
49         const char *fname;
50         struct MprVar *return_var;
51         int exit_status, i;
52
53         fault_setup(argv[0]);
54
55         ldb_global_init();
56
57         gensec_init();
58         mprSetCtx(mem_ctx);
59
60         lp_load();
61
62         if (argc < 2) {
63                 fprintf(stderr, "You must supply a script name\n");
64                 exit(1);
65         }
66
67         fname = argv[1];
68
69         if (ejsOpen(NULL, NULL, NULL) != 0) {
70                 fprintf(stderr, "smbscript: ejsOpen(): unable to initialise "
71                         "EJS subsystem\n");
72                 exit(127);
73         }
74
75         smb_setup_ejs_functions(smbscript_ejs_exception);
76
77         if ((eid = ejsOpenEngine(handle, 0)) == (EjsId)-1) {
78                 fprintf(stderr, "smbscript: ejsOpenEngine(): unable to "
79                         "initialise an EJS engine\n");
80                 exit(127);
81         }
82
83         /* setup ARGV[] in the ejs environment */
84         for (i=1;argv[i];i++) {
85                 argv_list = str_list_add(argv_list, argv[i]);
86         }
87         talloc_steal(mem_ctx, argv_list);
88         mprSetVar(ejsGetGlobalObject(eid), "ARGV", mprList("ARGV", argv_list));
89
90         /* load the script and advance past interpreter line*/
91         script = file_load(fname, &script_size, mem_ctx);
92
93         if (!script) {
94                 fprintf(stderr, "Unable to load script from '%s'\n", fname);
95                 exit(1);
96         }
97
98         /* allow scriptable js */
99         if (strncmp(script, "#!", 2) == 0) {
100                 script += strcspn(script, "\r\n");
101                 script += strspn(script, "\r\n");
102         }
103         /* and this copes with the ugly exec hack */
104         if (strncmp(script, "exec ", 5) == 0) {
105                 script += strcspn(script, "\r\n");
106                 script += strspn(script, "\r\n");
107         }
108
109         /* run the script */
110         if (ejsEvalScript(eid, script, &result, &emsg) == -1) {
111                 fprintf(stderr, "smbscript: ejsEvalScript(): %s\n", emsg);
112                 exit(127);
113         }
114
115         return_var = ejsGetReturnValue(eid);
116         exit_status = mprVarToNumber(return_var);
117
118         ejsClose();
119
120         talloc_free(mem_ctx);
121
122         return exit_status;
123 }