PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
inode.c
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright 2001-2004, ps2dev - http://www.ps2dev.org
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9#
10# PFS low-level inode manipulation routines
11*/
12
13#include <errno.h>
14#include <stdio.h>
15#ifdef _IOP
16#include <sysclib.h>
17#else
18#include <string.h>
19#endif
20
21#include "libpfs.h"
22
23extern u32 pfsMetaSize;
24
26// Function definitions
27
28void pfsInodePrint(pfs_inode_t *inode)
29{
30 PFS_PRINTF(PFS_DRV_NAME": pfsInodePrint: Checksum = 0x%lX, Magic = 0x%lX\n", inode->checksum, inode->magic);
31 PFS_PRINTF(PFS_DRV_NAME": Mode = 0x%X, attr = 0x%X\n", inode->mode, inode->attr);
32 PFS_PRINTF(PFS_DRV_NAME": size = 0x%08lX%08lX\n", (u32)(inode->size >> 32), (u32)(inode->size));
33}
34
35int pfsInodeCheckSum(pfs_inode_t *inode)
36{
37 u32 *ptr=(u32 *)inode;
38 u32 sum=0;
39 int i;
40
41 for(i=1; i < 256; i++)
42 sum+=ptr[i];
43 return sum;
44}
45
46pfs_cache_t *pfsInodeGetData(pfs_mount_t *pfsMount, u16 sub, u32 inode, int *result)
47{
48 return pfsCacheGetData(pfsMount, sub, inode << pfsMount->inode_scale,
49 PFS_CACHE_FLAG_SEGD, result);
50}
51
52void pfsInodeSetTime(pfs_cache_t *clink)
53{ // set the inode time's in cache
54 pfsGetTime(&clink->u.inode->mtime);
55 memcpy(&clink->u.inode->ctime, &clink->u.inode->mtime, sizeof(pfs_datetime_t));
56 memcpy(&clink->u.inode->atime, &clink->u.inode->mtime, sizeof(pfs_datetime_t));
57 clink->flags|=PFS_CACHE_FLAG_DIRTY;
58}
59
60void pfsInodeSetTimeParent(pfs_cache_t *parent, pfs_cache_t *self)
61{ // set the inode time's in cache
62 pfsInodeSetTime(parent);
63 self->flags|=PFS_CACHE_FLAG_DIRTY;
64}
65
66int pfsInodeSync(pfs_blockpos_t *blockpos, u64 size, u32 used_segments)
67{
68 int result=0;
69 u32 i;
70 u16 count;
71
72 for(i=pfsBlockSyncPos(blockpos, size); i; )
73 {
74 count=blockpos->inode->u.inode->data[pfsFixIndex(blockpos->block_segment)].count;
75
76 i+=blockpos->block_offset;
77
78 if (i < count){
79 blockpos->block_offset=i;
80 break;
81 }
82
83 i-=count;
84
85 if (blockpos->block_segment + 1 == used_segments)
86 {
87 blockpos->block_offset=count;
88 if (i || blockpos->byte_offset){
89 PFS_PRINTF(PFS_DRV_NAME": panic: fp exceeds file.\n");
90 return -EINVAL;
91 }
92 }else{
93 blockpos->block_offset=0;
94 blockpos->block_segment++;
95 }
96
97 if (pfsFixIndex(blockpos->block_segment))
98 continue;
99
100 if ((blockpos->inode = pfsBlockGetNextSegment(blockpos->inode, &result)) == 0)
101 break;
102
103 i++;
104 }
105
106 return result;
107}
108
109pfs_cache_t *pfsGetDentriesChunk(pfs_blockpos_t *position, int *result)
110{
111 pfs_blockinfo_t *bi;
112 pfs_mount_t *pfsMount=position->inode->pfsMount;
113
114 bi = &position->inode->u.inode->data[pfsFixIndex(position->block_segment)];
115
116 return pfsCacheGetData(pfsMount, bi->subpart,
117 ((bi->number + position->block_offset) << pfsMount->inode_scale) +
118 position->byte_offset / pfsMetaSize, PFS_CACHE_FLAG_NOTHING, result);
119}
120
121pfs_cache_t *pfsGetDentriesAtPos(pfs_cache_t *clink, u64 position, int *offset, int *result)
122{
123 pfs_blockpos_t blockpos;
124 pfs_cache_t *r;
125 *result=pfsBlockInitPos(clink, &blockpos, position);
126 if (*result) return 0;
127
128 *offset=blockpos.byte_offset % pfsMetaSize;
129
130 r=pfsGetDentriesChunk(&blockpos, result);
131 pfsCacheFree(blockpos.inode);
132
133 return r;
134}
#define EINVAL
Definition errno.h:63
u32 count
start sector of fragmented bd/file