*** empty log message ***
authorMatthew Mondor <mmondor@pulsar-zone.net>
Fri, 15 Sep 2006 07:06:58 +0000 (07:06 +0000)
committerMatthew Mondor <mmondor@pulsar-zone.net>
Fri, 15 Sep 2006 07:06:58 +0000 (07:06 +0000)
mmsoftware/js/classes/js_fd.c

index df683e0..fd6a237 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: js_fd.c,v 1.8 2006/09/14 05:53:00 mmondor Exp $ */
+/* $Id: js_fd.c,v 1.9 2006/09/15 07:06:58 mmondor Exp $ */
 
 /*
  * Copyright (c) 2005, Matthew Mondor
@@ -174,6 +174,8 @@ static JSBool       fd_m_fchown(JSContext *, JSObject *, uintN, jsval *, jsval *);
 static JSBool  fd_m_fchmod(JSContext *, JSObject *, uintN, jsval *, jsval *);
 static JSBool  fd_m_flock(JSContext *, JSObject *, uintN, jsval *, jsval *);
 static JSBool  fd_m_fstat(JSContext *, JSObject *, uintN, jsval *, jsval *);
+static JSBool  fd_m_ftruncate(JSContext *, JSObject *, uintN, jsval *,
+                   jsval *);
 
 static JSBool  fd_sm_poll(JSContext *, JSObject *, uintN, jsval *, jsval *);
 static JSBool  fd_sm_poll_mkset(JSContext *, jsval *, jsval *, void *);
@@ -217,13 +219,14 @@ enum fd_methods_args_enum {
        FDMA_FCHMOD,
        FDMA_FLOCK,
        FDMA_FSTAT,
+       FDMA_FTRUNCATE,
        FDMA_MAX
 };
 
 static int fd_methods_args_array[FDMA_MAX][6] = {
        { 1, JSAT_INTEGER },                            /* SET */
        { 0 },                                          /* CLOSE */
-       { 1, JSAT_DOUBLE },                             /* TRUNCATE */
+       { 1, JSAT_DOUBLE | JSAT_INTEGER },              /* TRUNCATE */
        { 0 },                                          /* GET */
        { 3, JSAT_INTEGER, JSAT_INTEGER, JSAT_INTEGER },/* SOCKET */
        { 2, JSAT_STRING, JSAT_INTEGER },               /* CONNECT */
@@ -237,12 +240,13 @@ static int fd_methods_args_array[FDMA_MAX][6] = {
        { 1, JSAT_INTEGER },                            /* READ */
        { 1, JSAT_STRING },                             /* WRITE */
        { 0 },                                          /* FDATASYNC */
-       { 2, JSAT_DOUBLE, JSAT_INTEGER },               /* LSEEK */
+       { 2, JSAT_DOUBLE | JSAT_INTEGER, JSAT_INTEGER },/* LSEEK */
        { 2, JSAT_STRING | JSAT_INTEGER,
                JSAT_STRING | JSAT_INTEGER },           /* FCHOWN */
        { 1, JSAT_INTEGER },                            /* FCHMOD */
        { 1, JSAT_INTEGER },                            /* FLOCK */
-       { 0 }                                           /* FSTAT */
+       { 0 },                                          /* FSTAT */
+       { 1, JSAT_DOUBLE | JSAT_INTEGER },              /* FTRUNCATE */
 };
 
 /* Provided methods/functions */
@@ -270,6 +274,7 @@ static JSFunctionSpec fd_methods[] = {
        { "fchmod", fd_m_fchmod, 1, 0, 0 },
        { "flock", fd_m_flock, 1, 0, 0 },
        { "fstat", fd_m_fstat, 0, 0, 0 },
+       { "ftruncate", fd_m_ftruncate, 1, 0, 0 },
        { NULL, NULL, 0, 0, 0 }
 };
 
@@ -1717,6 +1722,88 @@ err:
        return JS_FALSE;
 }
 
+static JSBool
+fd_m_ftruncate(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
+    jsval *rval)
+{
+       /* XXX */
+       jsfd_t          *jsfd;
+       struct stat     st;
+       JSObject        *array = NULL;
+       jsval           val;
+
+       *rval = OBJECT_TO_JSVAL(NULL);
+
+       if ((jsfd = fd_methods_args_check(cx, obj, "ftruncate", FDMA_FTRUNCATE,
+           argc, argv, JSFD_FILE)) == NULL)
+               return JS_FALSE;
+
+       if (fstat(jsfd->fd, &st) == -1) {
+               jsfd->error = errno;
+               QUEUE_EXCEPTION(strerror(errno));
+               return JS_FALSE;
+       }
+
+       /*
+        * Note: We immediately link newly created objects to avoid GC
+        * problems.  For the simplicity of this task we don't need an
+        * additional root to be created using JS_AddRoot(), since *rval
+        * is already rooted.  Moreover, the double objects we create are
+        * immediately added as propery as well.
+        */
+
+       if ((array = JS_NewObject(cx, NULL, NULL, NULL)) == NULL) {
+               QUEUE_EXCEPTION("Out of memory");
+               goto err;
+       }
+       *rval = OBJECT_TO_JSVAL(array);
+
+#define DEFINE_INT_PROP(n, i)  do {                                    \
+       val = INT_TO_JSVAL((int)(i));                                   \
+       if (!JS_DefineProperty(cx, array, (n), val, NULL, NULL,         \
+           JSPROP_ENUMERATE)) {                                        \
+               QUEUE_EXCEPTION("Internal error!");                     \
+               goto err;                                               \
+       }                                                               \
+} while (/* CONSTCOND */0)
+
+#define DEFINE_DOUBLE_PROP(n, d) do {                                  \
+       if (!JS_NewDoubleValue(cx, (jsdouble)(d), &val))                \
+               goto err;                                               \
+       if (!JS_DefineProperty(cx, array, (n), val, NULL, NULL,         \
+           JSPROP_ENUMERATE)) {                                        \
+               QUEUE_EXCEPTION("Internal error!");                     \
+               goto err;                                               \
+       }                                                               \
+} while (/* CONSTCOND */0)
+
+       DEFINE_INT_PROP("st_dev", st.st_dev);
+       DEFINE_INT_PROP("st_ino", st.st_ino);
+       DEFINE_INT_PROP("st_mode", st.st_mode);
+       DEFINE_INT_PROP("st_nlink", st.st_nlink);
+       DEFINE_INT_PROP("st_uid", st.st_uid);
+       DEFINE_INT_PROP("st_gid", st.st_gid);
+       DEFINE_INT_PROP("st_rdev", st.st_rdev);
+       DEFINE_DOUBLE_PROP("st_atime", st.st_atime);
+       DEFINE_DOUBLE_PROP("st_mtime", st.st_mtime);
+       DEFINE_DOUBLE_PROP("st_ctime", st.st_ctime);
+       DEFINE_DOUBLE_PROP("st_size", st.st_size);
+       DEFINE_DOUBLE_PROP("st_blocks", st.st_blocks);
+       DEFINE_INT_PROP("st_blksize", st.st_blksize);
+       DEFINE_INT_PROP("st_flags", st.st_flags);
+       DEFINE_INT_PROP("st_gen", st.st_gen);
+
+#undef DEFINE_INT_PROP
+#undef DEFINE_DOUBLE_PROP
+
+       return JS_TRUE;
+
+err:
+       *rval = OBJECT_TO_JSVAL(NULL);
+
+       return JS_FALSE;
+}
+
 
 
 /*
@@ -2022,8 +2109,10 @@ fd_methods_args_check(JSContext *cx, JSObject *obj, const char *fun, int id,
                int     cur;
 
                cur = 0;
-               if (JSVAL_IS_INT(argv[i]) || JSVAL_IS_DOUBLE(argv[i]))
-                       cur |= JSAT_INTEGER | JSAT_DOUBLE;
+               if (JSVAL_IS_DOUBLE(argv[i]))
+                       cur |= JSAT_DOUBLE;
+               else if (JSVAL_IS_INT(argv[i]))
+                       cur |= JSAT_INTEGER;
                else if (JSVAL_IS_STRING(argv[i]))
                        cur |= JSAT_STRING;
                if ((p[i] & cur) == 0) {
@@ -2031,14 +2120,14 @@ fd_methods_args_check(JSContext *cx, JSObject *obj, const char *fun, int id,
 
                        *types = '\0';
                        if ((p[i] & JSAT_INTEGER) != 0)
-                               (void) strcat(types, "INTEGER ");
+                               (void) strcat(types, "INTEGER ");
                        if ((p[i] & JSAT_DOUBLE) != 0)
-                               (void) strcat(types, "DOUBLE ");
+                               (void) strcat(types, "DOUBLE ");
                        if ((p[i] & JSAT_STRING) != 0)
-                               (void) strcat(types, "STRING ");
+                               (void) strcat(types, "STRING ");
                        if ((p[i] & JSAT_OBJECT) != 0)
-                               (void) strcat(types, "OBJECT ");
-                       types[strlen(types) - 1] = '\0';
+                               (void) strcat(types, "OBJECT ");
+                       types[strlen(types) - 3] = '\0';
                        (void) snprintf(line, 1023,
                            "%s() - argument #%d not of expected type(s) (%s)",
                            fun, i + 1, types);