mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-10-31 16:14:16 +01:00 
			
		
		
		
	WIP dropped lfs_fs_getattr for more implicit lfs_getattr("/")
This commit is contained in:
		
							
								
								
									
										141
									
								
								lfs.c
									
									
									
									
									
								
							
							
						
						
									
										141
									
								
								lfs.c
									
									
									
									
									
								
							| @@ -540,7 +540,7 @@ static int lfs_commit_attrs(lfs_t *lfs, struct lfs_commit *commit, | |||||||
|         uint16_t id, const struct lfs_attr *attrs); |         uint16_t id, const struct lfs_attr *attrs); | ||||||
|  |  | ||||||
| static int lfs_commit_move(lfs_t *lfs, struct lfs_commit *commit, | static int lfs_commit_move(lfs_t *lfs, struct lfs_commit *commit, | ||||||
|         uint16_t fromid, uint16_t toid, |         uint32_t frommask, uint32_t fromtag, uint32_t tomask, uint32_t totag, | ||||||
|         const lfs_mdir_t *dir, const lfs_mattr_t *attrs); |         const lfs_mdir_t *dir, const lfs_mattr_t *attrs); | ||||||
|  |  | ||||||
| static int lfs_commit_attr(lfs_t *lfs, struct lfs_commit *commit, | static int lfs_commit_attr(lfs_t *lfs, struct lfs_commit *commit, | ||||||
| @@ -548,7 +548,8 @@ static int lfs_commit_attr(lfs_t *lfs, struct lfs_commit *commit, | |||||||
|     if (lfs_tag_subtype(tag) == LFS_FROM_MOVE) { |     if (lfs_tag_subtype(tag) == LFS_FROM_MOVE) { | ||||||
|         // special case for moves |         // special case for moves | ||||||
|         return lfs_commit_move(lfs, commit, |         return lfs_commit_move(lfs, commit, | ||||||
|                 lfs_tag_size(tag), lfs_tag_id(tag), |                 0x003ff000, LFS_MKTAG(0, lfs_tag_size(tag), 0), | ||||||
|  |                 0x003ff000, LFS_MKTAG(0, lfs_tag_id(tag), 0), | ||||||
|                 buffer, NULL); |                 buffer, NULL); | ||||||
|     } else if (lfs_tag_subtype(tag) == LFS_FROM_ATTRS) { |     } else if (lfs_tag_subtype(tag) == LFS_FROM_ATTRS) { | ||||||
|         // special case for custom attributes |         // special case for custom attributes | ||||||
| @@ -617,7 +618,7 @@ static int lfs_commit_attrs(lfs_t *lfs, struct lfs_commit *commit, | |||||||
| } | } | ||||||
|  |  | ||||||
| static int lfs_commit_move(lfs_t *lfs, struct lfs_commit *commit, | static int lfs_commit_move(lfs_t *lfs, struct lfs_commit *commit, | ||||||
|         uint16_t fromid, uint16_t toid, |         uint32_t frommask, uint32_t fromtag, uint32_t tomask, uint32_t totag, | ||||||
|         const lfs_mdir_t *dir, const lfs_mattr_t *attrs) { |         const lfs_mdir_t *dir, const lfs_mattr_t *attrs) { | ||||||
|     // iterate through list and commits, only committing unique entries |     // iterate through list and commits, only committing unique entries | ||||||
|     lfs_off_t off = dir->off; |     lfs_off_t off = dir->off; | ||||||
| @@ -650,17 +651,15 @@ static int lfs_commit_move(lfs_t *lfs, struct lfs_commit *commit, | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (lfs_tag_type(tag) == LFS_TYPE_DELETE && |         if (lfs_tag_type(tag) == LFS_TYPE_DELETE && | ||||||
|                 lfs_tag_id(tag) <= fromid) { |                 lfs_tag_id(tag) <= lfs_tag_id(fromtag)) { | ||||||
|             // something was deleted, we need to move around it |             // something was deleted, we need to move around it | ||||||
|             fromid += 1; |             fromtag += LFS_MKTAG(0, 1, 0); | ||||||
|         } else if (lfs_tag_id(tag) != fromid) { |         } else if ((tag & frommask) == (fromtag & frommask)) { | ||||||
|             // ignore non-matching ids |  | ||||||
|         } else { |  | ||||||
|             // check if type has already been committed |             // check if type has already been committed | ||||||
|             int32_t res = lfs_commit_get(lfs, commit->block, |             int32_t res = lfs_commit_get(lfs, commit->block, | ||||||
|                     commit->off, commit->ptag, |                     commit->off, commit->ptag, | ||||||
|                     lfs_tag_isuser(tag) ? 0x7ffff000 : 0x7c3ff000, |                     lfs_tag_isuser(tag) ? 0x7ffff000 : 0x7c3ff000, | ||||||
|                     (tag & 0x7fc00000) | LFS_MKTAG(0, toid, 0), |                     (tag & ~tomask) | totag, | ||||||
|                     0, NULL, true); |                     0, NULL, true); | ||||||
|             if (res < 0 && res != LFS_ERR_NOENT) { |             if (res < 0 && res != LFS_ERR_NOENT) { | ||||||
|                 return res; |                 return res; | ||||||
| @@ -669,7 +668,7 @@ static int lfs_commit_move(lfs_t *lfs, struct lfs_commit *commit, | |||||||
|             if (res == LFS_ERR_NOENT) { |             if (res == LFS_ERR_NOENT) { | ||||||
|                 // update id and commit, as we are currently unique |                 // update id and commit, as we are currently unique | ||||||
|                 int err = lfs_commit_attr(lfs, commit, |                 int err = lfs_commit_attr(lfs, commit, | ||||||
|                         (tag & 0xffc00fff) | LFS_MKTAG(0, toid, 0), |                         (tag & ~tomask) | totag, | ||||||
|                         buffer); |                         buffer); | ||||||
|                 if (err) { |                 if (err) { | ||||||
|                     return err; |                     return err; | ||||||
| @@ -1068,8 +1067,7 @@ static int lfs_dir_compact(lfs_t *lfs, | |||||||
|                 // do we have enough space to expand? |                 // do we have enough space to expand? | ||||||
|                 if (res < lfs->cfg->block_count/2) { |                 if (res < lfs->cfg->block_count/2) { | ||||||
|                     LFS_DEBUG("Expanding superblock at rev %"PRIu32, dir->rev); |                     LFS_DEBUG("Expanding superblock at rev %"PRIu32, dir->rev); | ||||||
|                     ack = 0; |                     exhausted = true; | ||||||
|                     exhausted = (lfs_pair_cmp(dir->pair, lfs->root) != 0); |  | ||||||
|                     goto split; |                     goto split; | ||||||
|                 } |                 } | ||||||
|             } else { |             } else { | ||||||
| @@ -1118,7 +1116,9 @@ static int lfs_dir_compact(lfs_t *lfs, | |||||||
|         // commit with a move |         // commit with a move | ||||||
|         for (uint16_t id = begin; id < end; id++) { |         for (uint16_t id = begin; id < end; id++) { | ||||||
|             err = lfs_commit_move(lfs, &commit, |             err = lfs_commit_move(lfs, &commit, | ||||||
|                     id, id - begin, source, attrs); |                     0x003ff000, LFS_MKTAG(0, id, 0), | ||||||
|  |                     0x003ff000, LFS_MKTAG(0, id - begin, 0), | ||||||
|  |                     source, attrs); | ||||||
|             if (err) { |             if (err) { | ||||||
|                 if (err == LFS_ERR_NOSPC) { |                 if (err == LFS_ERR_NOSPC) { | ||||||
|                     goto split; |                     goto split; | ||||||
| @@ -1134,7 +1134,23 @@ static int lfs_dir_compact(lfs_t *lfs, | |||||||
|         // reopen reserved space at the end |         // reopen reserved space at the end | ||||||
|         commit.end = lfs->cfg->block_size - 8; |         commit.end = lfs->cfg->block_size - 8; | ||||||
|  |  | ||||||
|  |         if (lfs_pair_cmp(dir->pair, (const lfs_block_t[2]){0, 1}) == 0) { | ||||||
|  |             // move over (duplicate) superblock if we are root | ||||||
|  |             err = lfs_commit_move(lfs, &commit, | ||||||
|  |                     0x7c000000, LFS_MKTAG(LFS_TYPE_SUPERBLOCK, 0, 0), | ||||||
|  |                     0x7ffff000, LFS_MKTAG(LFS_TYPE_SUPERBLOCK, 0, 0), | ||||||
|  |                     source, attrs); | ||||||
|  |             if (err) { | ||||||
|  |                 if (err == LFS_ERR_CORRUPT) { | ||||||
|  |                     goto relocate; | ||||||
|  |                 } | ||||||
|  |                 return err; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (!relocated) { |         if (!relocated) { | ||||||
|  |             // commit any globals, unless we're relocating, in which case our | ||||||
|  |             // parent will steal our globals | ||||||
|             err = lfs_commit_globals(lfs, &commit, &dir->locals); |             err = lfs_commit_globals(lfs, &commit, &dir->locals); | ||||||
|             if (err) { |             if (err) { | ||||||
|                 if (err == LFS_ERR_CORRUPT) { |                 if (err == LFS_ERR_CORRUPT) { | ||||||
| @@ -1178,8 +1194,7 @@ split: | |||||||
|         // commit no longer fits, need to split dir, |         // commit no longer fits, need to split dir, | ||||||
|         // drop caches and create tail |         // drop caches and create tail | ||||||
|         lfs_cache_drop(lfs, &lfs->pcache); |         lfs_cache_drop(lfs, &lfs->pcache); | ||||||
|  |         if (!exhausted && ack < 0) { | ||||||
|         if (ack == -1) { |  | ||||||
|             // If we can't fit in this block, we won't fit in next block |             // If we can't fit in this block, we won't fit in next block | ||||||
|             return LFS_ERR_NOSPC; |             return LFS_ERR_NOSPC; | ||||||
|         } |         } | ||||||
| @@ -1190,11 +1205,16 @@ split: | |||||||
|             return err; |             return err; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         if (exhausted) { | ||||||
|  |             lfs->root[0] = tail.pair[0]; | ||||||
|  |             lfs->root[1] = tail.pair[1]; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         tail.split = dir->split; |         tail.split = dir->split; | ||||||
|         tail.tail[0] = dir->tail[0]; |         tail.tail[0] = dir->tail[0]; | ||||||
|         tail.tail[1] = dir->tail[1]; |         tail.tail[1] = dir->tail[1]; | ||||||
|  |  | ||||||
|         err = lfs_dir_compact(lfs, &tail, attrs, source, ack+1-exhausted, end); |         err = lfs_dir_compact(lfs, &tail, attrs, source, ack+1, end); | ||||||
|         if (err) { |         if (err) { | ||||||
|             return err; |             return err; | ||||||
|         } |         } | ||||||
| @@ -2770,9 +2790,19 @@ lfs_ssize_t lfs_getattr(lfs_t *lfs, const char *path, | |||||||
|         return res; |         return res; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     uint16_t id = lfs_tag_id(res); | ||||||
|  |     if (id == 0x3ff) { | ||||||
|  |         // special case for root | ||||||
|  |         id = 0; | ||||||
|  |         int err = lfs_dir_fetch(lfs, &cwd, lfs->root); | ||||||
|  |         if (err) { | ||||||
|  |             return err; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     res = lfs_dir_get(lfs, &cwd, 0x7ffff000, |     res = lfs_dir_get(lfs, &cwd, 0x7ffff000, | ||||||
|             LFS_MKTAG(0x100 | type, lfs_tag_id(res), |             LFS_MKTAG(0x100 | type, id, lfs_min(size, lfs->attr_max)), | ||||||
|                 lfs_min(size, lfs->attr_max)), buffer); |             buffer); | ||||||
|     if (res < 0 && res != LFS_ERR_NOENT) { |     if (res < 0 && res != LFS_ERR_NOENT) { | ||||||
|         return res; |         return res; | ||||||
|     } |     } | ||||||
| @@ -2792,8 +2822,18 @@ int lfs_setattr(lfs_t *lfs, const char *path, | |||||||
|         return res; |         return res; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     uint16_t id = lfs_tag_id(res); | ||||||
|  |     if (id == 0x3ff) { | ||||||
|  |         // special case for root | ||||||
|  |         id = 0; | ||||||
|  |         int err = lfs_dir_fetch(lfs, &cwd, lfs->root); | ||||||
|  |         if (err) { | ||||||
|  |             return err; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return lfs_dir_commit(lfs, &cwd, |     return lfs_dir_commit(lfs, &cwd, | ||||||
|         LFS_MKATTR(0x100 | type, lfs_tag_id(res), buffer, size, |         LFS_MKATTR(0x100 | type, id, buffer, size, | ||||||
|         NULL)); |         NULL)); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -2941,9 +2981,8 @@ int lfs_format(lfs_t *lfs, const struct lfs_config *cfg) { | |||||||
|  |  | ||||||
|     lfs_superblock_tole32(&superblock); |     lfs_superblock_tole32(&superblock); | ||||||
|     err = lfs_dir_commit(lfs, &root, |     err = lfs_dir_commit(lfs, &root, | ||||||
|             LFS_MKATTR(LFS_TYPE_SUPERBLOCK, 0, &superblock, sizeof(superblock), |             LFS_MKATTR(LFS_TYPE_ROOT, 0, &superblock, sizeof(superblock), | ||||||
|             LFS_MKATTR(LFS_TYPE_ROOT, 1, NULL, 0, |             NULL)); | ||||||
|             NULL))); |  | ||||||
|     if (err) { |     if (err) { | ||||||
|         goto cleanup; |         goto cleanup; | ||||||
|     } |     } | ||||||
| @@ -2965,15 +3004,18 @@ int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) { | |||||||
|         return err; |         return err; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // load superblock |     // find root/superblock | ||||||
|     lfs_mdir_t root; |     lfs_mdir_t root; | ||||||
|     err = lfs_dir_fetch(lfs, &root, (const lfs_block_t[2]){0, 1}); |     lfs_superblock_t superblock; | ||||||
|     if (err) { |     int32_t tag = lfs_dir_find(lfs, | ||||||
|         return err; |             &root, (const lfs_block_t[2]){0, 1}, false, 0x7fc00000, | ||||||
|  |             LFS_MKTAG(LFS_TYPE_ROOT, 0, 8), "littlefs"); | ||||||
|  |     if (tag < 0) { | ||||||
|  |         err = tag; | ||||||
|  |         goto cleanup; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     lfs_superblock_t superblock; |     int32_t res = lfs_dir_get(lfs, &root, 0x7c000000, | ||||||
|     int32_t res = lfs_dir_get(lfs, &root, 0x7fc00000, |  | ||||||
|             LFS_MKTAG(LFS_TYPE_SUPERBLOCK, 0, sizeof(superblock)), |             LFS_MKTAG(LFS_TYPE_SUPERBLOCK, 0, sizeof(superblock)), | ||||||
|             &superblock); |             &superblock); | ||||||
|     if (res < 0) { |     if (res < 0) { | ||||||
| @@ -2982,14 +3024,6 @@ int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) { | |||||||
|     } |     } | ||||||
|     lfs_superblock_fromle32(&superblock); |     lfs_superblock_fromle32(&superblock); | ||||||
|  |  | ||||||
|     // find root |  | ||||||
|     int32_t tag = lfs_dir_find(lfs, |  | ||||||
|             &root, (const lfs_block_t[2]){0, 1}, false, 0x7fc00000, |  | ||||||
|             LFS_MKTAG(LFS_TYPE_ROOT, 0, 0), NULL); |  | ||||||
|     if (tag < 0) { |  | ||||||
|         return tag; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     lfs->root[0] = root.pair[0]; |     lfs->root[0] = root.pair[0]; | ||||||
|     lfs->root[1] = root.pair[1]; |     lfs->root[1] = root.pair[1]; | ||||||
|  |  | ||||||
| @@ -3370,41 +3404,6 @@ static int lfs_fs_forceconsistency(lfs_t *lfs) { | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| lfs_ssize_t lfs_fs_getattr(lfs_t *lfs, |  | ||||||
|         uint8_t type, void *buffer, lfs_size_t size) { |  | ||||||
|     lfs_mdir_t superdir; |  | ||||||
|     int err = lfs_dir_fetch(lfs, &superdir, (const lfs_block_t[2]){0, 1}); |  | ||||||
|     if (err) { |  | ||||||
|         return err; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     int32_t res = lfs_dir_get(lfs, &superdir, 0x7ffff000, |  | ||||||
|             LFS_MKTAG(0x100 | type, 0, |  | ||||||
|                 lfs_min(size, lfs->attr_max)), buffer); |  | ||||||
|     if (res < 0) { |  | ||||||
|         return res; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     return (res == LFS_ERR_NOENT) ? 0 : lfs_tag_size(res); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int lfs_fs_setattr(lfs_t *lfs, |  | ||||||
|         uint8_t type, const void *buffer, lfs_size_t size) { |  | ||||||
|     if (size > lfs->attr_max) { |  | ||||||
|         return LFS_ERR_NOSPC; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     lfs_mdir_t superdir; |  | ||||||
|     int err = lfs_dir_fetch(lfs, &superdir, (const lfs_block_t[2]){0, 1}); |  | ||||||
|     if (err) { |  | ||||||
|         return err; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     return lfs_dir_commit(lfs, &superdir, |  | ||||||
|         LFS_MKATTR(0x100 | type, 0, buffer, size, |  | ||||||
|         NULL)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static int lfs_fs_size_count(void *p, lfs_block_t block) { | static int lfs_fs_size_count(void *p, lfs_block_t block) { | ||||||
|     (void)block; |     (void)block; | ||||||
|     lfs_size_t *size = p; |     lfs_size_t *size = p; | ||||||
|   | |||||||
							
								
								
									
										31
									
								
								lfs.h
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								lfs.h
									
									
									
									
									
								
							| @@ -94,7 +94,7 @@ enum lfs_type { | |||||||
|     // internally used types |     // internally used types | ||||||
|     LFS_TYPE_USER           = 0x100, |     LFS_TYPE_USER           = 0x100, | ||||||
|     LFS_TYPE_SUPERBLOCK     = 0x011, |     LFS_TYPE_SUPERBLOCK     = 0x011, | ||||||
|     LFS_TYPE_ROOT           = 0x012, |     LFS_TYPE_ROOT           = 0x010, | ||||||
|     LFS_TYPE_NAME           = 0x000, |     LFS_TYPE_NAME           = 0x000, | ||||||
|     LFS_TYPE_DELETE         = 0x030, |     LFS_TYPE_DELETE         = 0x030, | ||||||
|     LFS_TYPE_STRUCT         = 0x040, |     LFS_TYPE_STRUCT         = 0x040, | ||||||
| @@ -624,35 +624,6 @@ lfs_ssize_t lfs_fs_size(lfs_t *lfs); | |||||||
| // Returns a negative error code on failure. | // Returns a negative error code on failure. | ||||||
| int lfs_fs_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data); | int lfs_fs_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data); | ||||||
|  |  | ||||||
| // Get custom attributes on the filesystem |  | ||||||
| // |  | ||||||
| // Custom attributes are uniquely identified by an 8-bit type and limited |  | ||||||
| // to LFS_ATTR_MAX bytes. When read, if the stored attribute is smaller than |  | ||||||
| // the buffer, it will be padded with zeros. If the stored attribute is larger, |  | ||||||
| // then it will be silently truncated. |  | ||||||
| // |  | ||||||
| // Note, filesystem-level attributes are not available for wear-leveling |  | ||||||
| // |  | ||||||
| // Returns the size of the attribute, or a negative error code on failure. |  | ||||||
| // Note, the returned size is the size of the attribute on disk, irrespective |  | ||||||
| // of the size of the buffer. This can be used to dynamically allocate a buffer |  | ||||||
| // or check for existance. |  | ||||||
| lfs_ssize_t lfs_fs_getattr(lfs_t *lfs, |  | ||||||
|         uint8_t type, void *buffer, lfs_size_t size); |  | ||||||
|  |  | ||||||
| // Set custom attributes on the filesystem |  | ||||||
| // |  | ||||||
| // Custom attributes are uniquely identified by an 8-bit type and limited |  | ||||||
| // to LFS_ATTR_MAX bytes. If an attribute is not found, it will be |  | ||||||
| // implicitly created, and setting the size of an attribute to zero deletes |  | ||||||
| // the attribute. |  | ||||||
| // |  | ||||||
| // Note, filesystem-level attributes are not available for wear-leveling |  | ||||||
| // |  | ||||||
| // Returns a negative error code on failure. |  | ||||||
| int lfs_fs_setattr(lfs_t *lfs, |  | ||||||
|         uint8_t type, const void *buffer, lfs_size_t size); |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } /* extern "C" */ | } /* extern "C" */ | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ TYPES = { | |||||||
|     (0x1ff, 0x001): 'reg', |     (0x1ff, 0x001): 'reg', | ||||||
|     (0x1ff, 0x002): 'dir', |     (0x1ff, 0x002): 'dir', | ||||||
|     (0x1ff, 0x011): 'superblock', |     (0x1ff, 0x011): 'superblock', | ||||||
|     (0x1ff, 0x012): 'root', |     (0x1ff, 0x010): 'root', | ||||||
|     (0x1ff, 0x030): 'delete', |     (0x1ff, 0x030): 'delete', | ||||||
|     (0x1f0, 0x080): 'globals', |     (0x1f0, 0x080): 'globals', | ||||||
|     (0x1ff, 0x0c0): 'tail soft', |     (0x1ff, 0x0c0): 'tail soft', | ||||||
| @@ -50,9 +50,13 @@ def main(*blocks): | |||||||
|                 crc = ncrc |                 crc = ncrc | ||||||
|  |  | ||||||
|             versions.append((nrev, '%s (rev %d)' % (block, nrev))) |             versions.append((nrev, '%s (rev %d)' % (block, nrev))) | ||||||
|         except IOError: |         except (IOError, struct.error): | ||||||
|             pass |             pass | ||||||
|  |  | ||||||
|  |     if not file: | ||||||
|  |         print 'Bad metadata pair {%s}' % ', '.join(blocks) | ||||||
|  |         return 1 | ||||||
|  |  | ||||||
|     print "--- %s ---" % ', '.join(v for _,v in sorted(versions, reverse=True)) |     print "--- %s ---" % ', '.join(v for _,v in sorted(versions, reverse=True)) | ||||||
|  |  | ||||||
|     # go through each tag, print useful information |     # go through each tag, print useful information | ||||||
| @@ -93,6 +97,8 @@ def main(*blocks): | |||||||
|         if type == 0x0f0: |         if type == 0x0f0: | ||||||
|             crc = 0 |             crc = 0 | ||||||
|  |  | ||||||
|  |     return 0 | ||||||
|  |  | ||||||
| if __name__ == "__main__": | if __name__ == "__main__": | ||||||
|     import sys |     import sys | ||||||
|     main(*sys.argv[1:]) |     sys.exit(main(*sys.argv[1:])) | ||||||
|   | |||||||
| @@ -77,55 +77,55 @@ tests/test.py << TEST | |||||||
|     lfs_unmount(&lfs) => 0; |     lfs_unmount(&lfs) => 0; | ||||||
| TEST | TEST | ||||||
|  |  | ||||||
| echo "--- Set/get fs attribute ---" | echo "--- Set/get root attribute ---" | ||||||
| tests/test.py << TEST | tests/test.py << TEST | ||||||
|     lfs_mount(&lfs, &cfg) => 0; |     lfs_mount(&lfs, &cfg) => 0; | ||||||
|     lfs_fs_setattr(&lfs, 'A', "aaaa",   4) => 0; |     lfs_setattr(&lfs, "/", 'A', "aaaa",   4) => 0; | ||||||
|     lfs_fs_setattr(&lfs, 'B', "bbbbbb", 6) => 0; |     lfs_setattr(&lfs, "/", 'B', "bbbbbb", 6) => 0; | ||||||
|     lfs_fs_setattr(&lfs, 'C', "ccccc",  5) => 0; |     lfs_setattr(&lfs, "/", 'C', "ccccc",  5) => 0; | ||||||
|     lfs_fs_getattr(&lfs, 'A', buffer,    4) => 4; |     lfs_getattr(&lfs, "/", 'A', buffer,    4) => 4; | ||||||
|     lfs_fs_getattr(&lfs, 'B', buffer+4,  6) => 6; |     lfs_getattr(&lfs, "/", 'B', buffer+4,  6) => 6; | ||||||
|     lfs_fs_getattr(&lfs, 'C', buffer+10, 5) => 5; |     lfs_getattr(&lfs, "/", 'C', buffer+10, 5) => 5; | ||||||
|     memcmp(buffer,    "aaaa",   4) => 0; |     memcmp(buffer,    "aaaa",   4) => 0; | ||||||
|     memcmp(buffer+4,  "bbbbbb", 6) => 0; |     memcmp(buffer+4,  "bbbbbb", 6) => 0; | ||||||
|     memcmp(buffer+10, "ccccc",  5) => 0; |     memcmp(buffer+10, "ccccc",  5) => 0; | ||||||
|  |  | ||||||
|     lfs_fs_setattr(&lfs, 'B', "", 0) => 0; |     lfs_setattr(&lfs, "/", 'B', "", 0) => 0; | ||||||
|     lfs_fs_getattr(&lfs, 'A', buffer,    4) => 4; |     lfs_getattr(&lfs, "/", 'A', buffer,    4) => 4; | ||||||
|     lfs_fs_getattr(&lfs, 'B', buffer+4,  6) => 0; |     lfs_getattr(&lfs, "/", 'B', buffer+4,  6) => 0; | ||||||
|     lfs_fs_getattr(&lfs, 'C', buffer+10, 5) => 5; |     lfs_getattr(&lfs, "/", 'C', buffer+10, 5) => 5; | ||||||
|     memcmp(buffer,    "aaaa",         4) => 0; |     memcmp(buffer,    "aaaa",         4) => 0; | ||||||
|     memcmp(buffer+4,  "\0\0\0\0\0\0", 6) => 0; |     memcmp(buffer+4,  "\0\0\0\0\0\0", 6) => 0; | ||||||
|     memcmp(buffer+10, "ccccc",        5) => 0; |     memcmp(buffer+10, "ccccc",        5) => 0; | ||||||
|  |  | ||||||
|     lfs_fs_setattr(&lfs, 'B', "dddddd", 6) => 0; |     lfs_setattr(&lfs, "/", 'B', "dddddd", 6) => 0; | ||||||
|     lfs_fs_getattr(&lfs, 'A', buffer,    4) => 4; |     lfs_getattr(&lfs, "/", 'A', buffer,    4) => 4; | ||||||
|     lfs_fs_getattr(&lfs, 'B', buffer+4,  6) => 6; |     lfs_getattr(&lfs, "/", 'B', buffer+4,  6) => 6; | ||||||
|     lfs_fs_getattr(&lfs, 'C', buffer+10, 5) => 5; |     lfs_getattr(&lfs, "/", 'C', buffer+10, 5) => 5; | ||||||
|     memcmp(buffer,    "aaaa",   4) => 0; |     memcmp(buffer,    "aaaa",   4) => 0; | ||||||
|     memcmp(buffer+4,  "dddddd", 6) => 0; |     memcmp(buffer+4,  "dddddd", 6) => 0; | ||||||
|     memcmp(buffer+10, "ccccc",  5) => 0; |     memcmp(buffer+10, "ccccc",  5) => 0; | ||||||
|  |  | ||||||
|     lfs_fs_setattr(&lfs, 'B', "eee", 3) => 0; |     lfs_setattr(&lfs, "/", 'B', "eee", 3) => 0; | ||||||
|     lfs_fs_getattr(&lfs, 'A', buffer,    4) => 4; |     lfs_getattr(&lfs, "/", 'A', buffer,    4) => 4; | ||||||
|     lfs_fs_getattr(&lfs, 'B', buffer+4,  6) => 3; |     lfs_getattr(&lfs, "/", 'B', buffer+4,  6) => 3; | ||||||
|     lfs_fs_getattr(&lfs, 'C', buffer+10, 5) => 5; |     lfs_getattr(&lfs, "/", 'C', buffer+10, 5) => 5; | ||||||
|     memcmp(buffer,    "aaaa",      4) => 0; |     memcmp(buffer,    "aaaa",      4) => 0; | ||||||
|     memcmp(buffer+4,  "eee\0\0\0", 6) => 0; |     memcmp(buffer+4,  "eee\0\0\0", 6) => 0; | ||||||
|     memcmp(buffer+10, "ccccc",     5) => 0; |     memcmp(buffer+10, "ccccc",     5) => 0; | ||||||
|  |  | ||||||
|     lfs_fs_setattr(&lfs, 'A', buffer, LFS_ATTR_MAX+1) => LFS_ERR_NOSPC; |     lfs_setattr(&lfs, "/", 'A', buffer, LFS_ATTR_MAX+1) => LFS_ERR_NOSPC; | ||||||
|     lfs_fs_setattr(&lfs, 'B', "fffffffff", 9) => 0; |     lfs_setattr(&lfs, "/", 'B', "fffffffff", 9) => 0; | ||||||
|     lfs_fs_getattr(&lfs, 'A', buffer,    4) => 4; |     lfs_getattr(&lfs, "/", 'A', buffer,    4) => 4; | ||||||
|     lfs_fs_getattr(&lfs, 'B', buffer+4,  6) => 9; |     lfs_getattr(&lfs, "/", 'B', buffer+4,  6) => 9; | ||||||
|     lfs_fs_getattr(&lfs, 'C', buffer+10, 5) => 5; |     lfs_getattr(&lfs, "/", 'C', buffer+10, 5) => 5; | ||||||
|     lfs_unmount(&lfs) => 0; |     lfs_unmount(&lfs) => 0; | ||||||
| TEST | TEST | ||||||
| tests/test.py << TEST | tests/test.py << TEST | ||||||
|     lfs_mount(&lfs, &cfg) => 0; |     lfs_mount(&lfs, &cfg) => 0; | ||||||
|     lfs_fs_getattr(&lfs, 'A', buffer,    4) => 4; |     lfs_getattr(&lfs, "/", 'A', buffer,    4) => 4; | ||||||
|     lfs_fs_getattr(&lfs, 'B', buffer+4,  9) => 9; |     lfs_getattr(&lfs, "/", 'B', buffer+4,  9) => 9; | ||||||
|     lfs_fs_getattr(&lfs, 'C', buffer+13, 5) => 5; |     lfs_getattr(&lfs, "/", 'C', buffer+13, 5) => 5; | ||||||
|     memcmp(buffer,    "aaaa",      4) => 0; |     memcmp(buffer,    "aaaa",      4) => 0; | ||||||
|     memcmp(buffer+4,  "fffffffff", 9) => 0; |     memcmp(buffer+4,  "fffffffff", 9) => 0; | ||||||
|     memcmp(buffer+13, "ccccc",     5) => 0; |     memcmp(buffer+13, "ccccc",     5) => 0; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user