annotate direct/yaffsfs.c @ 341:89e691a21fd1

Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
author charles <charles>
date Wed, 06 Jan 2010 04:00:23 +0000
parents 490a804b7bd3
children ce702882929d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1 /*
167
582d5458b4c6 normalise licence headers
wookey <wookey>
parents: 163
diff changeset
2 * YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
3 *
167
582d5458b4c6 normalise licence headers
wookey <wookey>
parents: 163
diff changeset
4 * Copyright (C) 2002-2007 Aleph One Ltd.
582d5458b4c6 normalise licence headers
wookey <wookey>
parents: 163
diff changeset
5 * for Toby Churchill Ltd and Brightstar Engineering
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
6 *
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
7 * Created by Charles Manning <charles@aleph1.co.uk>
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
8 *
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
9 * This program is free software; you can redistribute it and/or modify
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
10 * it under the terms of the GNU General Public License version 2 as
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
11 * published by the Free Software Foundation.
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
12 */
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
13
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
14 #include "yaffsfs.h"
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
15 #include "yaffs_guts.h"
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
16 #include "yaffscfg.h"
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
17 #include <string.h> // for memset
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
18 #include "yportenv.h"
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
19
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
20 #define YAFFSFS_MAX_SYMLINK_DEREFERENCES 5
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
21
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
22 #ifndef NULL
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
23 #define NULL ((void *)0)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
24 #endif
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
25
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
26
341
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
27 const char *yaffsfs_c_version="$Id: yaffsfs.c,v 1.30 2010-01-06 04:00:23 charles Exp $";
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
28
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
29 // configurationList is the list of devices that are supported
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
30 static yaffsfs_DeviceConfiguration *yaffsfs_configurationList;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
31
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
32
81
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
33 /* Some forward references */
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
34 static yaffs_Object *yaffsfs_FindObject(yaffs_Object *relativeDirectory, const YCHAR *path, int symDepth);
81
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
35 static void yaffsfs_RemoveObjectCallback(yaffs_Object *obj);
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
36
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
37
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
38 // Handle management.
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
39 //
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
40
179
2c3cea26b1ca Rolling in Ians and other changes
charles <charles>
parents: 171
diff changeset
41
2c3cea26b1ca Rolling in Ians and other changes
charles <charles>
parents: 171
diff changeset
42 unsigned int yaffs_wr_attempts;
2c3cea26b1ca Rolling in Ians and other changes
charles <charles>
parents: 171
diff changeset
43
341
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
44 typedef struct {
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
45 int count;
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
46 yaffs_Object *iObj;
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
47 } yaffsfs_Inode;
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
48
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
49 typedef struct{
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
50 __u8 inUse:1; // this handle is in use
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
51 __u8 readOnly:1; // this handle is read only
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
52 __u8 append:1; // append only
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
53 __u8 exclusive:1; // exclusive
341
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
54 int inodeId:20; // the object
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
55 __u32 position; // current position in file
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
56 }yaffsfs_Handle;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
57
341
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
58 static yaffsfs_Inode yaffsfs_inode[YAFFSFS_N_HANDLES];
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
59 static yaffsfs_Handle yaffsfs_handle[YAFFSFS_N_HANDLES];
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
60
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
61 // yaffsfs_InitHandle
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
62 /// Inilitalise handles on start-up.
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
63 //
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
64 static int yaffsfs_InitHandles(void)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
65 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
66 int i;
341
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
67 memset(yaffsfs_inode,0,sizeof(yaffsfs_inode));
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
68 memset(yaffsfs_handle,0,sizeof(yaffsfs_handle));
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
69 for(i = 0; i < YAFFSFS_N_HANDLES; i++)
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
70 yaffsfs_handle[i].inodeId = -1;
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
71
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
72 return 0;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
73 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
74
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
75 yaffsfs_Handle *yaffsfs_GetHandlePointer(int h)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
76 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
77 if(h < 0 || h >= YAFFSFS_N_HANDLES)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
78 return NULL;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
79
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
80 return &yaffsfs_handle[h];
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
81 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
82
341
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
83 yaffsfs_Inode *yaffsfs_GetInodePointer(int handle)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
84 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
85 yaffsfs_Handle *h = yaffsfs_GetHandlePointer(handle);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
86
341
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
87 if(h && h->inUse && h->inodeId >= 0 && h->inodeId < YAFFSFS_N_HANDLES)
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
88 return &yaffsfs_inode[h->inodeId];
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
89
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
90 return NULL;
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
91 }
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
92
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
93 yaffs_Object *yaffsfs_GetHandleObject(int handle)
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
94 {
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
95 yaffsfs_Inode *in = yaffsfs_GetInodePointer(handle);
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
96
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
97 if(in)
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
98 return in->iObj;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
99
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
100 return NULL;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
101 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
102
341
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
103 //yaffsfs_GetInodeIdForObject
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
104 // Grab an inode entry when opening a new inode.
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
105 //
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
106
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
107 static int yaffsfs_GetInodeIdForObject(yaffs_Object *obj)
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
108 {
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
109 int i;
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
110 int ret = -1;
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
111 yaffsfs_Inode *in = NULL;
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
112
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
113 if(obj)
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
114 obj = yaffs_GetEquivalentObject(obj);
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
115
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
116 /* Look for it. If we can't find it then make one */
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
117 for(i = 0; i < YAFFSFS_N_HANDLES && ret < 0; i++){
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
118 if(yaffsfs_inode[i].iObj == obj)
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
119 ret = i;
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
120 }
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
121
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
122 for(i = 0; i < YAFFSFS_N_HANDLES && ret < 0; i++){
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
123 if(!yaffsfs_inode[i].iObj)
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
124 ret = i;
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
125 }
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
126
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
127
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
128 if(ret>=0){
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
129 in = &yaffsfs_inode[ret];
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
130 if(!in->iObj)
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
131 in->count = 0;
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
132 in->iObj = obj;
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
133 in->count++;
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
134 }
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
135
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
136
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
137 return ret;
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
138 }
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
139
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
140 static void yaffsfs_ReleaseInode(yaffsfs_Inode *in)
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
141 {
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
142 yaffs_Object *obj;
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
143
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
144 obj = in->iObj;
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
145
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
146 if(obj->unlinked)
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
147 yaffs_DeleteObject(obj);
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
148
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
149 obj->myInode = NULL;
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
150 in->iObj = NULL;
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
151
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
152 }
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
153
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
154 static void yaffsfs_PutInode(int inodeId)
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
155 {
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
156 if(inodeId >= 0 && inodeId < YAFFSFS_N_HANDLES){
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
157 yaffsfs_Inode *in = & yaffsfs_inode[inodeId];
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
158 in->count--;
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
159 if(in->count <= 0)
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
160 yaffsfs_ReleaseInode(in);
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
161 }
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
162 }
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
163
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
164
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
165 //yaffsfs_GetHandle
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
166 // Grab a handle (when opening a file)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
167 //
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
168
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
169 static int yaffsfs_GetHandle(void)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
170 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
171 int i;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
172 yaffsfs_Handle *h;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
173
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
174 for(i = 0; i < YAFFSFS_N_HANDLES; i++){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
175 h = yaffsfs_GetHandlePointer(i);
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
176 if(!h){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
177 // todo bug: should never happen
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
178 }
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
179 if(!h->inUse){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
180 memset(h,0,sizeof(yaffsfs_Handle));
341
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
181 h->inodeId=-1;
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
182 h->inUse=1;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
183 return i;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
184 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
185 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
186 return -1;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
187 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
188
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
189 // yaffs_PutHandle
341
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
190 // Let go of a handle when closing a file or aborting an open.
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
191 //
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
192 static int yaffsfs_PutHandle(int handle)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
193 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
194 yaffsfs_Handle *h = yaffsfs_GetHandlePointer(handle);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
195
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
196 if(h){
341
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
197 if(h->inodeId >= 0)
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
198 yaffsfs_PutInode(h->inodeId);
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
199 h->inUse = 0;
341
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
200 h->inodeId = -1;
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
201 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
202 return 0;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
203 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
204
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
205
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
206
341
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
207
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
208 // Stuff to search for a directory from a path
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
209
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
210
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
211 int yaffsfs_Match(YCHAR a, YCHAR b)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
212 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
213 // case sensitive
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
214 return (a == b);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
215 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
216
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
217 int yaffsfs_IsPathDivider(YCHAR ch)
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
218 {
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
219 YCHAR *str = YAFFS_PATH_DIVIDERS;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
220
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
221 while(*str){
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
222 if(*str == ch)
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
223 return 1;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
224 str++;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
225 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
226
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
227 return 0;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
228 }
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
229
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
230 // yaffsfs_FindDevice
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
231 // yaffsfs_FindRoot
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
232 // Scan the configuration list to find the root.
91
07a42c94dda5 Improve YDI lookup and device prefic handling
charles <charles>
parents: 81
diff changeset
233 // Curveballs: Should match paths that end in '/' too
07a42c94dda5 Improve YDI lookup and device prefic handling
charles <charles>
parents: 81
diff changeset
234 // Curveball2 Might have "/x/ and "/x/y". Need to return the longest match
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
235 static yaffs_Device *yaffsfs_FindDevice(const YCHAR *path, YCHAR **restOfPath)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
236 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
237 yaffsfs_DeviceConfiguration *cfg = yaffsfs_configurationList;
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
238 const YCHAR *leftOver;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
239 const YCHAR *p;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
240 yaffs_Device *retval = NULL;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
241 int thisMatchLength;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
242 int longestMatch = -1;
217
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
243 int matching;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
244
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
245 // Check all configs, choose the one that:
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
246 // 1) Actually matches a prefix (ie /a amd /abc will not match
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
247 // 2) Matches the longest.
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
248 while(cfg && cfg->prefix && cfg->dev){
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
249 leftOver = path;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
250 p = cfg->prefix;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
251 thisMatchLength = 0;
217
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
252 matching = 1;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
253
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
254
217
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
255 while(matching && *p && *leftOver){
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
256 // Skip over any /s
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
257 while(yaffsfs_IsPathDivider(*p))
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
258 p++;
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
259
217
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
260 // Skip over any /s
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
261 while(yaffsfs_IsPathDivider(*leftOver))
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
262 leftOver++;
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
263
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
264 // Now match the text part
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
265 while(matching &&
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
266 *p && !yaffsfs_IsPathDivider(*p) &&
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
267 *leftOver && !yaffsfs_IsPathDivider(*leftOver)){
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
268 if(yaffsfs_Match(*p,*leftOver)){
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
269 p++;
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
270 leftOver++;
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
271 thisMatchLength++;
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
272 } else {
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
273 matching = 0;
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
274 }
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
275 }
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
276 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
277
217
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
278 // Skip over any /s in leftOver
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
279 while(yaffsfs_IsPathDivider(*leftOver))
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
280 leftOver++;
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
281
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
282
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
283 if( matching && (thisMatchLength > longestMatch)){
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
284 // Matched prefix
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
285 *restOfPath = (YCHAR *)leftOver;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
286 retval = cfg->dev;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
287 longestMatch = thisMatchLength;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
288 }
217
27cfa5fc84f9 Change name matching algorithm
charles <charles>
parents: 210
diff changeset
289
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
290 cfg++;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
291 }
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
292 return retval;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
293 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
294
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
295 #if 0
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
296 static yaffs_Device *yaffsfs_FindDevice(const YCHAR *path, YCHAR **restOfPath)
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
297 {
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
298 yaffsfs_DeviceConfiguration *cfg = yaffsfs_configurationList;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
299 const YCHAR *leftOver;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
300 const YCHAR *p;
91
07a42c94dda5 Improve YDI lookup and device prefic handling
charles <charles>
parents: 81
diff changeset
301 yaffs_Device *retval = NULL;
07a42c94dda5 Improve YDI lookup and device prefic handling
charles <charles>
parents: 81
diff changeset
302 int thisMatchLength;
07a42c94dda5 Improve YDI lookup and device prefic handling
charles <charles>
parents: 81
diff changeset
303 int longestMatch = -1;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
304
91
07a42c94dda5 Improve YDI lookup and device prefic handling
charles <charles>
parents: 81
diff changeset
305 // Check all configs, choose the one that:
07a42c94dda5 Improve YDI lookup and device prefic handling
charles <charles>
parents: 81
diff changeset
306 // 1) Actually matches a prefix (ie /a amd /abc will not match
07a42c94dda5 Improve YDI lookup and device prefic handling
charles <charles>
parents: 81
diff changeset
307 // 2) Matches the longest.
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
308 while(cfg && cfg->prefix && cfg->dev){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
309 leftOver = path;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
310 p = cfg->prefix;
91
07a42c94dda5 Improve YDI lookup and device prefic handling
charles <charles>
parents: 81
diff changeset
311 thisMatchLength = 0;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
312
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
313 while(*p && //unmatched part of prefix
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
314 !(yaffsfs_IsPathDivider(*p) && (p[1] == 0)) && // the rest of the prefix is not / (to catch / at end)
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
315 *leftOver &&
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
316 yaffsfs_Match(*p,*leftOver)){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
317 p++;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
318 leftOver++;
91
07a42c94dda5 Improve YDI lookup and device prefic handling
charles <charles>
parents: 81
diff changeset
319 thisMatchLength++;
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
320 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
321
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
322
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
323 if((!*p || (yaffsfs_IsPathDivider(*p) && (p[1] == 0))) && // end of prefix
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
324 (!*leftOver || yaffsfs_IsPathDivider(*leftOver)) && // no more in this path name part
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
325 (thisMatchLength > longestMatch)){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
326 // Matched prefix
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
327 *restOfPath = (YCHAR *)leftOver;
91
07a42c94dda5 Improve YDI lookup and device prefic handling
charles <charles>
parents: 81
diff changeset
328 retval = cfg->dev;
07a42c94dda5 Improve YDI lookup and device prefic handling
charles <charles>
parents: 81
diff changeset
329 longestMatch = thisMatchLength;
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
330 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
331 cfg++;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
332 }
91
07a42c94dda5 Improve YDI lookup and device prefic handling
charles <charles>
parents: 81
diff changeset
333 return retval;
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
334 }
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
335 #endif
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
336
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
337 static yaffs_Object *yaffsfs_FindRoot(const YCHAR *path, YCHAR **restOfPath)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
338 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
339
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
340 yaffs_Device *dev;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
341
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
342 dev= yaffsfs_FindDevice(path,restOfPath);
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
343 if(dev && dev->isMounted){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
344 return dev->rootDir;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
345 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
346 return NULL;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
347 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
348
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
349 static yaffs_Object *yaffsfs_FollowLink(yaffs_Object *obj,int symDepth)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
350 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
351
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
352 while(obj && obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK){
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
353 YCHAR *alias = obj->variant.symLinkVariant.alias;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
354
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
355 if(yaffsfs_IsPathDivider(*alias))
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
356 // Starts with a /, need to scan from root up
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
357 obj = yaffsfs_FindObject(NULL,alias,symDepth++);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
358 else
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
359 // Relative to here, so use the parent of the symlink as a start
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
360 obj = yaffsfs_FindObject(obj->parent,alias,symDepth++);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
361 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
362 return obj;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
363 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
364
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
365
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
366 // yaffsfs_FindDirectory
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
367 // Parse a path to determine the directory and the name within the directory.
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
368 //
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
369 // eg. "/data/xx/ff" --> puts name="ff" and returns the directory "/data/xx"
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
370 static yaffs_Object *yaffsfs_DoFindDirectory(yaffs_Object *startDir,const YCHAR *path,YCHAR **name,int symDepth)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
371 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
372 yaffs_Object *dir;
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
373 YCHAR *restOfPath;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
374 YCHAR str[YAFFS_MAX_NAME_LENGTH+1];
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
375 int i;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
376
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
377 if(symDepth > YAFFSFS_MAX_SYMLINK_DEREFERENCES)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
378 return NULL;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
379
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
380 if(startDir){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
381 dir = startDir;
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
382 restOfPath = (YCHAR *)path;
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
383 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
384 else
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
385 dir = yaffsfs_FindRoot(path,&restOfPath);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
386
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
387 while(dir){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
388 // parse off /.
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
389 // curve ball: also throw away surplus '/'
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
390 // eg. "/ram/x////ff" gets treated the same as "/ram/x/ff"
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
391 while(yaffsfs_IsPathDivider(*restOfPath))
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
392 restOfPath++; // get rid of '/'
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
393
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
394 *name = restOfPath;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
395 i = 0;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
396
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
397 while(*restOfPath && !yaffsfs_IsPathDivider(*restOfPath)){
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
398 if (i < YAFFS_MAX_NAME_LENGTH){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
399 str[i] = *restOfPath;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
400 str[i+1] = '\0';
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
401 i++;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
402 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
403 restOfPath++;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
404 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
405
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
406 if(!*restOfPath)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
407 // got to the end of the string
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
408 return dir;
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
409 else{
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
410 if(yaffs_strcmp(str,_Y(".")) == 0)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
411 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
412 // Do nothing
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
413 }
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
414 else if(yaffs_strcmp(str,_Y("..")) == 0)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
415 dir = dir->parent;
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
416 else{
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
417 dir = yaffs_FindObjectByName(dir,str);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
418
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
419 while(dir && dir->variantType == YAFFS_OBJECT_TYPE_SYMLINK)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
420 dir = yaffsfs_FollowLink(dir,symDepth);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
421
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
422
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
423 if(dir && dir->variantType != YAFFS_OBJECT_TYPE_DIRECTORY)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
424 dir = NULL;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
425 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
426 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
427 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
428 // directory did not exist.
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
429 return NULL;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
430 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
431
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
432 static yaffs_Object *yaffsfs_FindDirectory(yaffs_Object *relativeDirectory,const YCHAR *path,YCHAR **name,int symDepth)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
433 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
434 return yaffsfs_DoFindDirectory(relativeDirectory,path,name,symDepth);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
435 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
436
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
437 // yaffsfs_FindObject turns a path for an existing object into the object
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
438 //
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
439 static yaffs_Object *yaffsfs_FindObject(yaffs_Object *relativeDirectory, const YCHAR *path,int symDepth)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
440 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
441 yaffs_Object *dir;
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
442 YCHAR *name;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
443
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
444 dir = yaffsfs_FindDirectory(relativeDirectory,path,&name,symDepth);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
445
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
446 if(dir && *name)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
447 return yaffs_FindObjectByName(dir,name);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
448
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
449 return dir;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
450 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
451
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
452
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
453 int yaffs_dup(int fd)
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
454 {
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
455 int newHandle = -1;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
456 yaffsfs_Handle *oldPtr = NULL;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
457 yaffsfs_Handle *newPtr = NULL;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
458
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
459 yaffsfs_Lock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
460
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
461 oldPtr = yaffsfs_GetHandlePointer(fd);
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
462 if(oldPtr && oldPtr->inUse)
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
463 newHandle = yaffsfs_GetHandle();
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
464 if(newHandle >= 0)
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
465 newPtr = yaffsfs_GetHandlePointer(newHandle);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
466
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
467 if(newPtr){
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
468 *newPtr = *oldPtr;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
469 return newHandle;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
470 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
471
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
472 if(!oldPtr)
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
473 yaffsfs_SetError(-EBADF);
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
474 else
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
475 yaffsfs_SetError(-ENOMEM);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
476
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
477 return -1;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
478
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
479 }
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
480
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
481 int yaffs_open(const YCHAR *path, int oflag, int mode)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
482 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
483 yaffs_Object *obj = NULL;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
484 yaffs_Object *dir = NULL;
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
485 YCHAR *name;
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
486 int handle = -1;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
487 yaffsfs_Handle *h = NULL;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
488 int alreadyOpen = 0;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
489 int alreadyExclusive = 0;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
490 int openDenied = 0;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
491 int symDepth = 0;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
492 int errorReported = 0;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
493
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
494 int i;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
495
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
496
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
497 // todo sanity check oflag (eg. can't have O_TRUNC without WRONLY or RDWR
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
498
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
499
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
500 yaffsfs_Lock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
501
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
502 handle = yaffsfs_GetHandle();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
503
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
504 if(handle >= 0){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
505
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
506 h = yaffsfs_GetHandlePointer(handle);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
507
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
508
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
509 // try to find the exisiting object
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
510 obj = yaffsfs_FindObject(NULL,path,0);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
511
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
512 if(obj && obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
513 obj = yaffsfs_FollowLink(obj,symDepth++);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
514
341
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
515 if(obj)
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
516 obj = yaffs_GetEquivalentObject(obj);
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
517
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
518 if(obj && obj->variantType != YAFFS_OBJECT_TYPE_FILE)
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
519 obj = NULL;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
520
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
521 if(obj){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
522 // Check if the object is already in use
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
523 alreadyOpen = alreadyExclusive = 0;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
524
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
525 for(i = 0; i < YAFFSFS_N_HANDLES; i++){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
526 if(i != handle &&
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
527 yaffsfs_handle[i].inUse &&
341
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
528 obj == yaffsfs_inode[yaffsfs_handle[i].inodeId].iObj){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
529 alreadyOpen = 1;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
530 if(yaffsfs_handle[i].exclusive)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
531 alreadyExclusive = 1;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
532 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
533 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
534
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
535 if(((oflag & O_EXCL) && alreadyOpen) || alreadyExclusive)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
536 openDenied = 1;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
537
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
538 // Open should fail if O_CREAT and O_EXCL are specified
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
539 if((oflag & O_EXCL) && (oflag & O_CREAT)){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
540 openDenied = 1;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
541 yaffsfs_SetError(-EEXIST);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
542 errorReported = 1;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
543 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
544
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
545 // Check file permissions
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
546 if( (oflag & (O_RDWR | O_WRONLY)) == 0 && // ie O_RDONLY
21
68dffdfc2095 Some tinkering on test harness and st_xxx to yst_xxx changes
charles <charles>
parents: 17
diff changeset
547 !(obj->yst_mode & S_IREAD))
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
548 openDenied = 1;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
549
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
550 if( (oflag & O_RDWR) &&
21
68dffdfc2095 Some tinkering on test harness and st_xxx to yst_xxx changes
charles <charles>
parents: 17
diff changeset
551 !(obj->yst_mode & S_IREAD))
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
552 openDenied = 1;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
553
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
554 if( (oflag & (O_RDWR | O_WRONLY)) &&
21
68dffdfc2095 Some tinkering on test harness and st_xxx to yst_xxx changes
charles <charles>
parents: 17
diff changeset
555 !(obj->yst_mode & S_IWRITE))
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
556 openDenied = 1;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
557
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
558 } else if((oflag & O_CREAT)) {
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
559 // Let's see if we can create this file
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
560 dir = yaffsfs_FindDirectory(NULL,path,&name,0);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
561 if(dir)
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
562 obj = yaffs_MknodFile(dir,name,mode,0,0);
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
563 else {
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
564 yaffsfs_SetError(-ENOTDIR);
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
565 errorReported = 1;
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
566 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
567 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
568
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
569 if(obj && !openDenied) {
341
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
570 int inodeId = yaffsfs_GetInodeIdForObject(obj);
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
571
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
572 if(inodeId<0) {
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
573 /*
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
574 * Todo: Fix any problem if inodes run out, though that
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
575 * can't happen if the number of inode items >= number of handles.
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
576 */
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
577 }
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
578
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
579 h->inodeId = inodeId;
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
580 h->inUse = 1;
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
581 h->readOnly = (oflag & (O_WRONLY | O_RDWR)) ? 0 : 1;
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
582 h->append = (oflag & O_APPEND) ? 1 : 0;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
583 h->exclusive = (oflag & O_EXCL) ? 1 : 0;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
584 h->position = 0;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
585
341
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
586 /* Hook inode to object */
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
587 obj->myInode = (void*) &yaffsfs_inode[inodeId];
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
588
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
589 if((oflag & O_TRUNC) && !h->readOnly)
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
590 yaffs_ResizeFile(obj,0);
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
591 } else {
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
592 yaffsfs_PutHandle(handle);
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
593 if(!errorReported) {
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
594 yaffsfs_SetError(-EACCES);
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
595 errorReported = 1;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
596 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
597 handle = -1;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
598 }
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
599 }
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
600
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
601 yaffsfs_Unlock();
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
602
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
603 return handle;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
604 }
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
605
291
b2333fb73eea Improve sync to flush metadata
charles <charles>
parents: 269
diff changeset
606 int yaffs_Dofsync(int fd,int datasync)
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
607 {
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
608 yaffsfs_Handle *h = NULL;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
609 int retVal = 0;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
610
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
611 yaffsfs_Lock();
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
612
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
613 h = yaffsfs_GetHandlePointer(fd);
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
614
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
615 if(h && h->inUse)
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
616 // flush the file
341
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
617 yaffs_FlushFile(yaffsfs_inode[h->inodeId].iObj,1,datasync);
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
618 else {
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
619 // bad handle
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
620 yaffsfs_SetError(-EBADF);
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
621 retVal = -1;
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
622 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
623
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
624 yaffsfs_Unlock();
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
625
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
626 return retVal;
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
627 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
628
291
b2333fb73eea Improve sync to flush metadata
charles <charles>
parents: 269
diff changeset
629 int yaffs_fsync(int fd)
b2333fb73eea Improve sync to flush metadata
charles <charles>
parents: 269
diff changeset
630 {
b2333fb73eea Improve sync to flush metadata
charles <charles>
parents: 269
diff changeset
631 return yaffs_Dofsync(fd,0);
b2333fb73eea Improve sync to flush metadata
charles <charles>
parents: 269
diff changeset
632 }
b2333fb73eea Improve sync to flush metadata
charles <charles>
parents: 269
diff changeset
633
292
977b18e93f2a Add missing function, if only stubs
charles <charles>
parents: 291
diff changeset
634 int yaffs_flush(int fd)
977b18e93f2a Add missing function, if only stubs
charles <charles>
parents: 291
diff changeset
635 {
977b18e93f2a Add missing function, if only stubs
charles <charles>
parents: 291
diff changeset
636 return yaffs_fsync(fd);
977b18e93f2a Add missing function, if only stubs
charles <charles>
parents: 291
diff changeset
637 }
977b18e93f2a Add missing function, if only stubs
charles <charles>
parents: 291
diff changeset
638
291
b2333fb73eea Improve sync to flush metadata
charles <charles>
parents: 269
diff changeset
639 int yaffs_fdatasync(int fd)
b2333fb73eea Improve sync to flush metadata
charles <charles>
parents: 269
diff changeset
640 {
b2333fb73eea Improve sync to flush metadata
charles <charles>
parents: 269
diff changeset
641 return yaffs_Dofsync(fd,1);
b2333fb73eea Improve sync to flush metadata
charles <charles>
parents: 269
diff changeset
642 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
643
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
644 int yaffs_close(int fd)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
645 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
646 yaffsfs_Handle *h = NULL;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
647 int retVal = 0;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
648
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
649 yaffsfs_Lock();
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
650
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
651 h = yaffsfs_GetHandlePointer(fd);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
652
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
653 if(h && h->inUse) {
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
654 // clean up
341
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
655 yaffs_FlushFile(yaffsfs_inode[h->inodeId].iObj,1,0);
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
656 yaffsfs_PutHandle(fd);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
657 retVal = 0;
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
658 } else {
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
659 // bad handle
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
660 yaffsfs_SetError(-EBADF);
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
661 retVal = -1;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
662 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
663
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
664 yaffsfs_Unlock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
665
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
666 return retVal;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
667 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
668
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
669 int yaffs_read(int fd, void *buf, unsigned int nbyte)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
670 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
671 yaffsfs_Handle *h = NULL;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
672 yaffs_Object *obj = NULL;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
673 int pos = 0;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
674 int nRead = -1;
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
675 unsigned int maxRead;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
676
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
677 yaffsfs_Lock();
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
678 h = yaffsfs_GetHandlePointer(fd);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
679 obj = yaffsfs_GetHandleObject(fd);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
680
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
681 if(!h || !obj)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
682 // bad handle
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
683 yaffsfs_SetError(-EBADF);
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
684
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
685 else if( h && obj){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
686 pos= h->position;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
687 if(yaffs_GetObjectFileLength(obj) > pos)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
688 maxRead = yaffs_GetObjectFileLength(obj) - pos;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
689 else
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
690 maxRead = 0;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
691
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
692 if(nbyte > maxRead)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
693 nbyte = maxRead;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
694
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
695
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
696 if(nbyte > 0) {
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
697 nRead = yaffs_ReadDataFromFile(obj,buf,pos,nbyte);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
698 if(nRead >= 0)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
699 h->position = pos + nRead;
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
700 else {
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
701 //todo error
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
702 }
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
703 } else
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
704 nRead = 0;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
705
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
706 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
707
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
708 yaffsfs_Unlock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
709
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
710
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
711 return (nRead >= 0) ? nRead : -1;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
712
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
713 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
714
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
715 int yaffs_pread(int fd, void *buf, unsigned int nbyte, unsigned int offset)
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
716 {
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
717 yaffsfs_Handle *h = NULL;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
718 yaffs_Object *obj = NULL;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
719 int pos = 0;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
720 int nRead = -1;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
721 unsigned int maxRead;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
722
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
723 yaffsfs_Lock();
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
724 h = yaffsfs_GetHandlePointer(fd);
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
725 obj = yaffsfs_GetHandleObject(fd);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
726
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
727 if(!h || !obj)
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
728 // bad handle
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
729 yaffsfs_SetError(-EBADF);
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
730 else if( h && obj) {
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
731 pos= offset;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
732 if(yaffs_GetObjectFileLength(obj) > pos)
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
733 maxRead = yaffs_GetObjectFileLength(obj) - pos;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
734 else
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
735 maxRead = 0;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
736
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
737 if(nbyte > maxRead)
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
738 nbyte = maxRead;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
739
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
740
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
741 if(nbyte > 0)
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
742 nRead = yaffs_ReadDataFromFile(obj,buf,pos,nbyte);
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
743 else
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
744 nRead = 0;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
745 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
746
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
747 yaffsfs_Unlock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
748
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
749
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
750 return (nRead >= 0) ? nRead : -1;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
751
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
752 }
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
753
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
754 int yaffs_write(int fd, const void *buf, unsigned int nbyte)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
755 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
756 yaffsfs_Handle *h = NULL;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
757 yaffs_Object *obj = NULL;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
758 int pos = 0;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
759 int nWritten = -1;
17
8859e0170e4c *** empty log message ***
charles <charles>
parents: 11
diff changeset
760 int writeThrough = 0;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
761
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
762 yaffsfs_Lock();
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
763 h = yaffsfs_GetHandlePointer(fd);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
764 obj = yaffsfs_GetHandleObject(fd);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
765
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
766 if(!h || !obj)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
767 // bad handle
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
768 yaffsfs_SetError(-EBADF);
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
769 else if( h && obj && h->readOnly){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
770 // todo error
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
771 } else if( h && obj){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
772 if(h->append)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
773 pos = yaffs_GetObjectFileLength(obj);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
774 else
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
775 pos = h->position;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
776
17
8859e0170e4c *** empty log message ***
charles <charles>
parents: 11
diff changeset
777 nWritten = yaffs_WriteDataToFile(obj,buf,pos,nbyte,writeThrough);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
778
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
779 if(nWritten >= 0)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
780 h->position = pos + nWritten;
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
781 else {
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
782 //todo error
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
783 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
784
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
785 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
786
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
787 yaffsfs_Unlock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
788
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
789
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
790 return (nWritten >= 0) ? nWritten : -1;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
791
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
792 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
793
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
794 int yaffs_pwrite(int fd, const void *buf, unsigned int nbyte, unsigned int offset)
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
795 {
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
796 yaffsfs_Handle *h = NULL;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
797 yaffs_Object *obj = NULL;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
798 int pos = 0;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
799 int nWritten = -1;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
800 int writeThrough = 0;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
801
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
802 yaffsfs_Lock();
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
803 h = yaffsfs_GetHandlePointer(fd);
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
804 obj = yaffsfs_GetHandleObject(fd);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
805
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
806 if(!h || !obj)
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
807 // bad handle
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
808 yaffsfs_SetError(-EBADF);
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
809 else if( h && obj && h->readOnly){
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
810 // todo error
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
811 }
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
812 else if( h && obj){
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
813 pos = offset;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
814
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
815 nWritten = yaffs_WriteDataToFile(obj,buf,pos,nbyte,writeThrough);
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
816
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
817 if(nWritten < 0 || ((unsigned int)nWritten) < nbyte)
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
818 yaffsfs_SetError(-ENOSPC);
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
819
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
820 }
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
821
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
822 yaffsfs_Unlock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
823
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
824
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
825 return (nWritten >= 0) ? nWritten : -1;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
826
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
827 }
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
828
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
829
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
830 int yaffs_truncate(const YCHAR *path,off_t newSize)
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
831 {
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
832 yaffs_Object *obj = NULL;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
833 int result = YAFFS_FAIL;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
834
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
835 yaffsfs_Lock();
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
836
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
837 obj = yaffsfs_FindObject(NULL,path,0);
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
838 if(obj)
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
839 obj = yaffs_GetEquivalentObject(obj);
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
840
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
841 if(!obj)
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
842 yaffsfs_SetError(-ENOENT);
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
843 else if(obj->variantType != YAFFS_OBJECT_TYPE_FILE)
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
844 yaffsfs_SetError(-EISDIR);
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
845 else
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
846 result = yaffs_ResizeFile(obj,newSize);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
847
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
848 yaffsfs_Unlock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
849
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
850
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
851 return (result) ? 0 : -1;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
852 }
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
853
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
854 int yaffs_ftruncate(int fd, off_t newSize)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
855 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
856 yaffsfs_Handle *h = NULL;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
857 yaffs_Object *obj = NULL;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
858 int result = 0;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
859
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
860 yaffsfs_Lock();
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
861 h = yaffsfs_GetHandlePointer(fd);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
862 obj = yaffsfs_GetHandleObject(fd);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
863
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
864 if(!h || !obj)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
865 // bad handle
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
866 yaffsfs_SetError(-EBADF);
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
867 else
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
868 // resize the file
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
869 result = yaffs_ResizeFile(obj,newSize);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
870 yaffsfs_Unlock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
871
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
872
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
873 return (result) ? 0 : -1;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
874
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
875 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
876
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
877 off_t yaffs_lseek(int fd, off_t offset, int whence)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
878 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
879 yaffsfs_Handle *h = NULL;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
880 yaffs_Object *obj = NULL;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
881 int pos = -1;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
882 int fSize = -1;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
883
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
884 yaffsfs_Lock();
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
885 h = yaffsfs_GetHandlePointer(fd);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
886 obj = yaffsfs_GetHandleObject(fd);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
887
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
888 if(!h || !obj)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
889 // bad handle
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
890 yaffsfs_SetError(-EBADF);
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
891 else if(whence == SEEK_SET){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
892 if(offset >= 0)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
893 pos = offset;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
894 }
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
895 else if(whence == SEEK_CUR) {
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
896 if( (h->position + offset) >= 0)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
897 pos = (h->position + offset);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
898 }
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
899 else if(whence == SEEK_END) {
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
900 fSize = yaffs_GetObjectFileLength(obj);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
901 if(fSize >= 0 && (fSize + offset) >= 0)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
902 pos = fSize + offset;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
903 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
904
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
905 if(pos >= 0)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
906 h->position = pos;
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
907 else {
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
908 // todo error
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
909 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
910
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
911
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
912 yaffsfs_Unlock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
913
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
914 return pos;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
915 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
916
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
917
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
918 int yaffsfs_DoUnlink(const YCHAR *path,int isDirectory)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
919 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
920 yaffs_Object *dir = NULL;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
921 yaffs_Object *obj = NULL;
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
922 YCHAR *name;
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
923 int result = YAFFS_FAIL;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
924
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
925 yaffsfs_Lock();
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
926
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
927 obj = yaffsfs_FindObject(NULL,path,0);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
928 dir = yaffsfs_FindDirectory(NULL,path,&name,0);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
929 if(!dir)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
930 yaffsfs_SetError(-ENOTDIR);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
931 else if(!obj)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
932 yaffsfs_SetError(-ENOENT);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
933 else if(!isDirectory && obj->variantType == YAFFS_OBJECT_TYPE_DIRECTORY)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
934 yaffsfs_SetError(-EISDIR);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
935 else if(isDirectory && obj->variantType != YAFFS_OBJECT_TYPE_DIRECTORY)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
936 yaffsfs_SetError(-ENOTDIR);
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
937 else {
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
938 result = yaffs_Unlink(dir,name);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
939
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
940 if(result == YAFFS_FAIL && isDirectory)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
941 yaffsfs_SetError(-ENOTEMPTY);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
942 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
943
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
944 yaffsfs_Unlock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
945
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
946 // todo error
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
947
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
948 return (result == YAFFS_FAIL) ? -1 : 0;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
949 }
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
950
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
951
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
952 int yaffs_rmdir(const YCHAR *path)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
953 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
954 return yaffsfs_DoUnlink(path,1);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
955 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
956
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
957 int yaffs_unlink(const YCHAR *path)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
958 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
959 return yaffsfs_DoUnlink(path,0);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
960 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
961
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
962 int yaffs_rename(const YCHAR *oldPath, const YCHAR *newPath)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
963 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
964 yaffs_Object *olddir = NULL;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
965 yaffs_Object *newdir = NULL;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
966 yaffs_Object *obj = NULL;
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
967 YCHAR *oldname;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
968 YCHAR *newname;
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
969 int result= YAFFS_FAIL;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
970 int renameAllowed = 1;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
971
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
972 yaffsfs_Lock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
973
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
974 olddir = yaffsfs_FindDirectory(NULL,oldPath,&oldname,0);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
975 newdir = yaffsfs_FindDirectory(NULL,newPath,&newname,0);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
976 obj = yaffsfs_FindObject(NULL,oldPath,0);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
977
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
978 if(!olddir || !newdir || !obj) {
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
979 // bad file
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
980 yaffsfs_SetError(-EBADF);
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
981 renameAllowed = 0;
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
982 } else if(olddir->myDev != newdir->myDev) {
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
983 // oops must be on same device
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
984 // todo error
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
985 yaffsfs_SetError(-EXDEV);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
986 renameAllowed = 0;
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
987 } else if(obj && obj->variantType == YAFFS_OBJECT_TYPE_DIRECTORY) {
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
988 // It is a directory, check that it is not being renamed to
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
989 // being its own decendent.
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
990 // Do this by tracing from the new directory back to the root, checking for obj
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
991
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
992 yaffs_Object *xx = newdir;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
993
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
994 while( renameAllowed && xx){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
995 if(xx == obj)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
996 renameAllowed = 0;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
997 xx = xx->parent;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
998 }
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
999 if(!renameAllowed)
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1000 yaffsfs_SetError(-EACCES);
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1001 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1002
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1003 if(renameAllowed)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1004 result = yaffs_RenameObject(olddir,oldname,newdir,newname);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1005
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1006 yaffsfs_Unlock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1007
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1008 return (result == YAFFS_FAIL) ? -1 : 0;
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1009 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1010
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1011
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1012 static int yaffsfs_DoStat(yaffs_Object *obj,struct yaffs_stat *buf)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1013 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1014 int retVal = -1;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1015
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1016 if(obj)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1017 obj = yaffs_GetEquivalentObject(obj);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1018
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1019 if(obj && buf){
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1020 buf->st_dev = (int)obj->myDev->genericDevice;
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1021 buf->st_ino = obj->objectId;
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1022 buf->st_mode = obj->yst_mode & ~S_IFMT; // clear out file type bits
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1023
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1024 if(obj->variantType == YAFFS_OBJECT_TYPE_DIRECTORY)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1025 buf->st_mode |= S_IFDIR;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1026 else if(obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1027 buf->st_mode |= S_IFLNK;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1028 else if(obj->variantType == YAFFS_OBJECT_TYPE_FILE)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1029 buf->st_mode |= S_IFREG;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1030
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1031 buf->st_nlink = yaffs_GetObjectLinkCount(obj);
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1032 buf->st_uid = 0;
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1033 buf->st_gid = 0;;
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1034 buf->st_rdev = obj->yst_rdev;
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1035 buf->st_size = yaffs_GetObjectFileLength(obj);
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1036 buf->st_blksize = obj->myDev->nDataBytesPerChunk;
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1037 buf->st_blocks = (buf->st_size + buf->st_blksize -1)/buf->st_blksize;
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1038 #if CONFIG_YAFFS_WINCE
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1039 buf->yst_wince_atime[0] = obj->win_atime[0];
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1040 buf->yst_wince_atime[1] = obj->win_atime[1];
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1041 buf->yst_wince_ctime[0] = obj->win_ctime[0];
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1042 buf->yst_wince_ctime[1] = obj->win_ctime[1];
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1043 buf->yst_wince_mtime[0] = obj->win_mtime[0];
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1044 buf->yst_wince_mtime[1] = obj->win_mtime[1];
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1045 #else
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1046 buf->yst_atime = obj->yst_atime;
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1047 buf->yst_ctime = obj->yst_ctime;
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1048 buf->yst_mtime = obj->yst_mtime;
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1049 #endif
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1050 retVal = 0;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1051 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1052 return retVal;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1053 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1054
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1055 static int yaffsfs_DoStatOrLStat(const YCHAR *path, struct yaffs_stat *buf,int doLStat)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1056 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1057 yaffs_Object *obj;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1058
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1059 int retVal = -1;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1060
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1061 yaffsfs_Lock();
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1062 obj = yaffsfs_FindObject(NULL,path,0);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1063
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1064 if(!doLStat && obj)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1065 obj = yaffsfs_FollowLink(obj,0);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1066
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1067 if(obj)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1068 retVal = yaffsfs_DoStat(obj,buf);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1069 else
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1070 // todo error not found
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1071 yaffsfs_SetError(-ENOENT);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1072
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1073 yaffsfs_Unlock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1074
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1075 return retVal;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1076
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1077 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1078
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1079 int yaffs_stat(const YCHAR *path, struct yaffs_stat *buf)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1080 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1081 return yaffsfs_DoStatOrLStat(path,buf,0);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1082 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1083
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1084 int yaffs_lstat(const YCHAR *path, struct yaffs_stat *buf)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1085 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1086 return yaffsfs_DoStatOrLStat(path,buf,1);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1087 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1088
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1089 int yaffs_fstat(int fd, struct yaffs_stat *buf)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1090 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1091 yaffs_Object *obj;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1092
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1093 int retVal = -1;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1094
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1095 yaffsfs_Lock();
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1096 obj = yaffsfs_GetHandleObject(fd);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1097
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1098 if(obj)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1099 retVal = yaffsfs_DoStat(obj,buf);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1100 else
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1101 // bad handle
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1102 yaffsfs_SetError(-EBADF);
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1103
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1104 yaffsfs_Unlock();
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1105
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1106 return retVal;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1107 }
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1108
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1109 #ifdef CONFIG_YAFFS_WINCE
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1110 int yaffs_get_wince_times(int fd, unsigned *wctime, unsigned *watime, unsigned *wmtime)
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1111 {
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1112 yaffs_Object *obj;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1113
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1114 int retVal = -1;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1115
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1116 yaffsfs_Lock();
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1117 obj = yaffsfs_GetHandleObject(fd);
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1118
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1119 if(obj){
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1120
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1121 if(wctime){
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1122 wctime[0] = obj->win_ctime[0];
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1123 wctime[1] = obj->win_ctime[1];
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1124 }
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1125 if(watime){
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1126 watime[0] = obj->win_atime[0];
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1127 watime[1] = obj->win_atime[1];
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1128 }
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1129 if(wmtime){
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1130 wmtime[0] = obj->win_mtime[0];
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1131 wmtime[1] = obj->win_mtime[1];
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1132 }
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1133
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1134
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1135 retVal = 0;
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1136 } else
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1137 // bad handle
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1138 yaffsfs_SetError(-EBADF);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1139
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1140 yaffsfs_Unlock();
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1141
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1142 return retVal;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1143 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1144
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1145
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1146 int yaffs_set_wince_times(int fd,
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1147 const unsigned *wctime,
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1148 const unsigned *watime,
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1149 const unsigned *wmtime)
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1150 {
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1151 yaffs_Object *obj;
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1152 int result;
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1153 int retVal = -1;
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1154
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1155 yaffsfs_Lock();
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1156 obj = yaffsfs_GetHandleObject(fd);
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1157
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1158 if(obj){
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1159
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1160 if(wctime){
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1161 obj->win_ctime[0] = wctime[0];
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1162 obj->win_ctime[1] = wctime[1];
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1163 }
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1164 if(watime){
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1165 obj->win_atime[0] = watime[0];
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1166 obj->win_atime[1] = watime[1];
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1167 }
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1168 if(wmtime){
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1169 obj->win_mtime[0] = wmtime[0];
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1170 obj->win_mtime[1] = wmtime[1];
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1171 }
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1172
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1173 obj->dirty = 1;
291
b2333fb73eea Improve sync to flush metadata
charles <charles>
parents: 269
diff changeset
1174 result = yaffs_FlushFile(obj,0,0);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1175 retVal = 0;
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1176 } else
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1177 // bad handle
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1178 yaffsfs_SetError(-EBADF);
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1179
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1180 yaffsfs_Unlock();
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1181
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1182 return retVal;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1183 }
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1184
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1185 #endif
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1186
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1187
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1188 static int yaffsfs_DoChMod(yaffs_Object *obj,mode_t mode)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1189 {
225
59129db5d7b9 Fix uninitialised variable
charles <charles>
parents: 220
diff changeset
1190 int result = -1;
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1191
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1192 if(obj)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1193 obj = yaffs_GetEquivalentObject(obj);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1194
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1195 if(obj) {
21
68dffdfc2095 Some tinkering on test harness and st_xxx to yst_xxx changes
charles <charles>
parents: 17
diff changeset
1196 obj->yst_mode = mode;
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1197 obj->dirty = 1;
291
b2333fb73eea Improve sync to flush metadata
charles <charles>
parents: 269
diff changeset
1198 result = yaffs_FlushFile(obj,0,0);
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1199 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1200
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1201 return result == YAFFS_OK ? 0 : -1;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1202 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1203
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1204
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1205 int yaffs_access(const YCHAR *path, int amode)
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1206 {
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1207 yaffs_Object *obj;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1208
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1209 int retval = 0;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1210
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1211 yaffsfs_Lock();
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1212 obj = yaffsfs_FindObject(NULL,path,0);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1213
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1214 if(obj) {
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1215 int access_ok = 1;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1216
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1217 if((amode & R_OK) && !(obj->yst_mode & S_IREAD))
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1218 access_ok = 0;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1219 if((amode & W_OK) && !(obj->yst_mode & S_IWRITE))
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1220 access_ok = 0;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1221 if((amode & X_OK) && !(obj->yst_mode & S_IEXEC))
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1222 access_ok = 0;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1223
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1224 if(!access_ok) {
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1225 yaffsfs_SetError(-EACCES);
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1226 retval = -1;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1227 }
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1228 } else {
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1229 // todo error not found
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1230 yaffsfs_SetError(-ENOENT);
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1231 retval = -1;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1232 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1233
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1234 yaffsfs_Unlock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1235
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1236 return retval;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1237
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1238 }
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1239
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1240
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1241 int yaffs_chmod(const YCHAR *path, mode_t mode)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1242 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1243 yaffs_Object *obj;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1244
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1245 int retVal = -1;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1246
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1247 yaffsfs_Lock();
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1248 obj = yaffsfs_FindObject(NULL,path,0);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1249
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1250 if(obj)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1251 retVal = yaffsfs_DoChMod(obj,mode);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1252 else
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1253 // todo error not found
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1254 yaffsfs_SetError(-ENOENT);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1255
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1256 yaffsfs_Unlock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1257
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1258 return retVal;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1259
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1260 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1261
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1262
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1263 int yaffs_fchmod(int fd, mode_t mode)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1264 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1265 yaffs_Object *obj;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1266
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1267 int retVal = -1;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1268
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1269 yaffsfs_Lock();
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1270 obj = yaffsfs_GetHandleObject(fd);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1271
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1272 if(obj)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1273 retVal = yaffsfs_DoChMod(obj,mode);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1274 else
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1275 // bad handle
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1276 yaffsfs_SetError(-EBADF);
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1277
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1278 yaffsfs_Unlock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1279
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1280 return retVal;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1281 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1282
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1283
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1284 int yaffs_mkdir(const YCHAR *path, mode_t mode)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1285 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1286 yaffs_Object *parent = NULL;
122
2b3096daff30 Fix possible null ptr dereference
charles <charles>
parents: 119
diff changeset
1287 yaffs_Object *dir = NULL;
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1288 YCHAR *name;
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1289 int retVal= -1;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1290
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1291 yaffsfs_Lock();
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1292 parent = yaffsfs_FindDirectory(NULL,path,&name,0);
122
2b3096daff30 Fix possible null ptr dereference
charles <charles>
parents: 119
diff changeset
1293 if(parent)
2b3096daff30 Fix possible null ptr dereference
charles <charles>
parents: 119
diff changeset
1294 dir = yaffs_MknodDirectory(parent,name,mode,0,0);
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1295 if(dir)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1296 retVal = 0;
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1297 else {
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1298 if(!parent)
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1299 yaffsfs_SetError(-ENOENT); // missing path
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1300 else if (yaffs_FindObjectByName(parent,name))
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1301 yaffsfs_SetError(-EEXIST); // the name already exists
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1302 else
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1303 yaffsfs_SetError(-ENOSPC); // just assume no space
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1304 retVal = -1;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1305 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1306
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1307 yaffsfs_Unlock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1308
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1309 return retVal;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1310 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1311
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1312 int yaffs_mount(const YCHAR *path)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1313 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1314 int retVal=-1;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1315 int result=YAFFS_FAIL;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1316 yaffs_Device *dev=NULL;
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1317 YCHAR *dummy;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1318
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1319 T(YAFFS_TRACE_ALWAYS,(TSTR("yaffs: Mounting %s" TENDSTR),path));
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1320
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1321 yaffsfs_Lock();
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1322 dev = yaffsfs_FindDevice(path,&dummy);
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1323 if(dev){
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1324 if(!dev->isMounted){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1325 result = yaffs_GutsInitialise(dev);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1326 if(result == YAFFS_FAIL)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1327 // todo error - mount failed
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1328 yaffsfs_SetError(-ENOMEM);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1329 retVal = result ? 0 : -1;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1330
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1331 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1332 else
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1333 //todo error - already mounted.
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1334 yaffsfs_SetError(-EBUSY);
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1335 } else
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1336 // todo error - no device
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1337 yaffsfs_SetError(-ENODEV);
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1338
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1339 yaffsfs_Unlock();
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1340 return retVal;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1341
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1342 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1343
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1344 int yaffs_sync(const YCHAR *path)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1345 {
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1346 int retVal=-1;
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1347 yaffs_Device *dev=NULL;
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1348 YCHAR *dummy;
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1349
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1350 yaffsfs_Lock();
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1351 dev = yaffsfs_FindDevice(path,&dummy);
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1352 if(dev){
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1353 if(dev->isMounted){
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1354
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1355 yaffs_FlushEntireDeviceCache(dev);
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1356 yaffs_CheckpointSave(dev);
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1357
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1358
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1359 } else
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1360 //todo error - not mounted.
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1361 yaffsfs_SetError(-EINVAL);
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1362
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1363 }else
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1364 // todo error - no device
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1365 yaffsfs_SetError(-ENODEV);
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1366
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1367 yaffsfs_Unlock();
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1368 return retVal;
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1369 }
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1370
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1371
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1372 int yaffs_unmount(const YCHAR *path)
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1373 {
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1374 int retVal=-1;
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1375 yaffs_Device *dev=NULL;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1376 YCHAR *dummy;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1377
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1378 yaffsfs_Lock();
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1379 dev = yaffsfs_FindDevice(path,&dummy);
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1380 if(dev){
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1381 if(dev->isMounted){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1382 int i;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1383 int inUse;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1384
123
54d5e336b009 Flush entire cache at umount
charles <charles>
parents: 122
diff changeset
1385 yaffs_FlushEntireDeviceCache(dev);
127
f8fc631acf25 Checkpointing changes
charles <charles>
parents: 125
diff changeset
1386 yaffs_CheckpointSave(dev);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1387
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1388 for(i = inUse = 0; i < YAFFSFS_N_HANDLES && !inUse; i++){
341
89e691a21fd1 Change direct handle management to use an inode layer to make it consistent with Linux VFS. This is done to improve testing consistency.
charles <charles>
parents: 326
diff changeset
1389 if(yaffsfs_handle[i].inUse && yaffsfs_inode[yaffsfs_handle[i].inodeId].iObj->myDev == dev)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1390 inUse = 1; // the device is in use, can't unmount
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1391 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1392
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1393 if(!inUse){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1394 yaffs_Deinitialise(dev);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1395
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1396 retVal = 0;
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1397 } else
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1398 // todo error can't unmount as files are open
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1399 yaffsfs_SetError(-EBUSY);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1400
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1401 } else
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1402 //todo error - not mounted.
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1403 yaffsfs_SetError(-EINVAL);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1404
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1405 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1406 else
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1407 // todo error - no device
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1408 yaffsfs_SetError(-ENODEV);
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1409
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1410 yaffsfs_Unlock();
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1411 return retVal;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1412
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1413 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1414
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1415 loff_t yaffs_freespace(const YCHAR *path)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1416 {
146
1a32267ef1c1 Add large NAND support and improve retirement handling
charles <charles>
parents: 127
diff changeset
1417 loff_t retVal=-1;
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1418 yaffs_Device *dev=NULL;
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1419 YCHAR *dummy;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1420
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1421 yaffsfs_Lock();
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1422 dev = yaffsfs_FindDevice(path,&dummy);
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1423 if(dev && dev->isMounted){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1424 retVal = yaffs_GetNumberOfFreeChunks(dev);
146
1a32267ef1c1 Add large NAND support and improve retirement handling
charles <charles>
parents: 127
diff changeset
1425 retVal *= dev->nDataBytesPerChunk;
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1426
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1427 } else
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1428 yaffsfs_SetError(-EINVAL);
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1429
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1430 yaffsfs_Unlock();
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1431 return retVal;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1432 }
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1433
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1434 loff_t yaffs_totalspace(const YCHAR *path)
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1435 {
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1436 loff_t retVal=-1;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1437 yaffs_Device *dev=NULL;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1438 YCHAR *dummy;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1439
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1440 yaffsfs_Lock();
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1441 dev = yaffsfs_FindDevice(path,&dummy);
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1442 if(dev && dev->isMounted){
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1443 retVal = (dev->endBlock - dev->startBlock + 1) - dev->nReservedBlocks;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1444 retVal *= dev->nChunksPerBlock;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1445 retVal *= dev->nDataBytesPerChunk;
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1446
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1447 } else
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1448 yaffsfs_SetError(-EINVAL);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1449
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1450 yaffsfs_Unlock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1451 return retVal;
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1452 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1453
210
8a4f31e59ad8 Some cleanups, Linux 2.6.25 handling, fix handing of root permissions
charles <charles>
parents: 208
diff changeset
1454 int yaffs_inodecount(const YCHAR *path)
8a4f31e59ad8 Some cleanups, Linux 2.6.25 handling, fix handing of root permissions
charles <charles>
parents: 208
diff changeset
1455 {
8a4f31e59ad8 Some cleanups, Linux 2.6.25 handling, fix handing of root permissions
charles <charles>
parents: 208
diff changeset
1456 loff_t retVal= -1;
8a4f31e59ad8 Some cleanups, Linux 2.6.25 handling, fix handing of root permissions
charles <charles>
parents: 208
diff changeset
1457 yaffs_Device *dev=NULL;
8a4f31e59ad8 Some cleanups, Linux 2.6.25 handling, fix handing of root permissions
charles <charles>
parents: 208
diff changeset
1458 YCHAR *dummy;
8a4f31e59ad8 Some cleanups, Linux 2.6.25 handling, fix handing of root permissions
charles <charles>
parents: 208
diff changeset
1459
8a4f31e59ad8 Some cleanups, Linux 2.6.25 handling, fix handing of root permissions
charles <charles>
parents: 208
diff changeset
1460 yaffsfs_Lock();
8a4f31e59ad8 Some cleanups, Linux 2.6.25 handling, fix handing of root permissions
charles <charles>
parents: 208
diff changeset
1461 dev = yaffsfs_FindDevice(path,&dummy);
8a4f31e59ad8 Some cleanups, Linux 2.6.25 handling, fix handing of root permissions
charles <charles>
parents: 208
diff changeset
1462 if(dev && dev->isMounted) {
8a4f31e59ad8 Some cleanups, Linux 2.6.25 handling, fix handing of root permissions
charles <charles>
parents: 208
diff changeset
1463 int nObjects = dev->nObjectsCreated - dev->nFreeObjects;
8a4f31e59ad8 Some cleanups, Linux 2.6.25 handling, fix handing of root permissions
charles <charles>
parents: 208
diff changeset
1464 if(nObjects > dev->nHardLinks)
8a4f31e59ad8 Some cleanups, Linux 2.6.25 handling, fix handing of root permissions
charles <charles>
parents: 208
diff changeset
1465 retVal = nObjects - dev->nHardLinks;
8a4f31e59ad8 Some cleanups, Linux 2.6.25 handling, fix handing of root permissions
charles <charles>
parents: 208
diff changeset
1466 }
8a4f31e59ad8 Some cleanups, Linux 2.6.25 handling, fix handing of root permissions
charles <charles>
parents: 208
diff changeset
1467
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1468 if(retVal < 0)
210
8a4f31e59ad8 Some cleanups, Linux 2.6.25 handling, fix handing of root permissions
charles <charles>
parents: 208
diff changeset
1469 yaffsfs_SetError(-EINVAL);
8a4f31e59ad8 Some cleanups, Linux 2.6.25 handling, fix handing of root permissions
charles <charles>
parents: 208
diff changeset
1470
8a4f31e59ad8 Some cleanups, Linux 2.6.25 handling, fix handing of root permissions
charles <charles>
parents: 208
diff changeset
1471 yaffsfs_Unlock();
8a4f31e59ad8 Some cleanups, Linux 2.6.25 handling, fix handing of root permissions
charles <charles>
parents: 208
diff changeset
1472 return retVal;
8a4f31e59ad8 Some cleanups, Linux 2.6.25 handling, fix handing of root permissions
charles <charles>
parents: 208
diff changeset
1473 }
8a4f31e59ad8 Some cleanups, Linux 2.6.25 handling, fix handing of root permissions
charles <charles>
parents: 208
diff changeset
1474
81
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1475
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1476
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1477 void yaffs_initialise(yaffsfs_DeviceConfiguration *cfgList)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1478 {
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1479
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1480 yaffsfs_DeviceConfiguration *cfg;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1481
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1482 yaffsfs_configurationList = cfgList;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1483
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1484 yaffsfs_InitHandles();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1485
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1486 cfg = yaffsfs_configurationList;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1487
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1488 while(cfg && cfg->prefix && cfg->dev){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1489 cfg->dev->isMounted = 0;
81
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1490 cfg->dev->removeObjectCallback = yaffsfs_RemoveObjectCallback;
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1491 cfg++;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1492 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1493
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1494
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1495 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1496
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1497
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1498 //
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1499 // Directory search stuff.
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1500
81
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1501 //
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1502 // Directory search context
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1503 //
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1504 // NB this is an opaque structure.
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1505
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1506
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1507 typedef struct
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1508 {
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1509 __u32 magic;
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1510 yaffs_dirent de; /* directory entry being used by this dsc */
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1511 YCHAR name[NAME_MAX+1]; /* name of directory being searched */
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1512 yaffs_Object *dirObj; /* ptr to directory being searched */
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1513 yaffs_Object *nextReturn; /* obj to be returned by next readddir */
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1514 int offset;
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1515 struct ylist_head others;
81
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1516 } yaffsfs_DirectorySearchContext;
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1517
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1518
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1519
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1520 static struct ylist_head search_contexts;
81
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1521
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1522
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1523 static void yaffsfs_SetDirRewound(yaffsfs_DirectorySearchContext *dsc)
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1524 {
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1525 if(dsc &&
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1526 dsc->dirObj &&
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1527 dsc->dirObj->variantType == YAFFS_OBJECT_TYPE_DIRECTORY){
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1528
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1529 dsc->offset = 0;
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1530
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1531 if( ylist_empty(&dsc->dirObj->variant.directoryVariant.children))
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1532 dsc->nextReturn = NULL;
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1533 else
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1534 dsc->nextReturn = ylist_entry(dsc->dirObj->variant.directoryVariant.children.next,
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1535 yaffs_Object,siblings);
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1536 } else {
81
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1537 /* Hey someone isn't playing nice! */
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1538 }
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1539 }
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1540
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1541 static void yaffsfs_DirAdvance(yaffsfs_DirectorySearchContext *dsc)
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1542 {
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1543 if(dsc &&
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1544 dsc->dirObj &&
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1545 dsc->dirObj->variantType == YAFFS_OBJECT_TYPE_DIRECTORY){
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1546
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1547 if( dsc->nextReturn == NULL ||
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1548 ylist_empty(&dsc->dirObj->variant.directoryVariant.children))
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1549 dsc->nextReturn = NULL;
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1550 else {
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1551 struct ylist_head *next = dsc->nextReturn->siblings.next;
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1552
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1553 if( next == &dsc->dirObj->variant.directoryVariant.children)
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1554 dsc->nextReturn = NULL; /* end of list */
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1555 else
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1556 dsc->nextReturn = ylist_entry(next,yaffs_Object,siblings);
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1557 }
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1558 } else {
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1559 /* Hey someone isn't playing nice! */
81
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1560 }
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1561 }
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1562
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1563 static void yaffsfs_RemoveObjectCallback(yaffs_Object *obj)
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1564 {
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1565
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1566 struct ylist_head *i;
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1567 yaffsfs_DirectorySearchContext *dsc;
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1568
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1569 /* if search contexts not initilised then skip */
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1570 if(!search_contexts.next)
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1571 return;
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1572
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1573 /* Iterate through the directory search contexts.
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1574 * If any are the one being removed, then advance the dsc to
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1575 * the next one to prevent a hanging ptr.
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1576 */
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1577 ylist_for_each(i, &search_contexts) {
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1578 if (i) {
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1579 dsc = ylist_entry(i, yaffsfs_DirectorySearchContext,others);
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1580 if(dsc->nextReturn == obj)
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1581 yaffsfs_DirAdvance(dsc);
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1582 }
81
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1583 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1584
81
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1585 }
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1586
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1587 yaffs_DIR *yaffs_opendir(const YCHAR *dirname)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1588 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1589 yaffs_DIR *dir = NULL;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1590 yaffs_Object *obj = NULL;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1591 yaffsfs_DirectorySearchContext *dsc = NULL;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1592
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1593 yaffsfs_Lock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1594
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1595 obj = yaffsfs_FindObject(NULL,dirname,0);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1596
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1597 if(obj && obj->variantType == YAFFS_OBJECT_TYPE_DIRECTORY){
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1598
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1599 dsc = YMALLOC(sizeof(yaffsfs_DirectorySearchContext));
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1600 dir = (yaffs_DIR *)dsc;
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1601
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1602 if(dsc){
91
07a42c94dda5 Improve YDI lookup and device prefic handling
charles <charles>
parents: 81
diff changeset
1603 memset(dsc,0,sizeof(yaffsfs_DirectorySearchContext));
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1604 dsc->magic = YAFFS_MAGIC;
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1605 dsc->dirObj = obj;
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1606 yaffs_strncpy(dsc->name,dirname,NAME_MAX);
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1607 YINIT_LIST_HEAD(&dsc->others);
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1608
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1609 if(!search_contexts.next)
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1610 YINIT_LIST_HEAD(&search_contexts);
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1611
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1612 ylist_add(&dsc->others,&search_contexts);
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1613 yaffsfs_SetDirRewound(dsc);
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1614 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1615
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1616 }
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1617
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1618 yaffsfs_Unlock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1619
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1620 return dir;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1621 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1622
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1623 struct yaffs_dirent *yaffs_readdir(yaffs_DIR *dirp)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1624 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1625 yaffsfs_DirectorySearchContext *dsc = (yaffsfs_DirectorySearchContext *)dirp;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1626 struct yaffs_dirent *retVal = NULL;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1627
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1628 yaffsfs_Lock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1629
81
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1630 if(dsc && dsc->magic == YAFFS_MAGIC){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1631 yaffsfs_SetError(0);
81
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1632 if(dsc->nextReturn){
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1633 dsc->de.d_ino = yaffs_GetEquivalentObject(dsc->nextReturn)->objectId;
151
583760db2c69 Add more test stuff
charles <charles>
parents: 146
diff changeset
1634 dsc->de.d_dont_use = (unsigned)dsc->nextReturn;
81
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1635 dsc->de.d_off = dsc->offset++;
151
583760db2c69 Add more test stuff
charles <charles>
parents: 146
diff changeset
1636 yaffs_GetObjectName(dsc->nextReturn,dsc->de.d_name,NAME_MAX);
326
490a804b7bd3 Change to strnlen() and strncpy() to avoid problems from unbounded strings
charles <charles>
parents: 304
diff changeset
1637 if(yaffs_strnlen(dsc->de.d_name,NAME_MAX+1) == 0)
151
583760db2c69 Add more test stuff
charles <charles>
parents: 146
diff changeset
1638 {
583760db2c69 Add more test stuff
charles <charles>
parents: 146
diff changeset
1639 // this should not happen!
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1640 yaffs_strcpy(dsc->de.d_name,_Y("zz"));
151
583760db2c69 Add more test stuff
charles <charles>
parents: 146
diff changeset
1641 }
81
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1642 dsc->de.d_reclen = sizeof(struct yaffs_dirent);
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1643 retVal = &dsc->de;
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1644 yaffsfs_DirAdvance(dsc);
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1645 } else
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1646 retVal = NULL;
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1647 } else
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1648 yaffsfs_SetError(-EBADF);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1649
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1650 yaffsfs_Unlock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1651
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1652 return retVal;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1653
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1654 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1655
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1656
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1657 void yaffs_rewinddir(yaffs_DIR *dirp)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1658 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1659 yaffsfs_DirectorySearchContext *dsc = (yaffsfs_DirectorySearchContext *)dirp;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1660
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1661 yaffsfs_Lock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1662
81
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1663 yaffsfs_SetDirRewound(dsc);
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1664
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1665 yaffsfs_Unlock();
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1666 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1667
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1668
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1669 int yaffs_closedir(yaffs_DIR *dirp)
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1670 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1671 yaffsfs_DirectorySearchContext *dsc = (yaffsfs_DirectorySearchContext *)dirp;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1672
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1673 yaffsfs_Lock();
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1674 dsc->magic = 0;
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1675 ylist_del(&dsc->others); /* unhook from list */
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1676 YFREE(dsc);
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1677 yaffsfs_Unlock();
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1678 return 0;
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1679 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1680
81
5cb5d7aef5d7 Add support for faster yaffs direct look-ups.
charles <charles>
parents: 21
diff changeset
1681 // end of directory stuff
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1682
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1683
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1684 int yaffs_symlink(const YCHAR *oldpath, const YCHAR *newpath)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1685 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1686 yaffs_Object *parent = NULL;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1687 yaffs_Object *obj;
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1688 YCHAR *name;
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1689 int retVal= -1;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1690 int mode = 0; // ignore for now
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1691
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1692 yaffsfs_Lock();
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1693 parent = yaffsfs_FindDirectory(NULL,newpath,&name,0);
269
4107852bb3cd Change yaffs_DeleteFile to yaffs_DeleteObject and improve symlink handling
charles <charles>
parents: 225
diff changeset
1694 if(parent){
4107852bb3cd Change yaffs_DeleteFile to yaffs_DeleteObject and improve symlink handling
charles <charles>
parents: 225
diff changeset
1695 obj = yaffs_MknodSymLink(parent,name,mode,0,0,oldpath);
4107852bb3cd Change yaffs_DeleteFile to yaffs_DeleteObject and improve symlink handling
charles <charles>
parents: 225
diff changeset
1696 if(obj)
4107852bb3cd Change yaffs_DeleteFile to yaffs_DeleteObject and improve symlink handling
charles <charles>
parents: 225
diff changeset
1697 retVal = 0;
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1698 else{
269
4107852bb3cd Change yaffs_DeleteFile to yaffs_DeleteObject and improve symlink handling
charles <charles>
parents: 225
diff changeset
1699 yaffsfs_SetError(-ENOSPC); // just assume no space for now
4107852bb3cd Change yaffs_DeleteFile to yaffs_DeleteObject and improve symlink handling
charles <charles>
parents: 225
diff changeset
1700 retVal = -1;
4107852bb3cd Change yaffs_DeleteFile to yaffs_DeleteObject and improve symlink handling
charles <charles>
parents: 225
diff changeset
1701 }
4107852bb3cd Change yaffs_DeleteFile to yaffs_DeleteObject and improve symlink handling
charles <charles>
parents: 225
diff changeset
1702 } else {
4107852bb3cd Change yaffs_DeleteFile to yaffs_DeleteObject and improve symlink handling
charles <charles>
parents: 225
diff changeset
1703 yaffsfs_SetError(-EINVAL);
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1704 retVal = -1;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1705 }
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1706
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1707 yaffsfs_Unlock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1708
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1709 return retVal;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1710
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1711 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1712
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1713 int yaffs_readlink(const YCHAR *path, YCHAR *buf, int bufsiz)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1714 {
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1715 yaffs_Object *obj = NULL;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1716 int retVal;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1717
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1718
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1719 yaffsfs_Lock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1720
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1721 obj = yaffsfs_FindObject(NULL,path,0);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1722
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1723 if(!obj) {
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1724 yaffsfs_SetError(-ENOENT);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1725 retVal = -1;
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1726 } else if(obj->variantType != YAFFS_OBJECT_TYPE_SYMLINK) {
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1727 yaffsfs_SetError(-EINVAL);
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1728 retVal = -1;
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1729 } else {
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1730 YCHAR *alias = obj->variant.symLinkVariant.alias;
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1731 memset(buf,0,bufsiz);
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1732 yaffs_strncpy(buf,alias,bufsiz - 1);
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1733 retVal = 0;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1734 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1735 yaffsfs_Unlock();
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1736 return retVal;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1737 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1738
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1739 int yaffs_link(const YCHAR *oldpath, const YCHAR *newpath)
119
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1740 {
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1741 // Creates a link called newpath to existing oldpath
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1742 yaffs_Object *obj = NULL;
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1743 yaffs_Object *target = NULL;
125
05e0c45e8587 Fix trivial compiler warning
colin <colin>
parents: 123
diff changeset
1744 int retVal = 0;
326
490a804b7bd3 Change to strnlen() and strncpy() to avoid problems from unbounded strings
charles <charles>
parents: 304
diff changeset
1745 int newNameLength = 0;
119
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1746
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1747
119
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1748 yaffsfs_Lock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1749
119
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1750 obj = yaffsfs_FindObject(NULL,oldpath,0);
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1751 target = yaffsfs_FindObject(NULL,newpath,0);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1752
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1753 if(!obj) {
119
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1754 yaffsfs_SetError(-ENOENT);
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1755 retVal = -1;
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1756 } else if(target) {
119
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1757 yaffsfs_SetError(-EEXIST);
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1758 retVal = -1;
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1759 } else {
119
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1760 yaffs_Object *newdir = NULL;
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1761 yaffs_Object *link = NULL;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1762
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1763 YCHAR *newname;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1764
119
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1765 newdir = yaffsfs_FindDirectory(NULL,newpath,&newname,0);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1766
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1767 if(!newdir){
119
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1768 yaffsfs_SetError(-ENOTDIR);
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1769 retVal = -1;
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1770 }else if(newdir->myDev != obj->myDev){
119
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1771 yaffsfs_SetError(-EXDEV);
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1772 retVal = -1;
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1773 }
326
490a804b7bd3 Change to strnlen() and strncpy() to avoid problems from unbounded strings
charles <charles>
parents: 304
diff changeset
1774
490a804b7bd3 Change to strnlen() and strncpy() to avoid problems from unbounded strings
charles <charles>
parents: 304
diff changeset
1775 newNameLength = yaffs_strnlen(newname,YAFFS_MAX_NAME_LENGTH+1);
490a804b7bd3 Change to strnlen() and strncpy() to avoid problems from unbounded strings
charles <charles>
parents: 304
diff changeset
1776
490a804b7bd3 Change to strnlen() and strncpy() to avoid problems from unbounded strings
charles <charles>
parents: 304
diff changeset
1777 if(newNameLength == 0){
490a804b7bd3 Change to strnlen() and strncpy() to avoid problems from unbounded strings
charles <charles>
parents: 304
diff changeset
1778 yaffsfs_SetError(-ENOENT);
490a804b7bd3 Change to strnlen() and strncpy() to avoid problems from unbounded strings
charles <charles>
parents: 304
diff changeset
1779 retVal = -1;
490a804b7bd3 Change to strnlen() and strncpy() to avoid problems from unbounded strings
charles <charles>
parents: 304
diff changeset
1780 } else if (newNameLength > YAFFS_MAX_NAME_LENGTH){
490a804b7bd3 Change to strnlen() and strncpy() to avoid problems from unbounded strings
charles <charles>
parents: 304
diff changeset
1781 yaffsfs_SetError(-ENAMETOOLONG);
490a804b7bd3 Change to strnlen() and strncpy() to avoid problems from unbounded strings
charles <charles>
parents: 304
diff changeset
1782 retVal = -1;
490a804b7bd3 Change to strnlen() and strncpy() to avoid problems from unbounded strings
charles <charles>
parents: 304
diff changeset
1783 }
490a804b7bd3 Change to strnlen() and strncpy() to avoid problems from unbounded strings
charles <charles>
parents: 304
diff changeset
1784
490a804b7bd3 Change to strnlen() and strncpy() to avoid problems from unbounded strings
charles <charles>
parents: 304
diff changeset
1785 if(retVal == 0) {
119
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1786 link = yaffs_Link(newdir,newname,obj);
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1787 if(link)
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1788 retVal = 0;
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1789 else{
119
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1790 yaffsfs_SetError(-ENOSPC);
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1791 retVal = -1;
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1792 }
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1793
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1794 }
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1795 }
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1796 yaffsfs_Unlock();
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1797
119
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1798 return retVal;
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1799 }
e2900d249f26 Add hardlinks to yaffs direct
charles <charles>
parents: 91
diff changeset
1800
292
977b18e93f2a Add missing function, if only stubs
charles <charles>
parents: 291
diff changeset
1801 int yaffs_mknod(const YCHAR *pathname, mode_t mode, dev_t dev)
977b18e93f2a Add missing function, if only stubs
charles <charles>
parents: 291
diff changeset
1802 {
977b18e93f2a Add missing function, if only stubs
charles <charles>
parents: 291
diff changeset
1803 return -1;
977b18e93f2a Add missing function, if only stubs
charles <charles>
parents: 291
diff changeset
1804 }
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1805
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1806 int yaffs_DumpDevStruct(const YCHAR *path)
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1807 {
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1808 #if 0
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1809 YCHAR *rest;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1810
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1811 yaffs_Object *obj = yaffsfs_FindRoot(path,&rest);
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1812
304
834cd011482e Clean up code formatting
charles <charles>
parents: 292
diff changeset
1813 if(obj){
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1814 yaffs_Device *dev = obj->myDev;
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1815
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1816 printf("\n"
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1817 "nPageWrites.......... %d\n"
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1818 "nPageReads........... %d\n"
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1819 "nBlockErasures....... %d\n"
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1820 "nGCCopies............ %d\n"
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1821 "garbageCollections... %d\n"
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1822 "passiveGarbageColl'ns %d\n"
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1823 "\n",
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1824 dev->nPageWrites,
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1825 dev->nPageReads,
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1826 dev->nBlockErasures,
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1827 dev->nGCCopies,
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1828 dev->garbageCollections,
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1829 dev->passiveGarbageCollections
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1830 );
208
bf93bbcabaf8 Clean up some yaffs1 mode issues.
charles <charles>
parents: 204
diff changeset
1831
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1832 }
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1833
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 179
diff changeset
1834 #endif
1
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1835 return 0;
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1836 }
2822f1d7ce92 *** empty log message ***
charles <charles>
parents:
diff changeset
1837