timothy-tests: Fix paths for wrongly failing tests
[yaffs2.git] / yaffs_nameval.c
index 4bdf4ed743a7195dca0e3af8ac7775801b96b42c..eeb75be0f86089818988f5b0b9d2fb07d8c239c0 100644 (file)
@@ -16,7 +16,7 @@
 * values and fits into a small finite buffer.
  *
  * Each attribute is stored as a record:
- *  sizeof(int) bytes   record size.
+ *  sizeof(size) bytes   record size.
  *  strnlen+1 bytes name null terminated.
  *  nbytes    value.
  *  ----------
  */
 
 #include "yaffs_nameval.h"
-
+#include "yaffs_guts.h"
 #include "yportenv.h"
+#include "yaffs_endian.h"
 
-static int nval_find(const char *xb, int xb_size, const YCHAR *name,
+static int nval_find(struct yaffs_dev *dev,
+                    const char *xb, int xb_size, const YCHAR *name,
                     int *exist_size)
 {
        int pos = 0;
-       int size;
+       s32 size;
+
+       memcpy(&size, xb, sizeof(size));
+       yaffs_do_endian_s32(dev, &size);
 
-       memcpy(&size, xb, sizeof(int));
        while (size > 0 && (size < xb_size) && (pos + size < xb_size)) {
-               if (!strncmp((YCHAR *) (xb + pos + sizeof(int)),
+               if (!strncmp((YCHAR *) (xb + pos + sizeof(size)),
                                name, size)) {
                        if (exist_size)
                                *exist_size = size;
                        return pos;
                }
                pos += size;
-               if (pos < xb_size - sizeof(int))
-                       memcpy(&size, xb + pos, sizeof(int));
-               else
+               if (pos < (int)(xb_size - sizeof(size))) {
+                       memcpy(&size, xb + pos, sizeof(size));
+                       yaffs_do_endian_s32(dev, &size);
+
+               } else
                        size = 0;
        }
        if (exist_size)
@@ -54,89 +60,101 @@ static int nval_find(const char *xb, int xb_size, const YCHAR *name,
        return -ENODATA;
 }
 
-static int nval_used(const char *xb, int xb_size)
+static int nval_used(struct yaffs_dev *dev, const char *xb, int xb_size)
 {
        int pos = 0;
-       int size;
+       s32 size;
+
+       memcpy(&size, xb + pos, sizeof(size));
+       yaffs_do_endian_s32(dev, &size);
 
-       memcpy(&size, xb + pos, sizeof(int));
        while (size > 0 && (size < xb_size) && (pos + size < xb_size)) {
                pos += size;
-               if (pos < xb_size - sizeof(int))
-                       memcpy(&size, xb + pos, sizeof(int));
-               else
+               if (pos < (int)(xb_size - sizeof(size))) {
+                       memcpy(&size, xb + pos, sizeof(size));
+                       yaffs_do_endian_s32(dev, &size);
+               } else
                        size = 0;
        }
        return pos;
 }
 
-int nval_del(char *xb, int xb_size, const YCHAR *name)
+int nval_del(struct yaffs_dev *dev, char *xb, int xb_size, const YCHAR *name)
 {
-       int pos = nval_find(xb, xb_size, name, NULL);
-       int size;
+       int pos = nval_find(dev, xb, xb_size, name, NULL);
+       s32 size;
 
        if (pos < 0 || pos >= xb_size)
                return -ENODATA;
 
        /* Find size, shift rest over this record,
         * then zero out the rest of buffer */
-       memcpy(&size, xb + pos, sizeof(int));
+       memcpy(&size, xb + pos, sizeof(size));
+       yaffs_do_endian_s32(dev, &size);
+
        memcpy(xb + pos, xb + pos + size, xb_size - (pos + size));
        memset(xb + (xb_size - size), 0, size);
        return 0;
 }
 
-int nval_set(char *xb, int xb_size, const YCHAR *name, const char *buf,
-               int bsize, int flags)
+int nval_set(struct yaffs_dev *dev,
+            char *xb, int xb_size, const YCHAR *name, const char *buf,
+            int bsize, int flags)
 {
        int pos;
        int namelen = strnlen(name, xb_size);
-       int reclen;
        int size_exist = 0;
        int space;
        int start;
+       s32 reclen;
+       s32 reclen_endianised;
 
-       pos = nval_find(xb, xb_size, name, &size_exist);
+       pos = nval_find(dev, xb, xb_size, name, &size_exist);
 
        if (flags & XATTR_CREATE && pos >= 0)
                return -EEXIST;
        if (flags & XATTR_REPLACE && pos < 0)
                return -ENODATA;
 
-       start = nval_used(xb, xb_size);
+       start = nval_used(dev, xb, xb_size);
        space = xb_size - start + size_exist;
 
-       reclen = (sizeof(int) + namelen + 1 + bsize);
+       reclen = (sizeof(reclen) + namelen + 1 + bsize);
 
        if (reclen > space)
                return -ENOSPC;
 
        if (pos >= 0) {
-               nval_del(xb, xb_size, name);
-               start = nval_used(xb, xb_size);
+               /* Exists, so delete it. */
+               nval_del(dev, xb, xb_size, name);
+               start = nval_used(dev, xb, xb_size);
        }
 
        pos = start;
 
-       memcpy(xb + pos, &reclen, sizeof(int));
-       pos += sizeof(int);
+       reclen_endianised = reclen;
+       yaffs_do_endian_s32(dev, &reclen_endianised);
+       memcpy(xb + pos, &reclen_endianised, sizeof(reclen_endianised));
+       pos += sizeof(reclen_endianised);
        strncpy((YCHAR *) (xb + pos), name, reclen);
        pos += (namelen + 1);
        memcpy(xb + pos, buf, bsize);
        return 0;
 }
 
-int nval_get(const char *xb, int xb_size, const YCHAR * name, char *buf,
+int nval_get(struct yaffs_dev *dev,
+            const char *xb, int xb_size, const YCHAR * name, char *buf,
             int bsize)
 {
-       int pos = nval_find(xb, xb_size, name, NULL);
-       int size;
+       int pos = nval_find(dev, xb, xb_size, name, NULL);
+       s32 size;
 
        if (pos >= 0 && pos < xb_size) {
 
-               memcpy(&size, xb + pos, sizeof(int));
-               pos += sizeof(int);     /* advance past record length */
-               size -= sizeof(int);
+               memcpy(&size, xb + pos, sizeof(size));
+               yaffs_do_endian_s32(dev, &size);
+               pos += sizeof(size);    /* advance past record length */
+               size -= sizeof(size);
 
                /* Advance over name string */
                while (xb[pos] && size > 0 && pos < xb_size) {
@@ -164,21 +182,23 @@ int nval_get(const char *xb, int xb_size, const YCHAR * name, char *buf,
        return -ENODATA;
 }
 
-int nval_list(const char *xb, int xb_size, char *buf, int bsize)
+int nval_list(struct yaffs_dev *dev, const char *xb, int xb_size, char *buf, int bsize)
 {
        int pos = 0;
-       int size;
+       s32 size;
        int name_len;
        int ncopied = 0;
        int filled = 0;
 
-       memcpy(&size, xb + pos, sizeof(int));
-       while (size > sizeof(int) &&
+       memcpy(&size, xb + pos, sizeof(size));
+       yaffs_do_endian_s32(dev, &size);
+
+       while (size > (int)(sizeof(size)) &&
                size <= xb_size &&
                (pos + size) < xb_size &&
                !filled) {
-               pos += sizeof(int);
-               size -= sizeof(int);
+               pos += sizeof(size);
+               size -= sizeof(size);
                name_len = strnlen((YCHAR *) (xb + pos), size);
                if (ncopied + name_len + 1 < bsize) {
                        memcpy(buf, xb + pos, name_len * sizeof(YCHAR));
@@ -194,15 +214,17 @@ int nval_list(const char *xb, int xb_size, char *buf, int bsize)
                        filled = 1;
                }
                pos += size;
-               if (pos < xb_size - sizeof(int))
-                       memcpy(&size, xb + pos, sizeof(int));
+               if (pos < (int)(xb_size - sizeof(size))) {
+                       memcpy(&size, xb + pos, sizeof(size));
+                       yaffs_do_endian_s32(dev, &size);
+               }
                else
                        size = 0;
        }
        return ncopied;
 }
 
-int nval_hasvalues(const char *xb, int xb_size)
+int nval_hasvalues(struct yaffs_dev *dev, const char *xb, int xb_size)
 {
-       return nval_used(xb, xb_size) > 0;
+       return nval_used(dev, xb, xb_size) > 0;
 }