r8340: - added sys_gmtime()
[ira/wip.git] / source4 / scripting / ejs / smbcalls_sys.c
1 /* 
2    Unix SMB/CIFS implementation.
3
4    provide access to system functions
5
6    Copyright (C) Andrew Tridgell 2005
7    
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12    
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17    
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23 #include "includes.h"
24 #include "scripting/ejs/smbcalls.h"
25 #include "lib/ejs/ejs.h"
26 #include "system/time.h"
27
28 /*
29   return the list of configured network interfaces
30 */
31 static int ejs_sys_interfaces(MprVarHandle eid, int argc, struct MprVar **argv)
32 {
33         int i, count = iface_count();
34         struct MprVar ret = mprObject("interfaces");
35         for (i=0;i<count;i++) {
36                 mprAddArray(&ret, i, mprString(iface_n_ip(i)));
37         }
38         mpr_Return(eid, ret);
39         return 0;       
40 }
41
42 /*
43   return the hostname from gethostname()
44 */
45 static int ejs_sys_hostname(MprVarHandle eid, int argc, struct MprVar **argv)
46 {
47         char name[200];
48         if (gethostname(name, sizeof(name)-1) == -1) {
49                 ejsSetErrorMsg(eid, "gethostname failed - %s", strerror(errno));
50                 return -1;
51         }
52         mpr_Return(eid, mprString(name));
53         return 0;       
54 }
55
56
57 /*
58   return current time as a 64 bit nttime value
59 */
60 static int ejs_sys_nttime(MprVarHandle eid, int argc, struct MprVar **argv)
61 {
62         struct timeval tv = timeval_current();
63         struct MprVar v = mprCreateNumberVar(timeval_to_nttime(&tv));
64         mpr_Return(eid, v);
65         return 0;
66 }
67
68 /*
69   return the given time as a gmtime structure
70 */
71 static int ejs_sys_gmtime(MprVarHandle eid, int argc, struct MprVar **argv)
72 {
73         time_t t;
74         struct MprVar ret;
75         struct tm *tm;
76         if (argc != 1 || !mprVarIsNumber(argv[0]->type)) {
77                 ejsSetErrorMsg(eid, "sys_gmtime invalid arguments");
78                 return -1;
79         }
80         t = nt_time_to_unix(mprVarToNumber(argv[0]));
81         tm = gmtime(&t);
82         if (tm == NULL) {
83                 mpr_Return(eid, mprCreateUndefinedVar());
84                 return 0;
85         }
86         ret = mprObject("gmtime");
87 #define TM_EL(n) mprSetVar(&ret, #n, mprCreateIntegerVar(tm->n))
88         TM_EL(tm_sec);
89         TM_EL(tm_min);
90         TM_EL(tm_hour);
91         TM_EL(tm_mday);
92         TM_EL(tm_mon);
93         TM_EL(tm_year);
94         TM_EL(tm_wday);
95         TM_EL(tm_yday);
96         TM_EL(tm_isdst);
97
98         mpr_Return(eid, ret);
99         return 0;
100 }
101
102 /*
103   return a ldap time string from a nttime
104 */
105 static int ejs_sys_ldaptime(MprVarHandle eid, int argc, struct MprVar **argv)
106 {
107         char *s;
108         time_t t;
109         if (argc != 1 || !mprVarIsNumber(argv[0]->type)) {
110                 ejsSetErrorMsg(eid, "sys_ldaptime invalid arguments");
111                 return -1;
112         }
113         t = nt_time_to_unix(mprVarToNumber(argv[0]));
114         s = ldap_timestring(mprMemCtx(), t);
115         mpr_Return(eid, mprString(s));
116         talloc_free(s);
117         return 0;
118 }
119
120 /*
121   unlink a file
122    ok = unlink(fname);
123 */
124 static int ejs_sys_unlink(MprVarHandle eid, int argc, char **argv)
125 {
126         int ret;
127         if (argc != 1) {
128                 ejsSetErrorMsg(eid, "sys_unlink invalid arguments");
129                 return -1;
130         }
131         ret = unlink(argv[0]);
132         mpr_Return(eid, mprCreateBoolVar(ret == 0));
133         return 0;
134 }
135
136 /*
137   load a file as a string
138   usage:
139      string = sys_file_load(filename);
140 */
141 static int ejs_sys_file_load(MprVarHandle eid, int argc, char **argv)
142 {
143         char *s;
144         if (argc != 1) {
145                 ejsSetErrorMsg(eid, "sys_file_load invalid arguments");
146                 return -1;
147         }
148
149         s = file_load(argv[0], NULL, mprMemCtx());
150         mpr_Return(eid, mprString(s));
151         talloc_free(s);
152         return 0;
153 }
154
155 /*
156   save a file from a string
157   usage:
158      ok = sys_file_save(filename, str);
159 */
160 static int ejs_sys_file_save(MprVarHandle eid, int argc, char **argv)
161 {
162         BOOL ret;
163         if (argc != 2) {
164                 ejsSetErrorMsg(eid, "sys_file_save invalid arguments");
165                 return -1;
166         }
167         ret = file_save(argv[0], argv[1], strlen(argv[1]));
168         mpr_Return(eid, mprCreateBoolVar(ret));
169         return 0;
170 }
171
172
173 /*
174   setup C functions that be called from ejs
175 */
176 void smb_setup_ejs_system(void)
177 {
178         ejsDefineCFunction(-1, "sys_interfaces", ejs_sys_interfaces, NULL, MPR_VAR_SCRIPT_HANDLE);
179         ejsDefineCFunction(-1, "sys_hostname", ejs_sys_hostname, NULL, MPR_VAR_SCRIPT_HANDLE);
180         ejsDefineCFunction(-1, "sys_nttime", ejs_sys_nttime, NULL, MPR_VAR_SCRIPT_HANDLE);
181         ejsDefineCFunction(-1, "sys_gmtime", ejs_sys_gmtime, NULL, MPR_VAR_SCRIPT_HANDLE);
182         ejsDefineCFunction(-1, "sys_ldaptime", ejs_sys_ldaptime, NULL, MPR_VAR_SCRIPT_HANDLE);
183         ejsDefineStringCFunction(-1, "sys_unlink", ejs_sys_unlink, NULL, MPR_VAR_SCRIPT_HANDLE);
184         ejsDefineStringCFunction(-1, "sys_file_load", ejs_sys_file_load, NULL, MPR_VAR_SCRIPT_HANDLE);
185         ejsDefineStringCFunction(-1, "sys_file_save", ejs_sys_file_save, NULL, MPR_VAR_SCRIPT_HANDLE);
186 }