108 return; |
108 return; |
109 |
109 |
110 error: |
110 error: |
111 if ((err = fuse_reply_err(req, err))) |
111 if ((err = fuse_reply_err(req, err))) |
112 EWARNING(err, "fuse_reply_err"); |
112 EWARNING(err, "fuse_reply_err"); |
|
113 } |
|
114 |
|
115 static void simple_readlink (fuse_req_t req, fuse_ino_t ino) { |
|
116 struct simple_fs *fs = fuse_req_userdata(req); |
|
117 const struct simple_node *node; |
|
118 int err; |
|
119 |
|
120 INFO("[simple.readlink %p] ino=%lu", fs, ino); |
|
121 |
|
122 // look up the node |
|
123 if ((node = _simple_get_ino(fs, ino)) == NULL) |
|
124 EERROR(err = EINVAL, "bad inode"); |
|
125 |
|
126 // check that it's a symlink |
|
127 if (node->mode_type != S_IFLNK) |
|
128 EERROR(err = EINVAL, "bad mode"); |
|
129 |
|
130 // return the contents |
|
131 if ((err = fuse_reply_readlink(req, node->data))) |
|
132 EERROR(err, "fuse_reply_readlink"); |
|
133 |
|
134 // suceccss |
|
135 return; |
|
136 |
|
137 error: |
|
138 if ((err = fuse_reply_err(req, err))) |
|
139 EWARNING(err, "fuse_reply_err"); |
|
140 |
113 } |
141 } |
114 |
142 |
115 static void simple_readdir (fuse_req_t req, fuse_ino_t ino, size_t size, off_t off, struct fuse_file_info *fi) { |
143 static void simple_readdir (fuse_req_t req, fuse_ino_t ino, size_t size, off_t off, struct fuse_file_info *fi) { |
116 struct simple_fs *fs = fuse_req_userdata(req); |
144 struct simple_fs *fs = fuse_req_userdata(req); |
117 const struct simple_node *dir_node, *node; |
145 const struct simple_node *dir_node, *node; |
212 static struct fuse_lowlevel_ops simple_ops = { |
240 static struct fuse_lowlevel_ops simple_ops = { |
213 .lookup = simple_lookup, |
241 .lookup = simple_lookup, |
214 |
242 |
215 .getattr = simple_getattr, |
243 .getattr = simple_getattr, |
216 |
244 |
|
245 .readlink = simple_readlink, |
|
246 |
217 .readdir = simple_readdir, |
247 .readdir = simple_readdir, |
218 |
248 |
219 .read = simple_read, |
249 .read = simple_read, |
220 }; |
250 }; |
221 |
251 |