int nval_list(const char *xb, int xb_size, char *buf, int bsize) { int pos = 0; int size; int name_len; int ncopied = 0; int filled = 0; memcpy(&size,xb + pos,sizeof(int)); while(size > sizeof(int) && size <= xb_size && (pos + size) < xb_size && !filled){ pos+= sizeof(int); size-=sizeof(int); name_len = yaffs_strnlen((YCHAR *)(xb + pos), size); if(ncopied + name_len + 1 < bsize){ memcpy(buf,xb+pos,name_len * sizeof(YCHAR)); buf+= name_len; *buf = '\0'; buf++; if(sizeof(YCHAR) > 1){ *buf = '\0'; buf++; } ncopied += (name_len+1); } else filled = 1; pos+=size; if(pos < xb_size -sizeof(int)) memcpy(&size,xb + pos,sizeof(int)); else size = 0; } return ncopied; }
loff_t yaffs_get_file_size(struct yaffs_obj *obj) { YCHAR *alias = NULL; obj = yaffs_get_equivalent_obj(obj); switch (obj->variant_type) { case YAFFS_OBJECT_TYPE_FILE: return obj->variant.file_variant.file_size; case YAFFS_OBJECT_TYPE_SYMLINK: alias = obj->variant.symlink_variant.alias; if (!alias) return 0; return yaffs_strnlen(alias, YAFFS_MAX_ALIAS_LENGTH); default: return 0; } }
int nval_set(char *xb, int xb_size, const YCHAR * name, const char *buf, int bsize, int flags) { int pos; int namelen = yaffs_strnlen(name, xb_size); int reclen; int size_exist = 0; int space; int start; pos = nval_find(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); space = xb_size - start + size_exist; reclen = (sizeof(int) + namelen + 1 + bsize); if (reclen > space) return -ENOSPC; if (pos >= 0) { nval_del(xb, xb_size, name); start = nval_used(xb, xb_size); } pos = start; memcpy(xb + pos, &reclen, sizeof(int)); pos += sizeof(int); yaffs_strncpy((YCHAR *) (xb + pos), name, reclen); pos += (namelen + 1); memcpy(xb + pos, buf, bsize); return 0; }