r9813: Conver testsuite for samba3sam module to EJS
[ira/wip.git] / source4 / scripting / ejs / smbcalls_sys.c
index a76690b597871cb70db26f8f7390bdb300024ba1..f32605c3d57d81b299be16496f3a722d78fceafb 100644 (file)
@@ -22,7 +22,8 @@
 
 #include "includes.h"
 #include "scripting/ejs/smbcalls.h"
-#include "lib/ejs/ejs.h"
+#include "lib/appweb/ejs/ejs.h"
+#include "system/time.h"
 
 /*
   return the list of configured network interfaces
@@ -64,6 +65,40 @@ static int ejs_sys_nttime(MprVarHandle eid, int argc, struct MprVar **argv)
        return 0;
 }
 
+/*
+  return the given time as a gmtime structure
+*/
+static int ejs_sys_gmtime(MprVarHandle eid, int argc, struct MprVar **argv)
+{
+       time_t t;
+       struct MprVar ret;
+       struct tm *tm;
+       if (argc != 1 || !mprVarIsNumber(argv[0]->type)) {
+               ejsSetErrorMsg(eid, "sys_gmtime invalid arguments");
+               return -1;
+       }
+       t = nt_time_to_unix(mprVarToNumber(argv[0]));
+       tm = gmtime(&t);
+       if (tm == NULL) {
+               mpr_Return(eid, mprCreateUndefinedVar());
+               return 0;
+       }
+       ret = mprObject("gmtime");
+#define TM_EL(n) mprSetVar(&ret, #n, mprCreateIntegerVar(tm->n))
+       TM_EL(tm_sec);
+       TM_EL(tm_min);
+       TM_EL(tm_hour);
+       TM_EL(tm_mday);
+       TM_EL(tm_mon);
+       TM_EL(tm_year);
+       TM_EL(tm_wday);
+       TM_EL(tm_yday);
+       TM_EL(tm_isdst);
+
+       mpr_Return(eid, ret);
+       return 0;
+}
+
 /*
   return a ldap time string from a nttime
 */
@@ -82,14 +117,173 @@ static int ejs_sys_ldaptime(MprVarHandle eid, int argc, struct MprVar **argv)
        return 0;
 }
 
+/*
+  return a http time string from a nttime
+*/
+static int ejs_sys_httptime(MprVarHandle eid, int argc, struct MprVar **argv)
+{
+       char *s;
+       time_t t;
+       if (argc != 1 || !mprVarIsNumber(argv[0]->type)) {
+               ejsSetErrorMsg(eid, "sys_httptime invalid arguments");
+               return -1;
+       }
+       t = nt_time_to_unix(mprVarToNumber(argv[0]));
+       s = http_timestring(mprMemCtx(), t);
+       mpr_Return(eid, mprString(s));
+       talloc_free(s);
+       return 0;
+}
+
+/*
+  unlink a file
+   ok = sys.unlink(fname);
+*/
+static int ejs_sys_unlink(MprVarHandle eid, int argc, char **argv)
+{
+       int ret;
+       if (argc != 1) {
+               ejsSetErrorMsg(eid, "sys_unlink invalid arguments");
+               return -1;
+       }
+       ret = unlink(argv[0]);
+       mpr_Return(eid, mprCreateBoolVar(ret == 0));
+       return 0;
+}
+
+/*
+  load a file as a string
+  usage:
+     string = sys.file_load(filename);
+*/
+static int ejs_sys_file_load(MprVarHandle eid, int argc, char **argv)
+{
+       char *s;
+       if (argc != 1) {
+               ejsSetErrorMsg(eid, "sys_file_load invalid arguments");
+               return -1;
+       }
+
+       s = file_load(argv[0], NULL, mprMemCtx());
+       mpr_Return(eid, mprString(s));
+       talloc_free(s);
+       return 0;
+}
+
+/*
+  save a file from a string
+  usage:
+     ok = sys.file_save(filename, str);
+*/
+static int ejs_sys_file_save(MprVarHandle eid, int argc, char **argv)
+{
+       BOOL ret;
+       if (argc != 2) {
+               ejsSetErrorMsg(eid, "sys_file_save invalid arguments");
+               return -1;
+       }
+       ret = file_save(argv[0], argv[1], strlen(argv[1]));
+       mpr_Return(eid, mprCreateBoolVar(ret));
+       return 0;
+}
+
+
+/*
+  return fields of a stat() call
+*/
+static struct MprVar mpr_stat(struct stat *st)
+{
+       struct MprVar ret;
+       ret = mprObject("stat");
+
+#define ST_EL(n) mprSetVar(&ret, #n, mprCreateNumberVar(st->n))
+       ST_EL(st_dev);
+       ST_EL(st_ino);
+       ST_EL(st_mode);
+       ST_EL(st_nlink);
+       ST_EL(st_uid);
+       ST_EL(st_gid);
+       ST_EL(st_rdev);
+       ST_EL(st_size);
+       ST_EL(st_blksize);
+       ST_EL(st_blocks);
+       ST_EL(st_atime);
+       ST_EL(st_mtime);
+       ST_EL(st_ctime);
+
+       return ret;
+}
+
+/*
+  usage:
+      var st = sys.stat(filename);
+  returns an object containing struct stat elements
+*/
+static int ejs_sys_stat(MprVarHandle eid, int argc, char **argv)
+{
+       struct stat st;
+       /* validate arguments */
+       if (argc != 1) {
+               ejsSetErrorMsg(eid, "sys.stat invalid arguments");
+               return -1;
+       }
+       if (stat(argv[0], &st) != 0) {
+               mpr_Return(eid, mprCreateUndefinedVar());
+       } else {
+               mpr_Return(eid, mpr_stat(&st));
+       }
+       return 0;
+}
+
+/*
+  usage:
+      var st = sys.lstat(filename);
+  returns an object containing struct stat elements
+*/
+static int ejs_sys_lstat(MprVarHandle eid, int argc, char **argv)
+{
+       struct stat st;
+       /* validate arguments */
+       if (argc != 1) {
+               ejsSetErrorMsg(eid, "sys.stat invalid arguments");
+               return -1;
+       }
+       if (lstat(argv[0], &st) != 0) {
+               mpr_Return(eid, mprCreateUndefinedVar());
+       } else {
+               mpr_Return(eid, mpr_stat(&st));
+       }
+       return 0;
+}
+
+
+/*
+  initialise sys ejs subsystem
+*/
+static int ejs_sys_init(MprVarHandle eid, int argc, struct MprVar **argv)
+{
+       struct MprVar *obj = mprInitObject(eid, "sys", argc, argv);
+
+       mprSetCFunction(obj, "interfaces", ejs_sys_interfaces);
+       mprSetCFunction(obj, "hostname", ejs_sys_hostname);
+       mprSetCFunction(obj, "nttime", ejs_sys_nttime);
+       mprSetCFunction(obj, "gmtime", ejs_sys_gmtime);
+       mprSetCFunction(obj, "ldaptime", ejs_sys_ldaptime);
+       mprSetCFunction(obj, "httptime", ejs_sys_httptime);
+       mprSetStringCFunction(obj, "unlink", ejs_sys_unlink);
+       mprSetStringCFunction(obj, "file_load", ejs_sys_file_load);
+       mprSetStringCFunction(obj, "file_save", ejs_sys_file_save);
+       mprSetStringCFunction(obj, "stat", ejs_sys_stat);
+       mprSetStringCFunction(obj, "lstat", ejs_sys_lstat);
+
+       return 0;
+}
+
 
 /*
   setup C functions that be called from ejs
 */
 void smb_setup_ejs_system(void)
 {
-       ejsDefineCFunction(-1, "sys_interfaces", ejs_sys_interfaces, NULL, MPR_VAR_SCRIPT_HANDLE);
-       ejsDefineCFunction(-1, "sys_hostname", ejs_sys_hostname, NULL, MPR_VAR_SCRIPT_HANDLE);
-       ejsDefineCFunction(-1, "sys_nttime", ejs_sys_nttime, NULL, MPR_VAR_SCRIPT_HANDLE);
-       ejsDefineCFunction(-1, "sys_ldaptime", ejs_sys_ldaptime, NULL, MPR_VAR_SCRIPT_HANDLE);
+       ejsDefineCFunction(-1, "sys_init", ejs_sys_init, NULL, MPR_VAR_SCRIPT_HANDLE);
 }