-/* $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
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 *);
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 */
{ 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 */
{ "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 }
};
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;
+}
+
/*
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) {
*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);