File indexing completed on 2025-05-11 08:24:12
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041 #if !defined (_RTEMS_RFS_INODE_H_)
0042 #define _RTEMS_RFS_INODE_H_
0043
0044 #include <sys/stat.h>
0045
0046 #include <rtems/rfs/rtems-rfs-data.h>
0047 #include <rtems/rfs/rtems-rfs-file-system.h>
0048
0049
0050
0051
0052 #define RTEMS_RFS_S_ISUID S_ISUID
0053 #define RTEMS_RFS_S_ISGID S_ISGID
0054 #define RTEMS_RFS_S_ISVTX S_ISVTX
0055 #define RTEMS_RFS_S_IREAD S_IREAD
0056 #define RTEMS_RFS_S_IWRITE S_IWRITE
0057 #define RTEMS_RFS_S_IEXEC S_IEXEC
0058 #define RTEMS_RFS_S_ENFMT S_ENFMT
0059 #define RTEMS_RFS_S_IFMT S_IFMT
0060 #define RTEMS_RFS_S_IFDIR S_IFDIR
0061 #define RTEMS_RFS_S_IFCHR S_IFCHR
0062 #define RTEMS_RFS_S_IFBLK S_IFBLK
0063 #define RTEMS_RFS_S_IFREG S_IFREG
0064 #define RTEMS_RFS_S_IFLNK S_IFLNK
0065 #define RTEMS_RFS_S_IFSOCK S_IFSOCK
0066 #define RTEMS_RFS_S_IFIFO S_IFIFO
0067 #define RTEMS_RFS_S_IRWXU S_IRWXU
0068 #define RTEMS_RFS_S_IRUSR S_IRUSR
0069 #define RTEMS_RFS_S_IWUSR S_IWUSR
0070 #define RTEMS_RFS_S_IXUSR S_IXUSR
0071 #define RTEMS_RFS_S_IRWXG S_IRWXG
0072 #define RTEMS_RFS_S_IRGRP S_IRGRP
0073 #define RTEMS_RFS_S_IWGRP S_IWGRP
0074 #define RTEMS_RFS_S_IXGRP S_IXGRP
0075 #define RTEMS_RFS_S_IRWXO S_IRWXO
0076 #define RTEMS_RFS_S_IROTH S_IROTH
0077 #define RTEMS_RFS_S_IWOTH S_IWOTH
0078 #define RTEMS_RFS_S_IXOTH S_IXOTH
0079
0080 #define RTEMS_RFS_S_ISBLK(m) S_ISBLK(m)
0081 #define RTEMS_RFS_S_ISCHR(m) S_ISCHR(m)
0082 #define RTEMS_RFS_S_ISDIR(m) S_ISDIR(m)
0083 #define RTEMS_RFS_S_ISFIFO(m) S_ISFIFO(m)
0084 #define RTEMS_RFS_S_ISREG(m) S_ISREG(m)
0085 #define RTEMS_RFS_S_ISLNK(m) S_ISLNK(m)
0086 #define RTEMS_RFS_S_ISSOCK(m) S_ISSOCK(m)
0087
0088
0089
0090
0091 #define RTEMS_RFS_S_SYMLINK \
0092 RTEMS_RFS_S_IFLNK | RTEMS_RFS_S_IRWXU | RTEMS_RFS_S_IRWXG | RTEMS_RFS_S_IRWXO
0093
0094
0095
0096
0097 typedef uint32_t rtems_rfs_ino;
0098
0099
0100
0101
0102 typedef uint32_t rtems_rfs_time;
0103
0104
0105
0106
0107
0108 typedef uint32_t rtems_rfs_inode_block;
0109
0110
0111
0112
0113 #define RTEMS_RFS_INODE_DATA_NAME_SIZE \
0114 (RTEMS_RFS_INODE_BLOCKS * sizeof (rtems_rfs_inode_block))
0115
0116
0117
0118
0119 typedef struct _rtems_rfs_inode
0120 {
0121
0122
0123
0124 uint16_t links;
0125
0126
0127
0128
0129 uint16_t mode;
0130
0131
0132
0133
0134 uint32_t owner;
0135
0136
0137
0138
0139 uint16_t flags;
0140
0141
0142
0143
0144 uint16_t block_offset;
0145
0146
0147
0148
0149 uint32_t block_count;
0150
0151
0152
0153
0154 rtems_rfs_time atime;
0155
0156
0157
0158
0159 rtems_rfs_time mtime;
0160
0161
0162
0163
0164 rtems_rfs_time ctime;
0165
0166
0167
0168
0169
0170
0171
0172
0173 union
0174 {
0175 rtems_rfs_inode_block blocks[RTEMS_RFS_INODE_BLOCKS];
0176 uint8_t name[RTEMS_RFS_INODE_DATA_NAME_SIZE];
0177 } data;
0178
0179
0180
0181
0182
0183 rtems_rfs_inode_block last_map_block;
0184
0185
0186
0187
0188 rtems_rfs_inode_block last_data_block;
0189
0190 } rtems_rfs_inode;
0191
0192
0193
0194
0195 #define RTEMS_RFS_INODE_SIZE (sizeof (rtems_rfs_inode))
0196
0197
0198
0199
0200 typedef struct _rtems_rfs_inode_handle
0201 {
0202
0203
0204
0205 rtems_chain_node link;
0206
0207
0208
0209
0210 rtems_rfs_ino ino;
0211
0212
0213
0214
0215 rtems_rfs_inode* node;
0216
0217
0218
0219
0220 rtems_rfs_buffer_handle buffer;
0221
0222
0223
0224
0225 rtems_rfs_buffer_block block;
0226
0227
0228
0229
0230 int offset;
0231
0232
0233
0234
0235 int loads;
0236
0237 } rtems_rfs_inode_handle;
0238
0239
0240
0241
0242 #define rtems_rfs_inode_is_loaded(_h) ((_h)->node)
0243
0244
0245
0246
0247 #define rtems_rfs_inode_ino(_h) ((_h)->ino)
0248
0249
0250
0251
0252
0253
0254
0255
0256 static inline uint16_t
0257 rtems_rfs_inode_get_links (rtems_rfs_inode_handle* handle)
0258 {
0259 uint16_t links;
0260 links = rtems_rfs_read_u16 (&handle->node->links);
0261 if (links == 0xffff)
0262 links = 0;
0263 return links;
0264 }
0265
0266
0267
0268
0269
0270
0271
0272 static inline void
0273 rtems_rfs_inode_set_links (rtems_rfs_inode_handle* handle, uint16_t links)
0274 {
0275 rtems_rfs_write_u16 (&handle->node->links, links);
0276 rtems_rfs_buffer_mark_dirty (&handle->buffer);
0277 }
0278
0279
0280
0281
0282
0283
0284
0285
0286 static inline uint16_t
0287 rtems_rfs_inode_get_flags (rtems_rfs_inode_handle* handle)
0288 {
0289 return rtems_rfs_read_u16 (&handle->node->flags);
0290 }
0291
0292
0293
0294
0295
0296
0297
0298 static inline void
0299 rtems_rfs_inode_set_flags (rtems_rfs_inode_handle* handle, uint16_t flags)
0300 {
0301 rtems_rfs_write_u16 (&handle->node->flags, flags);
0302 rtems_rfs_buffer_mark_dirty (&handle->buffer);
0303 }
0304
0305
0306
0307
0308
0309
0310
0311
0312 static inline uint16_t
0313 rtems_rfs_inode_get_mode (rtems_rfs_inode_handle* handle)
0314 {
0315 return rtems_rfs_read_u16 (&handle->node->mode);
0316 }
0317
0318
0319
0320
0321
0322
0323
0324 static inline void
0325 rtems_rfs_inode_set_mode (rtems_rfs_inode_handle* handle, uint16_t mode)
0326 {
0327 rtems_rfs_write_u16 (&handle->node->mode, mode);
0328 rtems_rfs_buffer_mark_dirty (&handle->buffer);
0329 }
0330
0331
0332
0333
0334
0335
0336
0337
0338 static inline uint16_t
0339 rtems_rfs_inode_get_uid (rtems_rfs_inode_handle* handle)
0340 {
0341 return rtems_rfs_read_u32 (&handle->node->owner) & 0xffff;
0342 }
0343
0344
0345
0346
0347
0348
0349
0350
0351 static inline uint16_t
0352 rtems_rfs_inode_get_gid (rtems_rfs_inode_handle* handle)
0353 {
0354 return (rtems_rfs_read_u32 (&handle->node->owner) >> 16) & 0xffff;
0355 }
0356
0357
0358
0359
0360
0361
0362
0363
0364 static inline void
0365 rtems_rfs_inode_set_uid_gid (rtems_rfs_inode_handle* handle,
0366 uint16_t uid, uint16_t gid)
0367 {
0368 rtems_rfs_write_u32 (&handle->node->owner, (((uint32_t) gid) << 16) | uid);
0369 rtems_rfs_buffer_mark_dirty (&handle->buffer);
0370 }
0371
0372
0373
0374
0375
0376
0377
0378
0379 static inline uint16_t
0380 rtems_rfs_inode_get_block_offset (rtems_rfs_inode_handle* handle)
0381 {
0382 return rtems_rfs_read_u16 (&handle->node->block_offset);
0383 }
0384
0385
0386
0387
0388
0389
0390
0391 static inline void
0392 rtems_rfs_inode_set_block_offset (rtems_rfs_inode_handle* handle,
0393 uint16_t block_offset)
0394 {
0395 rtems_rfs_write_u16 (&handle->node->block_offset, block_offset);
0396 rtems_rfs_buffer_mark_dirty (&handle->buffer);
0397 }
0398
0399
0400
0401
0402
0403
0404
0405
0406 static inline uint32_t
0407 rtems_rfs_inode_get_block_count (rtems_rfs_inode_handle* handle)
0408 {
0409 return rtems_rfs_read_u32 (&handle->node->block_count);
0410 }
0411
0412
0413
0414
0415
0416
0417
0418 static inline void
0419 rtems_rfs_inode_set_block_count (rtems_rfs_inode_handle* handle, uint32_t block_count)
0420 {
0421 rtems_rfs_write_u32 (&handle->node->block_count, block_count);
0422 rtems_rfs_buffer_mark_dirty (&handle->buffer);
0423 }
0424
0425
0426
0427
0428
0429
0430
0431
0432 static inline rtems_rfs_time
0433 rtems_rfs_inode_get_atime (rtems_rfs_inode_handle* handle)
0434 {
0435 return rtems_rfs_read_u32 (&handle->node->atime);
0436 }
0437
0438
0439
0440
0441
0442
0443
0444 static inline void
0445 rtems_rfs_inode_set_atime (rtems_rfs_inode_handle* handle,
0446 rtems_rfs_time atime)
0447 {
0448 rtems_rfs_write_u32 (&handle->node->atime, atime);
0449 rtems_rfs_buffer_mark_dirty (&handle->buffer);
0450 }
0451
0452
0453
0454
0455
0456
0457
0458
0459 static inline rtems_rfs_time
0460 rtems_rfs_inode_get_mtime (rtems_rfs_inode_handle* handle)
0461 {
0462 return rtems_rfs_read_u32 (&handle->node->mtime);
0463 }
0464
0465
0466
0467
0468
0469
0470
0471 static inline void
0472 rtems_rfs_inode_set_mtime (rtems_rfs_inode_handle* handle,
0473 rtems_rfs_time mtime)
0474 {
0475 rtems_rfs_write_u32 (&handle->node->mtime, mtime);
0476 rtems_rfs_buffer_mark_dirty (&handle->buffer);
0477 }
0478
0479
0480
0481
0482
0483
0484
0485
0486 static inline rtems_rfs_time
0487 rtems_rfs_inode_get_ctime (rtems_rfs_inode_handle* handle)
0488 {
0489 return rtems_rfs_read_u32 (&handle->node->ctime);
0490 }
0491
0492
0493
0494
0495
0496
0497
0498 static inline void
0499 rtems_rfs_inode_set_ctime (rtems_rfs_inode_handle* handle,
0500 rtems_rfs_time ctime)
0501 {
0502 rtems_rfs_write_u32 (&handle->node->ctime, ctime);
0503 rtems_rfs_buffer_mark_dirty (&handle->buffer);
0504 }
0505
0506
0507
0508
0509
0510
0511
0512
0513
0514 static inline uint32_t
0515 rtems_rfs_inode_get_block (rtems_rfs_inode_handle* handle, int block)
0516 {
0517 return rtems_rfs_read_u32 (&handle->node->data.blocks[block]);
0518 }
0519
0520
0521
0522
0523
0524
0525
0526
0527 static inline void
0528 rtems_rfs_inode_set_block (rtems_rfs_inode_handle* handle, int block, uint32_t bno)
0529 {
0530 rtems_rfs_write_u32 (&handle->node->data.blocks[block], bno);
0531 rtems_rfs_buffer_mark_dirty (&handle->buffer);
0532 }
0533
0534
0535
0536
0537
0538
0539
0540
0541 static inline uint32_t
0542 rtems_rfs_inode_get_last_map_block (rtems_rfs_inode_handle* handle)
0543 {
0544 return rtems_rfs_read_u32 (&handle->node->last_map_block);
0545 }
0546
0547
0548
0549
0550
0551
0552
0553 static inline void
0554 rtems_rfs_inode_set_last_map_block (rtems_rfs_inode_handle* handle, uint32_t last_map_block)
0555 {
0556 rtems_rfs_write_u32 (&handle->node->last_map_block, last_map_block);
0557 rtems_rfs_buffer_mark_dirty (&handle->buffer);
0558 }
0559
0560
0561
0562
0563
0564
0565
0566
0567
0568 static inline uint32_t
0569 rtems_rfs_inode_get_last_data_block (rtems_rfs_inode_handle* handle)
0570 {
0571 return rtems_rfs_read_u32 (&handle->node->last_data_block);
0572 }
0573
0574
0575
0576
0577
0578
0579
0580 static inline void
0581 rtems_rfs_inode_set_last_data_block (rtems_rfs_inode_handle* handle, uint32_t last_data_block)
0582 {
0583 rtems_rfs_write_u32 (&handle->node->last_data_block, last_data_block);
0584 rtems_rfs_buffer_mark_dirty (&handle->buffer);
0585 }
0586
0587
0588
0589
0590
0591
0592
0593
0594
0595
0596 int rtems_rfs_inode_alloc (rtems_rfs_file_system* fs,
0597 rtems_rfs_bitmap_bit goal,
0598 rtems_rfs_ino* ino);
0599
0600
0601
0602
0603
0604
0605
0606
0607
0608
0609 int rtems_rfs_inode_free (rtems_rfs_file_system* fs,
0610 rtems_rfs_ino ino);
0611
0612
0613
0614
0615
0616
0617
0618
0619
0620
0621
0622
0623
0624
0625 int rtems_rfs_inode_open (rtems_rfs_file_system* fs,
0626 rtems_rfs_ino ino,
0627 rtems_rfs_inode_handle* handle,
0628 bool load);
0629
0630
0631
0632
0633
0634
0635
0636
0637
0638
0639 int rtems_rfs_inode_close (rtems_rfs_file_system* fs,
0640 rtems_rfs_inode_handle* handle);
0641
0642
0643
0644
0645
0646
0647
0648
0649
0650
0651 int rtems_rfs_inode_load (rtems_rfs_file_system* fs,
0652 rtems_rfs_inode_handle* handle);
0653
0654
0655
0656
0657
0658
0659
0660
0661
0662
0663
0664 int rtems_rfs_inode_unload (rtems_rfs_file_system* fs,
0665 rtems_rfs_inode_handle* handle,
0666 bool update_ctime);
0667
0668
0669
0670
0671
0672
0673
0674
0675
0676
0677
0678 int rtems_rfs_inode_create (rtems_rfs_file_system* fs,
0679 rtems_rfs_ino parent,
0680 const char* name,
0681 size_t length,
0682 uint16_t mode,
0683 uint16_t links,
0684 uid_t uid,
0685 gid_t gid,
0686 rtems_rfs_ino* ino);
0687
0688
0689
0690
0691
0692
0693
0694
0695
0696
0697
0698 int rtems_rfs_inode_delete (rtems_rfs_file_system* fs,
0699 rtems_rfs_inode_handle* handle);
0700
0701
0702
0703
0704
0705
0706
0707
0708
0709
0710
0711
0712
0713 int rtems_rfs_inode_initialise (rtems_rfs_inode_handle* handle,
0714 uint16_t links,
0715 uint16_t mode,
0716 uid_t uid,
0717 gid_t gid);
0718
0719
0720
0721
0722
0723
0724
0725
0726
0727
0728
0729
0730
0731 int rtems_rfs_inode_time_stamp_now (rtems_rfs_inode_handle* handle,
0732 bool atime,
0733 bool mtime);
0734
0735
0736
0737
0738
0739
0740
0741
0742
0743 rtems_rfs_pos rtems_rfs_inode_get_size (rtems_rfs_file_system* fs,
0744 rtems_rfs_inode_handle* handle);
0745
0746 #endif
0747