• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2012, The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef _STAT_PORTABLE_H_
18 #define _STAT_PORTABLE_H_
19 
20 #include <sys/stat.h>
21 #include <string.h>
22 
23 #ifdef __LP64__
24 
25 #define __STAT64_BODY_PORTABLE \
26   unsigned long st_dev; \
27   unsigned long st_ino; \
28   unsigned int st_mode; \
29   unsigned int st_nlink; \
30   uid_t st_uid; \
31   gid_t st_gid; \
32   unsigned long st_rdev; \
33   unsigned long __pad1; \
34   long st_size; \
35   int st_blksize; \
36   int __pad2; \
37   long st_blocks; \
38   long st_atime; \
39   unsigned long st_atime_nsec; \
40   long st_mtime; \
41   unsigned long st_mtime_nsec; \
42   long st_ctime; \
43   unsigned long st_ctime_nsec; \
44   unsigned int __unused4; \
45   unsigned int __unused5; \
46   unsigned long __unused_for_largest_size; \
47 
48 
49 struct stat_portable { __STAT64_BODY_PORTABLE };
50 struct stat64_portable { __STAT64_BODY_PORTABLE };
51 
52 static inline
stat_ntop(struct stat * n_stat,struct stat_portable * p_stat)53 void stat_ntop(struct stat *n_stat, struct stat_portable *p_stat)
54 {
55     memset(p_stat, '\0', sizeof(struct stat_portable));
56     p_stat->st_dev        = n_stat->st_dev;
57     p_stat->st_ino        = n_stat->st_ino;
58     p_stat->st_mode       = n_stat->st_mode;
59     p_stat->st_nlink      = n_stat->st_nlink;
60     p_stat->st_uid        = n_stat->st_uid;
61     p_stat->st_gid        = n_stat->st_gid;
62     p_stat->st_rdev       = n_stat->st_rdev;
63     p_stat->st_size       = n_stat->st_size;
64     p_stat->st_blksize    = n_stat->st_blksize;
65     p_stat->st_blocks     = n_stat->st_blocks;
66     p_stat->st_atime      = n_stat->st_atime;
67     p_stat->st_atime_nsec = n_stat->st_atime_nsec;
68     p_stat->st_mtime      = n_stat->st_mtime;
69     p_stat->st_mtime_nsec = n_stat->st_mtime_nsec;
70     p_stat->st_ctime      = n_stat->st_ctime;
71     p_stat->st_ctime_nsec = n_stat->st_ctime_nsec;
72 }
73 
74 #else // ! __LP64__
75 
76 /* It's easy to change kernel to support stat */
77 struct stat_portable {
78     unsigned long long  st_dev;
79     unsigned char       __pad0[4];
80 
81     unsigned long       __st_ino;
82     unsigned int        st_mode;
83     unsigned int        st_nlink;
84 
85     unsigned long       st_uid;
86     unsigned long       st_gid;
87 
88     unsigned long long  st_rdev;
89     unsigned char       __pad3[4];
90 
91     unsigned char       __pad4[4];
92     long long           st_size;
93     unsigned long       st_blksize;
94     unsigned char       __pad5[4];
95     unsigned long long  st_blocks;
96 
97     unsigned long       st_atime;
98     unsigned long       st_atime_nsec;
99 
100     unsigned long       st_mtime;
101     unsigned long       st_mtime_nsec;
102 
103     unsigned long       st_ctime;
104     unsigned long       st_ctime_nsec;
105 
106     unsigned long long  st_ino;
107 };
108 
109 /*
110 The X86 Version is
111 struct stat {
112     unsigned long long  st_dev;
113     unsigned char       __pad0[4];
114 
115     unsigned long       __st_ino;
116     unsigned int        st_mode;
117     unsigned int        st_nlink;
118 
119     unsigned long       st_uid;
120     unsigned long       st_gid;
121 
122     unsigned long long  st_rdev;
123     unsigned char       __pad3[4];
124 
125     long long           st_size;
126     unsigned long       st_blksize;
127     unsigned long long  st_blocks;
128 
129     unsigned long       st_atime;
130     unsigned long       st_atime_nsec;
131 
132     unsigned long       st_mtime;
133     unsigned long       st_mtime_nsec;
134 
135     unsigned long       st_ctime;
136     unsigned long       st_ctime_nsec;
137 
138     unsigned long long  st_ino;
139 };
140 */
141 
142 /*
143 The MIPS Version is
144 struct stat {
145     unsigned long       st_dev;
146     unsigned long       __pad0[3];
147 
148     unsigned long long  st_ino;
149 
150     unsigned int        st_mode;
151     unsigned int        st_nlink;
152 
153     unsigned long       st_uid;
154     unsigned long       st_gid;
155 
156     unsigned long       st_rdev;
157     unsigned long       __pad1[3];
158 
159     long long           st_size;
160 
161     unsigned long       st_atime;
162     unsigned long       st_atime_nsec;
163 
164     unsigned long       st_mtime;
165     unsigned long       st_mtime_nsec;
166 
167     unsigned long       st_ctime;
168     unsigned long       st_ctime_nsec;
169 
170     unsigned long       st_blksize;
171     unsigned long       __pad2;
172 
173     unsigned long long  st_blocks;
174 };
175 */
176 
stat_ntop(struct stat * n_stat,struct stat_portable * p_stat)177 static inline void stat_ntop(struct stat *n_stat, struct stat_portable *p_stat)
178 {
179     memset(p_stat, '\0', sizeof(struct stat_portable));
180     p_stat->st_dev        = n_stat->st_dev;
181 #if defined(__mips__)
182     /* MIPS doesn't have __st_ino */
183     p_stat->__st_ino      = 0;
184 #else
185     p_stat->__st_ino      = n_stat->__st_ino;
186 #endif
187     p_stat->st_mode       = n_stat->st_mode;
188     p_stat->st_nlink      = n_stat->st_nlink;
189     p_stat->st_uid        = n_stat->st_uid;
190     p_stat->st_gid        = n_stat->st_gid;
191     p_stat->st_rdev       = n_stat->st_rdev;
192     p_stat->st_size       = n_stat->st_size;
193     p_stat->st_blksize    = n_stat->st_blksize;
194     p_stat->st_blocks     = n_stat->st_blocks;
195     p_stat->st_atime      = n_stat->st_atime;
196     p_stat->st_atime_nsec = n_stat->st_atime_nsec;
197     p_stat->st_mtime      = n_stat->st_mtime;
198     p_stat->st_mtime_nsec = n_stat->st_mtime_nsec;
199     p_stat->st_ctime      = n_stat->st_ctime;
200     p_stat->st_ctime_nsec = n_stat->st_ctime_nsec;
201     p_stat->st_ino        = n_stat->st_ino;
202 }
203 
204 #endif // __LP64__
205 
206 #endif /* _STAT_PORTABLE_H */
207