summaryrefslogtreecommitdiff
path: root/source4/lib/appweb/ejs-2.0/ejs/system/UNIX/ejsFileSystem.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/lib/appweb/ejs-2.0/ejs/system/UNIX/ejsFileSystem.c')
-rwxr-xr-xsource4/lib/appweb/ejs-2.0/ejs/system/UNIX/ejsFileSystem.c454
1 files changed, 454 insertions, 0 deletions
diff --git a/source4/lib/appweb/ejs-2.0/ejs/system/UNIX/ejsFileSystem.c b/source4/lib/appweb/ejs-2.0/ejs/system/UNIX/ejsFileSystem.c
new file mode 100755
index 0000000000..7b39c16e4d
--- /dev/null
+++ b/source4/lib/appweb/ejs-2.0/ejs/system/UNIX/ejsFileSystem.c
@@ -0,0 +1,454 @@
+/*
+ * @file ejsFileSystem.c
+ * @brief FileSystem class for the EJ System Object Model
+ * MOB -- this is almost the same as for Windows. Should common up.
+ */
+/********************************** Copyright *********************************/
+/*
+ * Copyright (c) Mbedthis Software LLC, 2003-2006. All Rights Reserved.
+ */
+/********************************** Includes **********************************/
+
+#include "ejs.h"
+#include <dirent.h>
+
+/******************************************************************************/
+/************************************ Methods *********************************/
+/******************************************************************************/
+/*
+ * function void access(string path);
+ * MOB - API insufficient. Access for read or write?
+ */
+
+static int accessProc(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
+{
+ int rc;
+
+ if (argc != 1 || !ejsVarIsString(argv[0])) {
+ ejsError(ejs, EJS_ARG_ERROR, "Bad usage: access(path)");
+ return -1;
+ }
+
+ rc = access(argv[0]->string, 04);
+
+ ejsSetReturnValueToBoolean(ejs, (rc == 0) ? 1 : 0);
+ return 0;
+}
+
+/******************************************************************************/
+/*
+ * function void mkdir(string path);
+ */
+
+static int mkdirProc(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
+{
+ if (argc != 1 || !ejsVarIsString(argv[0])) {
+ ejsError(ejs, EJS_ARG_ERROR, "Bad usage: mkdir(path)");
+ return -1;
+ }
+
+ if (mprMakeDirPath(ejs, argv[0]->string) < 0) {
+ ejsError(ejs, EJS_IO_ERROR, "Cant create directory");
+ return -1;
+ }
+ return 0;
+}
+
+/******************************************************************************/
+/*
+ * function void rmdir(string path);
+ */
+
+static int rmdirProc(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
+{
+ int rc;
+
+ if (argc != 1 || !ejsVarIsString(argv[0])) {
+ ejsError(ejs, EJS_ARG_ERROR, "Bad usage: mkdir(path)");
+ return -1;
+ }
+
+ rc = mprDeleteDir(ejs, argv[0]->string);
+
+ if (rc < 0) {
+ ejsError(ejs, EJS_IO_ERROR, "Cant remove directory");
+ return -1;
+ }
+ return 0;
+}
+
+/******************************************************************************/
+/*
+ * function void dirList(string path, [bool enumDirs]);
+ * MOB -- need pattern to match (what about "." and ".." and ".*"
+ */
+
+static int dirListProc(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
+{
+ DIR *dir;
+ struct dirent *dirent;
+ char path[MPR_MAX_FNAME];
+ EjsVar *array, *vp;
+ uchar enumDirs;
+
+ if (argc < 1 || !ejsVarIsString(argv[0])) {
+ ejsError(ejs, EJS_ARG_ERROR, "Bad usage: dirList(path)");
+ return -1;
+ }
+ if (argc == 2) {
+ enumDirs = ejsVarToBoolean(argv[1]);
+ } else {
+ enumDirs = 0;
+ }
+ array = ejsCreateArray(ejs, 0);
+ ejsMakeObjPermanent(array, 1);
+
+ /*
+ * First collect the files
+ */
+ mprSprintf(path, sizeof(path), "%s/*.*", argv[0]->string);
+
+ dir = opendir(path);
+ if (dir == 0) {
+ ejsError(ejs, EJS_ARG_ERROR, "Can't enumerate dirList(path)");
+ return -1;
+ }
+
+ while ((dirent = readdir(dir)) != 0) {
+ if (dirent->d_name[0] == '.') {
+ continue;
+ }
+ if (!enumDirs || (dirent->d_type & DT_DIR)) {
+ mprSprintf(path, sizeof(path), "%s/%s", argv[0]->string,
+ dirent->d_name);
+ vp = ejsCreateStringVar(ejs, path);
+ ejsAddArrayElt(ejs, array, vp, EJS_SHALLOW_COPY);
+ ejsFreeVar(ejs, vp);
+ }
+ }
+
+ closedir(dir);
+
+ ejsSetReturnValue(ejs, array);
+ ejsMakeObjPermanent(array, 0);
+
+ /*
+ * Can free now as the return value holds the reference
+ */
+ ejsFreeVar(ejs, array);
+
+ return 0;
+}
+
+/******************************************************************************/
+/*
+ * function void getFreeSpace();
+ */
+
+static int getFreeSpaceProc(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
+{
+#if UNUSED
+ MprApp *app;
+ uint space;
+
+ app = mprGetApp(ejs);
+ space = IFILEMGR_GetFreeSpace(app->fileMgr, 0);
+ ejsSetReturnValueToInteger(ejs, space);
+#endif
+
+ return 0;
+}
+
+/******************************************************************************/
+/*
+ * function void writeFile(string path, var data);
+ */
+
+static int writeFileProc(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
+{
+ MprFile *file;
+ char *data, *buf;
+ int bytes, length, rc;
+
+ if (argc != 2 || !ejsVarIsString(argv[0])) {
+ ejsError(ejs, EJS_ARG_ERROR, "Bad usage: writeFile(path, var)");
+ return -1;
+ }
+
+ if (ejsVarIsString(argv[1])) {
+ data = argv[1]->string;
+ length = argv[1]->length;
+ buf = 0;
+ } else {
+ buf = data = ejsVarToString(ejs, argv[1]);
+ length = strlen(data);
+ }
+
+ /*
+ * Create fails if already present
+ */
+ rc = mprDelete(ejs, argv[0]->string);
+ file = mprOpen(ejs, argv[0]->string, O_CREAT | O_WRONLY | O_BINARY, 0664);
+ if (file == 0) {
+ ejsError(ejs, EJS_IO_ERROR, "Cant create %s", argv[0]->string);
+ mprFree(buf);
+ return -1;
+ }
+
+ rc = 0;
+ bytes = mprWrite(file, data, length);
+ if (bytes != length) {
+ ejsError(ejs, EJS_IO_ERROR, "Write error to %s", argv[1]->string);
+ rc = -1;
+ }
+
+ mprClose(file);
+
+ mprFree(buf);
+ return rc;
+}
+
+/******************************************************************************/
+/*
+ * function string readFile(string path);
+ */
+
+static int readFileProc(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
+{
+ MprApp *app;
+ MprFile *file;
+ MprBuf *buf;
+ char *data;
+ int bytes, rc;
+
+ if (argc != 1 || !ejsVarIsString(argv[0])) {
+ ejsError(ejs, EJS_ARG_ERROR, "Bad usage: readFile(path)");
+ return -1;
+ }
+ buf = mprCreateBuf(ejs, MPR_BUF_INCR, MPR_MAX_BUF);
+ if (buf == 0) {
+ ejsMemoryError(ejs);
+ return -1;
+ }
+
+ data = mprAlloc(ejs, MPR_BUFSIZE);
+ if (buf == 0) {
+ mprFree(buf);
+ ejsMemoryError(ejs);
+ return -1;
+ }
+
+ app = mprGetApp(ejs);
+ file = mprOpen(ejs, argv[0]->string, O_RDONLY, 0664);
+ if (file == 0) {
+ ejsError(ejs, EJS_IO_ERROR, "Cant open %s", argv[0]->string);
+ mprFree(buf);
+ return -1;
+ }
+
+ rc = 0;
+ while ((bytes = mprRead(file, data, MPR_BUFSIZE)) > 0) {
+ if (mprPutBlockToBuf(buf, data, bytes) != bytes) {
+ ejsError(ejs, EJS_IO_ERROR, "Write error to %s", argv[1]->string);
+ rc = -1;
+ break;
+ }
+ }
+
+ ejsSetReturnValueToBinaryString(ejs, (uchar*) mprGetBufStart(buf),
+ mprGetBufLength(buf));
+
+ mprClose(file);
+ mprFree(data);
+ mprFree(buf);
+
+ return rc;
+}
+
+/******************************************************************************/
+/*
+ * function void remove(string path);
+ */
+
+static int removeProc(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
+{
+ int rc;
+
+ if (argc != 1 || !ejsVarIsString(argv[0])) {
+ ejsError(ejs, EJS_ARG_ERROR, "Bad usage: remove(path)");
+ return -1;
+ }
+
+ rc = unlink(argv[0]->string);
+ if (rc < 0) {
+ ejsError(ejs, EJS_IO_ERROR, "Cant remove file");
+ return -1;
+ }
+ return 0;
+}
+
+/******************************************************************************/
+/*
+ * function void rename(string from, string to);
+ */
+
+static int renameProc(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
+{
+ int rc;
+
+ if (argc != 2 || !ejsVarIsString(argv[0]) || !ejsVarIsString(argv[1])) {
+ ejsError(ejs, EJS_ARG_ERROR, "Bad usage: rename(old, new)");
+ return -1;
+ }
+
+ unlink(argv[1]->string);
+ rc = rename(argv[0]->string, argv[1]->string);
+ if (rc < 0) {
+ ejsError(ejs, EJS_IO_ERROR, "Cant rename file");
+ return -1;
+ }
+ return 0;
+}
+
+/******************************************************************************/
+/*
+ * function void copy(string old, string new);
+ */
+
+static int copyProc(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
+{
+ MprFile *from, *to;
+ char *buf;
+ uint bytes;
+ int rc;
+
+ if (argc != 2 || !ejsVarIsString(argv[0]) || !ejsVarIsString(argv[1])) {
+ ejsError(ejs, EJS_ARG_ERROR, "Bad usage: copy(old, new)");
+ return -1;
+ }
+
+ buf = mprAlloc(ejs, MPR_BUFSIZE);
+ if (buf == 0) {
+ ejsMemoryError(ejs);
+ return -1;
+ }
+
+ from = mprOpen(ejs, argv[0]->string, O_RDONLY | O_BINARY, 0664);
+ if (from == 0) {
+ ejsError(ejs, EJS_IO_ERROR, "Cant open %s", argv[0]->string);
+ mprFree(buf);
+ return -1;
+ }
+
+ to = mprOpen(ejs, argv[1]->string, O_CREAT | O_BINARY, 0664);
+ if (to == 0) {
+ ejsError(ejs, EJS_IO_ERROR, "Cant create %s", argv[1]->string);
+ mprClose(from);
+ mprFree(buf);
+ return -1;
+ }
+
+ rc = 0;
+ while ((bytes = mprRead(from, buf, MPR_BUFSIZE)) > 0) {
+ if (mprWrite(to, buf, bytes) != bytes) {
+ ejsError(ejs, EJS_IO_ERROR, "Write error to %s", argv[1]->string);
+ rc = -1;
+ break;
+ }
+ }
+
+ mprClose(from);
+ mprClose(to);
+ mprFree(buf);
+
+ return rc;
+}
+
+/******************************************************************************/
+/*
+ * function FileInfo getFileInfo(string path);
+ *
+ * MOB -- should create a real class FileInfo
+ */
+
+static int getFileInfoProc(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
+{
+ MprFileInfo info;
+ EjsVar *fileInfo;
+ int rc;
+
+ if (argc != 1 || !ejsVarIsString(argv[0])) {
+ ejsError(ejs, EJS_ARG_ERROR, "Bad usage: getFileInfo(path)");
+ return -1;
+ }
+
+ fileInfo = ejsCreateObjVar(ejs);
+ if (fileInfo == 0) {
+ ejsMemoryError(ejs);
+ return -1;
+ }
+ ejsMakeObjPermanent(fileInfo, 1);
+
+ rc = mprGetFileInfo(ejs, argv[0]->string, &info);
+ if (rc < 0) {
+ ejsMakeObjPermanent(fileInfo, 0);
+ ejsFreeVar(ejs, fileInfo);
+ ejsError(ejs, EJS_IO_ERROR, "Cant get file info for %s",
+ argv[0]->string);
+ return -1;
+ }
+
+ ejsSetPropertyToInteger(ejs, fileInfo, "created", info.ctime);
+ ejsSetPropertyToInteger(ejs, fileInfo, "length", info.size);
+ ejsSetPropertyToBoolean(ejs, fileInfo, "isDir", info.isDir);
+
+ ejsSetReturnValue(ejs, fileInfo);
+ ejsMakeObjPermanent(fileInfo, 0);
+
+ return 0;
+}
+
+/******************************************************************************/
+/******************************** Initialization ******************************/
+/******************************************************************************/
+
+int ejsDefineFileSystemClass(Ejs *ejs)
+{
+ EjsVar *fileSystemClass;
+
+ fileSystemClass = ejsDefineClass(ejs, "FileSystem", "Object", 0);
+ if (fileSystemClass == 0) {
+ return MPR_ERR_CANT_INITIALIZE;
+ }
+
+ /*
+ * Define the methods
+ */
+ ejsDefineCMethod(ejs, fileSystemClass, "access", accessProc, 0);
+ ejsDefineCMethod(ejs, fileSystemClass, "mkdir", mkdirProc, 0);
+ ejsDefineCMethod(ejs, fileSystemClass, "rmdir", rmdirProc, 0);
+ ejsDefineCMethod(ejs, fileSystemClass, "dirList", dirListProc, 0);
+ ejsDefineCMethod(ejs, fileSystemClass, "writeFile", writeFileProc, 0);
+ ejsDefineCMethod(ejs, fileSystemClass, "readFile", readFileProc, 0);
+ ejsDefineCMethod(ejs, fileSystemClass, "remove", removeProc, 0);
+ ejsDefineCMethod(ejs, fileSystemClass, "rename", renameProc, 0);
+ ejsDefineCMethod(ejs, fileSystemClass, "copy", copyProc, 0);
+ ejsDefineCMethod(ejs, fileSystemClass, "getFileInfo", getFileInfoProc, 0);
+
+ // MOB -- should be a property with accessor
+ ejsDefineCMethod(ejs, fileSystemClass, "getFreeSpace", getFreeSpaceProc, 0);
+
+ return ejsObjHasErrors(fileSystemClass) ? MPR_ERR_CANT_INITIALIZE: 0;
+}
+
+/******************************************************************************/
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim:tw=78
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */