Repository navigation
Expand file tree
/
Copy pathfs_8h_source.html
More file actions
336 lines (334 loc) · 43.8 KB
/
Copy pathfs_8h_source.html
File metadata and controls
336 lines (334 loc) · 43.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.9.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Tenok: include/fs/fs.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="logo-small.png"/></td>
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">Tenok
</div>
<div id="projectbrief">A Linux-like Real-Time Operating System for Robotics and Internet of Things</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.1 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_d44c64559bbebec7f509842c48db8b23.html">include</a></li><li class="navelem"><a class="el" href="dir_203f267fac8cf3dfe9f5770a10d988c8.html">fs</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">fs.h</div> </div>
</div><!--header-->
<div class="contents">
<a href="fs_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>  </div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="preprocessor">#ifndef __FS_H__</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="preprocessor">#define __FS_H__</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  </div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="preprocessor">#include <<a class="code" href="dirent_8h.html">dirent.h</a>></span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="preprocessor">#include <stdbool.h></span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="preprocessor">#include <stddef.h></span></div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="preprocessor">#include <stdint.h></span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="preprocessor">#include <string.h></span></div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="preprocessor">#include <<a class="code" href="stat_8h.html">sys/stat.h</a>></span></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="preprocessor">#include <<a class="code" href="types_8h.html">sys/types.h</a>></span></div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="preprocessor">#include <<a class="code" href="tenok_2time_8h.html">time.h</a>></span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  </div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="preprocessor">#include <<a class="code" href="list_8h.html">common/list.h</a>></span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="preprocessor">#include <<a class="code" href="kernel_2time_8h.html">kernel/time.h</a>></span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#include <<a class="code" href="kernel_2wait_8h.html">kernel/wait.h</a>></span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>  </div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="preprocessor">#include "kconfig.h"</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  </div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="preprocessor">#define RDEV_ROOTFS 0</span></div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  </div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment">/* Mode of a new file, the one a Linux system gives under a umask of 022 */</span></div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="preprocessor">#define FS_DEFAULT_FILE_MODE 0644</span></div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="preprocessor">#define FS_DEFAULT_DIR_MODE 0755</span></div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  </div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="comment">/* Withheld from the mode a task asks for, which is what turns the 0666 of</span></div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span> <span class="comment"> * an ordinary creation into the 0644 of an ordinary file</span></div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="comment"> */</span></div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="preprocessor">#define FS_DEFAULT_UMASK 022</span></div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  </div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="comment">/* Every thread has a pipe the file system daemon answers it through. It is</span></div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="comment"> * reached by the thread that owns it and by the daemon, never by a program,</span></div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="comment"> * so it carries no descriptor number</span></div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span class="comment"> */</span></div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span> <span class="keyword">extern</span> <span class="keyword">struct </span><a class="code" href="structfile.html">file</a> *thread_pipe[THREAD_MAX];</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  </div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <span class="comment">/* +---------------------------+</span></div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span> <span class="comment"> * | File table layout |</span></div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <span class="comment"> * +-----------+---------------+</span></div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="comment"> * | 0 | stdin |</span></div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span class="comment"> * +-----------+---------------+</span></div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span> <span class="comment"> * | 1 | stdout |</span></div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <span class="comment"> * +-----------+---------------+</span></div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span> <span class="comment"> * | 2 | stderr |</span></div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span> <span class="comment"> * +-----------+---------------+</span></div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span> <span class="comment"> * | 3 | File 1 |</span></div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span> <span class="comment"> * +-----------+---------------+</span></div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span> <span class="comment"> * | ... | ... |</span></div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <span class="comment"> * +-----------+---------------+</span></div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span> <span class="comment"> * | M + 2 | File M |</span></div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span> <span class="comment"> * +-----------+---------------+</span></div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span> <span class="comment"> *</span></div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span> <span class="comment"> * M = OPEN_MAX</span></div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span> <span class="comment"> */</span></div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  </div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span> <span class="keyword">typedef</span> void (*drv_init_func_t)(void);</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  </div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span> <span class="keyword">enum</span> {</div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  FS_CREATE_FILE = 1,</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  FS_OPEN_FILE = 2,</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  FS_OPEN_DIR = 3,</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  FS_MOUNT = 4,</div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  FS_GET_CWD = 5,</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  FS_CHANGE_DIR = 6,</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  FS_MAKE_DIR = 7,</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  FS_REMOVE = 8,</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  FS_STAT = 9,</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  FS_RENAME = 10,</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  FS_CHANGE_MODE = 11,</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  FS_CHANGE_TIME = 12,</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span> } FS_SERVER_CMDS;</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  </div>
<div class="line"><a name="l00075"></a><span class="lineno"><a class="line" href="structsuper__block.html"> 75</a></span> <span class="keyword">struct </span><a class="code" href="structsuper__block.html">super_block</a> {</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  <span class="keywordtype">bool</span> s_rd_only; <span class="comment">/* Read-only flag */</span></div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  uint32_t s_blk_cnt; <span class="comment">/* number of the used blocks */</span></div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  uint32_t s_inode_cnt; <span class="comment">/* number of the used inodes */</span></div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  uint64_t s_sb_addr; <span class="comment">/* Start address of the super block */</span></div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  uint64_t s_ino_addr; <span class="comment">/* Start address of the inode table */</span></div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  uint64_t s_blk_addr; <span class="comment">/* Start address of the blocks region */</span></div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span> };</div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  </div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span> <span class="comment">/* Block header will be placed at the top of every blocks of regular files */</span></div>
<div class="line"><a name="l00085"></a><span class="lineno"><a class="line" href="structblock__header.html"> 85</a></span> <span class="keyword">struct </span><a class="code" href="structblock__header.html">block_header</a> {</div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  <span class="comment">/* Virtual address of the next block */</span></div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  uint32_t b_next;</div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  uint32_t reserved;</div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span> };</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  </div>
<div class="line"><a name="l00091"></a><span class="lineno"><a class="line" href="structmount.html"> 91</a></span> <span class="keyword">struct </span><a class="code" href="structmount.html">mount</a> {</div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  <span class="keyword">struct </span><a class="code" href="structfile.html">file</a> *dev_file; <span class="comment">/* Driver file of the mounted device */</span></div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  <span class="keyword">struct </span><a class="code" href="structsuper__block.html">super_block</a> super_blk; <span class="comment">/* Super block of the mounted device */</span></div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span> };</div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  </div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span> <span class="comment">/* index node */</span></div>
<div class="line"><a name="l00097"></a><span class="lineno"><a class="line" href="structinode.html"> 97</a></span> <span class="keyword">struct </span><a class="code" href="structinode.html">inode</a> {</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  <span class="comment">/* File type and permission bits: S_IFREG | 0644, and so on */</span></div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  uint16_t i_mode;</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <span class="comment">/* The device on which the file is mounted */</span></div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  uint8_t i_rdev;</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  <span class="comment">/* The mounted file is loaded into the rootfs or not */</span></div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <span class="keywordtype">bool</span> i_sync;</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  <span class="comment">/* inode number */</span></div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  uint32_t i_ino;</div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <span class="comment">/* inode number of the parent directory */</span></div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  uint32_t i_parent;</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  <span class="comment">/* File descriptor number */</span></div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  uint32_t i_fd;</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <span class="comment">/* File size (bytes) */</span></div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  uint32_t i_size;</div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  <span class="comment">/* block_numbers = file_size / (block_size - block_header_size) */</span></div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  uint32_t i_blocks;</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  <span class="comment">/* Virtual address for accessing the storage */</span></div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  uint32_t i_data;</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <span class="comment">/* List head of the dentry table */</span></div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  <span class="keyword">struct </span><a class="code" href="structlist__head.html">list_head</a> i_dentry;</div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  <span class="comment">/* Seconds since the epoch, last written. Thirty two of them reach 2106 */</span></div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  uint32_t i_mtime;</div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  uint32_t reserved[2];</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span> };</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  </div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span> <span class="comment">/* Directory entry */</span></div>
<div class="line"><a name="l00124"></a><span class="lineno"><a class="line" href="structdentry.html"> 124</a></span> <span class="keyword">struct </span><a class="code" href="structdentry.html">dentry</a> {</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  <span class="comment">/* File name */</span></div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  <span class="keywordtype">char</span> d_name[NAME_MAX];</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  <span class="comment">/* The inode of the file */</span></div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  uint32_t d_inode;</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  <span class="comment">/* The inode of the parent directory */</span></div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  uint32_t d_parent;</div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  <span class="comment">/* List head of the dentry */</span></div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  <span class="keyword">struct </span><a class="code" href="structlist__head.html">list_head</a> d_list;</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  uint32_t reserved[2];</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span> };</div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  </div>
<div class="line"><a name="l00136"></a><span class="lineno"><a class="line" href="structfile.html"> 136</a></span> <span class="keyword">struct </span><a class="code" href="structfile.html">file</a> {</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  <span class="keyword">struct </span><a class="code" href="structinode.html">inode</a> *f_inode;</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  <span class="keyword">struct </span><a class="code" href="structfile__operations.html">file_operations</a> *f_op;</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  uint32_t f_events;</div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  <span class="keywordtype">int</span> f_flags;</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  <span class="comment">/* Where the next read or write starts. A regular file keeps its own</span></div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span> <span class="comment"> * position in struct reg_file and ignores this one; it is what gives a</span></div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span> <span class="comment"> * device file, /dev/rom for instance, a position of its own.</span></div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span> <span class="comment"> */</span></div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  off_t f_pos;</div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  <span class="keyword">struct </span><a class="code" href="structlist__head.html">list_head</a> list;</div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span> };</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  </div>
<div class="line"><a name="l00149"></a><span class="lineno"><a class="line" href="structfile__operations.html"> 149</a></span> <span class="keyword">struct </span><a class="code" href="structfile__operations.html">file_operations</a> {</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  off_t (*lseek)(<span class="keyword">struct </span><a class="code" href="structfile.html">file</a> *filp, off_t offset, <span class="keywordtype">int</span> whence);</div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  ssize_t (*<a class="code" href="unistd_8h.html#af32a16ad2dd9e48482f8f790db7dbbd2">read</a>)(<span class="keyword">struct </span><a class="code" href="structfile.html">file</a> *filp, <span class="keywordtype">char</span> *buf, <span class="keywordtype">size_t</span> size, off_t offset);</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  ssize_t (*<a class="code" href="unistd_8h.html#abb39b21888372e95ad3e5c59b166f5c8">write</a>)(<span class="keyword">struct </span><a class="code" href="structfile.html">file</a> *filp,</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *buf,</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  <span class="keywordtype">size_t</span> size,</div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  off_t offset);</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  int (*<a class="code" href="ioctl_8h.html#a1487536105f7a596481bf6bfa8de99f6">ioctl</a>)(<span class="keyword">struct </span><a class="code" href="structfile.html">file</a> *, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> cmd, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> arg);</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  int (*<a class="code" href="fcntl_8h.html#a079d60801c18155ac2ec1707b56867fb">open</a>)(<span class="keyword">struct </span><a class="code" href="structinode.html">inode</a> *<a class="code" href="structinode.html">inode</a>, <span class="keyword">struct </span><a class="code" href="structfile.html">file</a> *<a class="code" href="structfile.html">file</a>);</div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span> };</div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  </div>
<div class="line"><a name="l00160"></a><span class="lineno"><a class="line" href="structfdtable.html"> 160</a></span> <span class="keyword">struct </span><a class="code" href="structfdtable.html">fdtable</a> {</div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <span class="comment">/* The flags the file was opened with */</span></div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  <span class="keywordtype">int</span> flags;</div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  <span class="comment">/* The flags of the descriptor itself, which is FD_CLOEXEC and nothing</span></div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span> <span class="comment"> * else. They are kept apart from the ones above because FD_CLOEXEC and</span></div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span> <span class="comment"> * O_WRONLY are both one, and a descriptor would otherwise report the</span></div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span> <span class="comment"> * access mode as the close on exec bit and lose it when the bit is set.</span></div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span> <span class="comment"> */</span></div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  <span class="keywordtype">int</span> fd_flags;</div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  <span class="keyword">struct </span><a class="code" href="structfile.html">file</a> *<a class="code" href="structfile.html">file</a>;</div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span> };</div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  </div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span> <span class="keywordtype">void</span> rootfs_init(<span class="keywordtype">void</span>);</div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  </div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span> <span class="keywordtype">void</span> link_stdin_dev(<span class="keywordtype">char</span> *path);</div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span> <span class="keywordtype">void</span> link_stdout_dev(<span class="keywordtype">char</span> *path);</div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span> <span class="keywordtype">void</span> link_stderr_dev(<span class="keywordtype">char</span> *path);</div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  </div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span> <span class="keywordtype">int</span> register_chrdev(<span class="keywordtype">char</span> *name, <span class="keyword">struct</span> <a class="code" href="structfile__operations.html">file_operations</a> *fops);</div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span> <span class="keywordtype">int</span> register_blkdev(<span class="keywordtype">char</span> *name, <span class="keyword">struct</span> <a class="code" href="structfile__operations.html">file_operations</a> *fops);</div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  </div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span> <span class="keywordtype">bool</span> file_is_opened(<span class="keyword">struct</span> <a class="code" href="structfile.html">file</a> *filp);</div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  </div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span> <span class="keywordtype">int</span> fs_read_dir(<a class="code" href="structdirstream.html">DIR</a> *dirp, <span class="keyword">struct</span> <a class="code" href="structdirent.html">dirent</a> *<a class="code" href="structdirent.html">dirent</a>);</div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span> uint32_t fs_get_block_addr(<span class="keyword">struct</span> <a class="code" href="structinode.html">inode</a> *<a class="code" href="structinode.html">inode</a>, <span class="keywordtype">int</span> blk_index);</div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span> uint32_t fs_file_append_block(<span class="keyword">struct</span> <a class="code" href="structinode.html">inode</a> *<a class="code" href="structinode.html">inode</a>);</div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  </div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span> <span class="comment">/* What an inode stamps itself with. The clock reads zero until it is set */</span></div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span> <span class="keyword">static</span> <span class="keyword">inline</span> uint32_t fs_now(<span class="keywordtype">void</span>)</div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span> {</div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  <span class="keyword">struct </span><a class="code" href="structtimespec.html">timespec</a> tp;</div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  </div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  get_sys_time(&tp);</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  </div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <span class="keywordflow">return</span> (uint32_t) tp.tv_sec;</div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span> }</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  </div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span> <span class="comment">/* Fill in a stat buffer from an inode. Tenok tracks no ownership and no link</span></div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span> <span class="comment"> * count, so those fields read back as zero</span></div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span> <span class="comment"> */</span></div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> fs_fill_stat(<span class="keyword">struct</span> <a class="code" href="structstat.html">stat</a> *statbuf, <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structinode.html">inode</a> *<a class="code" href="structinode.html">inode</a>)</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span> {</div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  memset(statbuf, 0, <span class="keyword">sizeof</span>(*statbuf));</div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  </div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  statbuf->st_dev = <a class="code" href="structinode.html">inode</a>->i_rdev;</div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  statbuf->st_ino = <a class="code" href="structinode.html">inode</a>->i_ino;</div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  statbuf->st_mode = <a class="code" href="structinode.html">inode</a>->i_mode;</div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  statbuf->st_nlink = 1;</div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  statbuf->st_rdev = <a class="code" href="structinode.html">inode</a>->i_rdev;</div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  statbuf->st_size = <a class="code" href="structinode.html">inode</a>->i_size;</div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  statbuf->st_blksize = FS_BLK_SIZE;</div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  statbuf->st_blocks = <a class="code" href="structinode.html">inode</a>->i_blocks;</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  statbuf->st_mtim.tv_sec = <a class="code" href="structinode.html">inode</a>->i_mtime;</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span> }</div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  </div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span> <span class="keywordtype">void</span> request_create_file(<span class="keywordtype">int</span> thread_id, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, mode_t mode);</div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span> <span class="keywordtype">void</span> request_mkdir(<span class="keywordtype">int</span> thread_id, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, mode_t mode);</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span> <span class="keywordtype">void</span> request_chmod(<span class="keywordtype">int</span> thread_id, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, mode_t mode);</div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span> <span class="keywordtype">void</span> request_utime(<span class="keywordtype">int</span> thread_id, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, uint32_t mtime);</div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span> <span class="keywordtype">void</span> request_remove(<span class="keywordtype">int</span> thread_id, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, <span class="keywordtype">bool</span> rm_dir);</div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span> <span class="keywordtype">void</span> request_stat(<span class="keywordtype">int</span> thread_id, <span class="keyword">const</span> <span class="keywordtype">char</span> *path, <span class="keyword">struct</span> <a class="code" href="structstat.html">stat</a> *statbuf);</div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span> <span class="keywordtype">void</span> request_rename(<span class="keywordtype">int</span> thread_id, <span class="keyword">const</span> <span class="keywordtype">char</span> *oldpath, <span class="keyword">const</span> <span class="keywordtype">char</span> *newpath);</div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span> <span class="keywordtype">void</span> request_open_file(<span class="keywordtype">int</span> thread_id, <span class="keyword">const</span> <span class="keywordtype">char</span> *path);</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span> <span class="keywordtype">void</span> request_open_directory(<span class="keywordtype">int</span> reply_fd, <span class="keyword">const</span> <span class="keywordtype">char</span> *path);</div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span> <span class="keywordtype">void</span> request_mount(<span class="keywordtype">int</span> thread_id, <span class="keyword">const</span> <span class="keywordtype">char</span> *source, <span class="keyword">const</span> <span class="keywordtype">char</span> *target);</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span> <span class="keywordtype">void</span> request_getcwd(<span class="keywordtype">int</span> thread_id, <span class="keywordtype">char</span> *buf, <span class="keywordtype">size_t</span> len);</div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span> <span class="keywordtype">void</span> request_chdir(<span class="keywordtype">int</span> thread_id, <span class="keyword">const</span> <span class="keywordtype">char</span> *path);</div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  </div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span> <span class="keywordtype">void</span> filesysd(<span class="keywordtype">void</span>);</div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  </div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span> <span class="keywordtype">void</span> <a class="code" href="fs_8h.html#ac631d919599bc9f992d2827f18fa53c6">fs_print_inode_bitmap</a>(<span class="keywordtype">void</span>);</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span> <span class="keywordtype">void</span> fs_print_block_bitmap(<span class="keywordtype">void</span>);</div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  </div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span> <span class="preprocessor">#endif</span></div>
<div class="ttc" id="adirent_8h_html"><div class="ttname"><a href="dirent_8h.html">dirent.h</a></div></div>
<div class="ttc" id="afcntl_8h_html_a079d60801c18155ac2ec1707b56867fb"><div class="ttname"><a href="fcntl_8h.html#a079d60801c18155ac2ec1707b56867fb">open</a></div><div class="ttdeci">int open(const char *pathname, int flags,...)</div><div class="ttdoc">Open the file specified by the pathname.</div><div class="ttdef"><b>Definition:</b> file.c:36</div></div>
<div class="ttc" id="afs_8h_html_ac631d919599bc9f992d2827f18fa53c6"><div class="ttname"><a href="fs_8h.html#ac631d919599bc9f992d2827f18fa53c6">fs_print_inode_bitmap</a></div><div class="ttdeci">void fs_print_inode_bitmap(void)</div><div class="ttdef"><b>Definition:</b> fs.c:1772</div></div>
<div class="ttc" id="aioctl_8h_html_a1487536105f7a596481bf6bfa8de99f6"><div class="ttname"><a href="ioctl_8h.html#a1487536105f7a596481bf6bfa8de99f6">ioctl</a></div><div class="ttdeci">int ioctl(int fd, unsigned long request,...)</div><div class="ttdoc">Perform device-specific control.</div><div class="ttdef"><b>Definition:</b> file.c:147</div></div>
<div class="ttc" id="akernel_2time_8h_html"><div class="ttname"><a href="kernel_2time_8h.html">time.h</a></div></div>
<div class="ttc" id="akernel_2wait_8h_html"><div class="ttname"><a href="kernel_2wait_8h.html">wait.h</a></div></div>
<div class="ttc" id="alist_8h_html"><div class="ttname"><a href="list_8h.html">list.h</a></div></div>
<div class="ttc" id="astat_8h_html"><div class="ttname"><a href="stat_8h.html">stat.h</a></div></div>
<div class="ttc" id="astructblock__header_html"><div class="ttname"><a href="structblock__header.html">block_header</a></div><div class="ttdef"><b>Definition:</b> fs.h:85</div></div>
<div class="ttc" id="astructdentry_html"><div class="ttname"><a href="structdentry.html">dentry</a></div><div class="ttdef"><b>Definition:</b> fs.h:124</div></div>
<div class="ttc" id="astructdirent_html"><div class="ttname"><a href="structdirent.html">dirent</a></div><div class="ttdef"><b>Definition:</b> dirent.h:29</div></div>
<div class="ttc" id="astructdirstream_html"><div class="ttname"><a href="structdirstream.html">dirstream</a></div><div class="ttdef"><b>Definition:</b> dirent.h:36</div></div>
<div class="ttc" id="astructfdtable_html"><div class="ttname"><a href="structfdtable.html">fdtable</a></div><div class="ttdef"><b>Definition:</b> fs.h:160</div></div>
<div class="ttc" id="astructfile__operations_html"><div class="ttname"><a href="structfile__operations.html">file_operations</a></div><div class="ttdef"><b>Definition:</b> fs.h:149</div></div>
<div class="ttc" id="astructfile_html"><div class="ttname"><a href="structfile.html">file</a></div><div class="ttdef"><b>Definition:</b> fs.h:136</div></div>
<div class="ttc" id="astructinode_html"><div class="ttname"><a href="structinode.html">inode</a></div><div class="ttdef"><b>Definition:</b> fs.h:97</div></div>
<div class="ttc" id="astructlist__head_html"><div class="ttname"><a href="structlist__head.html">list_head</a></div><div class="ttdef"><b>Definition:</b> list.h:111</div></div>
<div class="ttc" id="astructmount_html"><div class="ttname"><a href="structmount.html">mount</a></div><div class="ttdef"><b>Definition:</b> fs.h:91</div></div>
<div class="ttc" id="astructstat_html"><div class="ttname"><a href="structstat.html">stat</a></div><div class="ttdef"><b>Definition:</b> stat.h:46</div></div>
<div class="ttc" id="astructsuper__block_html"><div class="ttname"><a href="structsuper__block.html">super_block</a></div><div class="ttdef"><b>Definition:</b> fs.h:75</div></div>
<div class="ttc" id="astructtimespec_html"><div class="ttname"><a href="structtimespec.html">timespec</a></div><div class="ttdef"><b>Definition:</b> time.h:16</div></div>
<div class="ttc" id="atenok_2time_8h_html"><div class="ttname"><a href="tenok_2time_8h.html">time.h</a></div></div>
<div class="ttc" id="atypes_8h_html"><div class="ttname"><a href="types_8h.html">types.h</a></div></div>
<div class="ttc" id="aunistd_8h_html_abb39b21888372e95ad3e5c59b166f5c8"><div class="ttname"><a href="unistd_8h.html#abb39b21888372e95ad3e5c59b166f5c8">write</a></div><div class="ttdeci">ssize_t write(int fd, const void *buf, size_t count)</div><div class="ttdoc">Write up to count bytes from the buffer starting at buf to the file referred to by the file descripto...</div><div class="ttdef"><b>Definition:</b> file.c:132</div></div>
<div class="ttc" id="aunistd_8h_html_af32a16ad2dd9e48482f8f790db7dbbd2"><div class="ttname"><a href="unistd_8h.html#af32a16ad2dd9e48482f8f790db7dbbd2">read</a></div><div class="ttdeci">ssize_t read(int fd, void *buf, size_t count)</div><div class="ttdoc">Attempt to read up to count bytes from file descriptor fd into the buffer starting at buf.</div><div class="ttdef"><b>Definition:</b> file.c:117</div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
</small></address>
</body>
</html>